floating-point - 将 xmm 浮点寄存器截断为 64 位寄存器
问题描述
如标题所述,我想将其中一个寄存器中的浮点数截断为xmm
64 位寄存器。下面我将 15.9 除以 4.95。我正在打印它,我看到结果是正确的(3.212121)。但是,当使用cvtss2si
截断它时,rdi
以某种方式变为零。我不知道为什么。当我期望结果为 3 时,为什么这不能正确截断?我正在使用 Clang 组装 macOS。
.global _main
.text
_main:
movsd xmm0, qword ptr [dividend + rip]
divsd xmm0, qword ptr [divisor + rip]
movsd [result + rip], xmm0
lea rdi, [frm + rip]
movsd xmm0, qword ptr [result + rip]
mov al, 1
and rsp, -16
call _printf
cvtss2si rdi, xmm0 # expecting 3, is 0
mov rax, 0x2000001
syscall
.data
dividend:
.quad 15.9
divisor:
.quad 4.95
result:
.quad 0.0
frm:
.asciz "%f\n"
解决方案
ss
是标量单精度。double
您正在转换' 尾数的低 32 位。作为 binary32 位模式,它表示一个小数或正好为零。此外,如果您想截断而不是四舍五入到最近,请使用截断转换(额外的t
)。 https://www.felixcloutier.com/x86/cvttsd2si。cvttsd2si rdi, xmm0
当然,xmm 寄存器在 x86-64 System V 中是 call-clobbered 的,所以在 printf 返回后立即读取 XMM0 是没有意义的。
推荐阅读
- angular - 故事书角度抛出错误,因为未定义“req”
- python - 使用 pyqt5 gui 进行线程处理,在处理时显示加载 gif
- javascript - Typescript 中的比较器,用于对数组进行自定义排序
- sql-server - 为什么 varchar 大小会影响查询性能?
- c++ - 如何修复循环中的错误产生的错误结果?
- reactjs - axios > Express.router – Update(.put) 方法返回 404
- windows - Perl:如何组合连续的页码?
- checkbox - Vaadin 7 -> com.vaadin.ui.CheckBox -> ".getValue()" 总是返回 "false"
- java - java.lang.UnsupportedOperationException:空
- django - 如何在 html 页面中对 sql 查询结果进行分页?