gpt4 book ai didi

assembly - 是否有 x87 FILD 和 SSE CVTSI2SD 指令的无符号等效指令?

转载 作者:行者123 更新时间:2023-12-02 09:11:16 25 4
gpt4 key购买 nike

我想在 GHC Haskell 编译器中实现 C 的 uint-to-double 转换的等效功能。我们已经使用 FILDCVTSI2SD 实现了 int-to-double。这些操作是否存在无符号版本,或者我是否应该在转换之前将 uint 的最高位清零(从而失去范围)?

最佳答案

正如有人所说,“优秀的艺术家复制;伟大的艺术家窃取”。所以我们可以看看其他编译器作者是如何解决这个问题的。我使用了一个简单的片段:

volatile unsigned int x;
int main()
{
volatile double y = x;
return y;
}

(添加 volatile 以确保编译器不会优化转换)

结果(跳过不相关的说明):

Visual C++ 2010 cl/Ox (x86)

  __real@41f0000000000000 DQ 041f0000000000000r ; 4.29497e+009

mov eax, DWORD PTR ?x@@3IC ; x
fild DWORD PTR ?x@@3IC ; x
test eax, eax
jns SHORT $LN4@main
fadd QWORD PTR __real@41f0000000000000
$LN4@main:
fstp QWORD PTR _y$[esp+8]

所以基本上编译器会添加一个调整值,以防符号位被设置。

Visual C++ 2010 cl/Ox (x64)

  mov   eax, DWORD PTR ?x@@3IC          ; x
pxor xmm0, xmm0
cvtsi2sd xmm0, rax
movsdx QWORD PTR y$[rsp], xmm0

此处无需调整,因为编译器知道 rax 会将符号位清除。

Visual C++ 2012 cl/Ox

  __xmm@41f00000000000000000000000000000 DB 00H, 00H, 00H, 00H, 00H, 00H, 00H
DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 0f0H, 'A'

mov eax, DWORD PTR ?x@@3IC ; x
movd xmm0, eax
cvtdq2pd xmm0, xmm0
shr eax, 31 ; 0000001fH
addsd xmm0, QWORD PTR __xmm@41f00000000000000000000000000000[eax*8]
movsd QWORD PTR _y$[esp+8], xmm0

这使用无分支代码添加 0 或魔法调整,具体取决于符号位是否被清除或设置。

关于assembly - 是否有 x87 FILD 和 SSE CVTSI2SD 指令的无符号等效指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13734191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com