基于 vcmpsd 结果的分支

Branch based on the results of vcmpsd

提问人:RTC222 提问时间:11/17/2023 最后编辑:Peter CordesRTC222 更新时间:11/17/2023 访问量:29

问:

以下是 NASM 代码的一小部分:

vpxor xmm3,xmm3,xmm3
vmovsd xmm0,[rdi+rcx]
vmovsd xmm1,[rsi+rcx]
vsubsd xmm2,xmm0,xmm1
vcmpsd xmm4,xmm2,xmm3,0
je c_this

c_not_this:
mov rax,0
c_this:
mov rax,0

在前两行中,我移动两个数字(双精度)以比较为 xmm0 和 xmm1。在这种情况下,它们是相等的。接下来我减去它们,xmm2 的结果为零。最后,我将减法的结果与零进行比较,我希望 xmm4 为零,但事实并非如此:

(gdb) p $xmm4.v2_double
$3 = {-nan(0xfffffffffffff), 0}

因此,在 xmm4 中比较的结果是 -nan(0xfffffffffffff)。在分支语句中,它不会跳转到c_this,因此 -nan 不会被视为零。

作为一个更普遍的问题,我如何对 vcmpsd 的结果进行分支?该指令显然不会影响标志。令人惊讶的是,互联网上关于这方面的信息很少。

程序集 NASM SSE AVX

评论

3赞 Peter Cordes 11/17/2023
为什么要使用标量 compare+branch?您是否还想要将 1 元素蒙版用于其他用途?如果是这样,请使用掩码的低位。如果您只想在两个 s 上进行比较/分支,请使用 或 设置整数 FLAGS,就像编译器一样。 (godbolt.org 并查看编译器输出 - 任何时候你想知道做一些简单事情的正常方法是什么,请询问编译器。vcmpsdmovmskpdtestdoubleucomisdcomisdif (d1 == d2) dummy = 0;
0赞 Peter Cordes 11/18/2023
对于比较 s: stackoverflow.com/questions/9558200/... 的 XY 问题重复(如果周围的代码是 AVX,显然使用 AVX 而不是 SSE。doublevucomisducomisd

答: 暂无答案