0
如何取得XMM寄存器值的按位取反?据我所知,没有这样的指示。唯一带有否定的指令是pandn
,但是为了使用它来简单地取消一个XMM寄存器中的值,我将不得不使用填充1
填充另一个XMM寄存器。是否有另一种方法来消除XMM寄存器中的位?还是有没有一种聪明的方式来填充XMM寄存器1
而不访问内存?XMM寄存器按位取反
如何取得XMM寄存器值的按位取反?据我所知,没有这样的指示。唯一带有否定的指令是pandn
,但是为了使用它来简单地取消一个XMM寄存器中的值,我将不得不使用填充1
填充另一个XMM寄存器。是否有另一种方法来消除XMM寄存器中的位?还是有没有一种聪明的方式来填充XMM寄存器1
而不访问内存?XMM寄存器按位取反
加载全1寄存器,使用
pcmpeqd xmm0, xmm0
之后,你可以简单地减去xmm0
xmmX
得到~xmmX
,或使用pandn
您也可以到XMM容易寄存器加载其他常量
pcmpeqd xmm0, xmm0
psrld xmm0, 30 ; 3 (32-bit)
pcmpeqd xmm0, xmm0 ; -1
pcmpeqw xmm0, xmm0 ; 1.5f
pslld xmm0, 24
psrld xmm0, 2
pcmpeqw xmm0, xmm0 ; -2.0f
pslld xmm0, 30
阅读Agner Fog的优化指南,13.4 Generating constants - Making constants for integer vectors in XMM registers
...或带有all-ones寄存器的'pxor'。 – EOF