2016-01-19 68 views
0

如何取得XMM寄存器值的按位取反?据我所知,没有这样的指示。唯一带有否定的指令是pandn,但是为了使用它来简单地取消一个XMM寄存器中的值,我将不得不使用填充1填充另一个XMM寄存器。是否有另一种方法来消除XMM寄存器中的位?还是有没有一种聪明的方式来填充XMM寄存器1而不访问内存?XMM寄存器按位取反

回答

4

加载全1寄存器,使用

pcmpeqd xmm0, xmm0 

之后,你可以简单地减去xmm0xmmX得到~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

+2

...或带有all-ones寄存器的'pxor'。 – EOF