【问题标题】:SSE: How to extract the sign bit for each packed byte, into a packed register?SSE:如何将每个打包字节的符号位提取到打包寄存器中?
【发布时间】:2016-08-02 11:53:39
【问题描述】:

给定xmm0 中的压缩字节,提取符号的有效方法是什么 每个字节的(即最高位)位到xmm1?换句话说,我想 为每个打包字节计算逻辑 AND,使用 0x80。

例如:

xmm0: 0xff 0xef 0x80 0x7f 0x01 ...
xmm1: 0x80 0x80 0x80 0x00 0x00 ...

【问题讨论】:

  • 你试过_mm_and_si128()吗?
  • 我可以想象使用_mm_and_si128(即pand),但这需要我先加载一个合适的掩码。 (最有效的方法是什么?)我想知道是否有专门的东西可以做得更好。

标签: assembly intel sse sse2 sse4


【解决方案1】:

没有字节元素移位(psrlb 或其他),所以你不能只用右移然后左移来敲掉你不想要的位。即使您只需要这样做一次,最好还是戴上口罩。

您可以generate the mask on the fly in fewer instruction bytes than it takes to store the mask,没有缓存未命中的可能性。

pcmpeqw xmm1,xmm1     ; -1
pabsb   xmm1,xmm1     ;  1
psllw   xmm1, 7       ; set1_epi8(0x80)
pand    xmm1, xmm0

如果您希望将符号位打包在一个整数 reg 中

PMOVMSKB  reg, xmm0

但是将其解包回向量比生成符号位掩码 (until AVX512) 慢。


如果你只这样做一次,你可能能够想出比 4 个insns 更短的东西,尤其是。如果可以使用 AVX 无损操作。这是一个并没有缩短的想法:

vpcmpeqw    xmm1, xmm1,xmm1
vpsignb     xmm2, xmm1, xmm0     ;  xmm2 = -1 or +1 (or 0) depending on xmm0
vpsubb      xmm3, xmm2, xmm1     ;  xmm3 = 0 or +2  (or +1) depending on xmm0.  (subtract -1 => add 1)
vpsllw      xmm4, xmm3, 6        ;  xmm4 = 0 or 0x80 (or 0x40) depending on xmm0

不,没有更短。根据您的需要,这个想法的一部分可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2019-04-28
    • 1970-01-01
    • 2018-08-22
    • 2015-05-31
    • 2015-05-23
    • 2023-03-14
    • 1970-01-01
    • 2018-12-03
    相关资源
    最近更新 更多