Assembly 有没有办法用xor翻转32位浮点的符号位?

Assembly 有没有办法用xor翻转32位浮点的符号位?,assembly,x86,simd,Assembly,X86,Simd,我试图翻转xmm0内部最低有效浮点的符号位。我尝试将-0转换为另一个xmm寄存器,并用xmm0对其进行异或。不幸的是,虽然我的浮点值消失了,但我已经实现了翻转符号。有没有办法在asm中使用xorps来翻转符号位?我也看到过一些关于如何做到这一点的帖子,但都是用c写的 # xmm0 contains 4 floats # goal is to flip the sign of the least significant one mov eax, -0 cvtsi2ss xmm1, eax xorp

我试图翻转xmm0内部最低有效浮点的符号位。我尝试将-0转换为另一个xmm寄存器,并用xmm0对其进行异或。不幸的是,虽然我的浮点值消失了,但我已经实现了翻转符号。有没有办法在asm中使用
xorps
来翻转符号位?我也看到过一些关于如何做到这一点的帖子,但都是用c写的

# xmm0 contains 4 floats
# goal is to flip the sign of the least significant one
mov eax, -0
cvtsi2ss xmm1, eax
xorps    xmm0, xmm1

要翻转xmm0内部最低有效浮点数的符号位,解决方案类似于Jester在我的问题的评论部分中发布的内容:

mov eax, 0x80000000
movd xmm1, eax
xorps xmm0, xmm1

(感谢Jester和所有帮助过我的人。我只是想把这个主题标记为完成)

要翻转xmm0内部最低有效浮点数的符号位,解决方案看起来就像Jester在我问题的评论部分所发布的:

mov eax, 0x80000000
movd xmm1, eax
xorps xmm0, xmm1

(感谢Jester和所有帮助过我的人。我只想把这个主题标记为完成)

mov eax,0x8000000;movdxmm1,eax;xorps xmm0、xmm1
@Jester非常感谢!那很快。我也尝试过类似的方法,但没有达到我预期的效果。很遗憾,我不能接受您的解决方案。仅供参考:-0和0是相同的2的补码整数-0.0和0.0是不同的浮点数。因此,
mov eax,-0
相当于
mov eax,0
@Jester或将
0x8000000
放在内存中,并用内存操作数引用它。@Jester:如果要动态生成它,我倾向于选择
pcmpeqd xmm1,xmm1
pslld xmm1,31除非您特别希望不修改高位元素。
mov eax,0x8000000;movdxmm1,eax;xorps xmm0、xmm1
@Jester非常感谢!那很快。我也尝试过类似的方法,但没有达到我预期的效果。很遗憾,我不能接受您的解决方案。仅供参考:-0和0是相同的2的补码整数-0.0和0.0是不同的浮点数。因此,
mov eax,-0
相当于
mov eax,0
@Jester或将
0x8000000
放在内存中,并用内存操作数引用它。@Jester:如果要动态生成它,我倾向于选择
pcmpeqd xmm1,xmm1
pslld xmm1,31除非您特别希望保持高位元素不被修改。如果您要避免从内存中加载常量,
pcmpeqd xmm1,xmm1
/
pslld xmm1,31
实现
set1(-0.0)
的向量的效率大致相同。(). 不过,这两种方式都是在
xorps
之前的9字节代码。唯一的区别是UOP可以在哪些后端端口上运行
movd
在Intel上仅限于一个端口(端口5),
pcmpeqd
pslld
可以在大多数CPU上至少两个端口上运行。因此,最佳选择取决于周围的代码。movd延迟问题。不相关。如果要避免从内存加载常量,
pcmpeqd xmm1,xmm1
/
pslld xmm1,31
实现
set1(-0.0)
向量的效率差不多。(). 不过,这两种方式都是在
xorps
之前的9字节代码。唯一的区别是UOP可以在哪些后端端口上运行
movd
在Intel上仅限于一个端口(端口5),
pcmpeqd
pslld
可以在大多数CPU上至少两个端口上运行。因此,最佳选择取决于周围的代码。movd延迟问题。无关的