作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在 GHC Haskell 编译器中实现 C 的 uint
-to-double
转换的等效功能。我们已经使用 FILD
或 CVTSI2SD
实现了 int
-to-double
。这些操作是否存在无符号版本,或者我是否应该在转换之前将 uint 的最高位清零(从而失去范围)?
最佳答案
正如有人所说,“优秀的艺术家复制;伟大的艺术家窃取”。所以我们可以看看其他编译器作者是如何解决这个问题的。我使用了一个简单的片段:
volatile unsigned int x;
int main()
{
volatile double y = x;
return y;
}
(添加 volatile 以确保编译器不会优化转换)
结果(跳过不相关的说明):
__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]
所以基本上编译器会添加一个调整值,以防符号位被设置。
mov eax, DWORD PTR ?x@@3IC ; x
pxor xmm0, xmm0
cvtsi2sd xmm0, rax
movsdx QWORD PTR y$[rsp], xmm0
此处无需调整,因为编译器知道 rax
会将符号位清除。
__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/
我是一名优秀的程序员,十分优秀!