首页 > 解决方案 > 将 xmm 浮点寄存器截断为 64 位寄存器

问题描述

如标题所述,我想将其中一个寄存器中的浮点数截断为xmm64 位寄存器。下面我将 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"

标签: floating-pointx86-64ssetruncatefloating-point-conversion

解决方案


ss是标量精度。double您正在转换' 尾数的低 32 位。作为 binary32 位模式,它表示一个小数或正好为零。此外,如果您想截断而不是四舍五入到最近,请使用截断转换(额外的t)。 https://www.felixcloutier.com/x86/cvttsd2sicvttsd2si rdi, xmm0

当然,xmm 寄存器在 x86-64 System V 中是 call-clobbered 的,所以在 printf 返回后立即读取 XMM0 是没有意义的。


推荐阅读