根据掩码合并比特序列a和b

时间:2016-09-02 00:29:30

标签: c++ assembly merge bitmask instruction-set

根据bit twiddling hacks网站,操作

unsigned int a;    // value to merge in non-masked bits
unsigned int b;    // value to merge in masked bits
unsigned int mask; // 1 where bits from b should be selected; 0 where from a.
unsigned int r;    // result of (a & ~mask) | (b & mask) goes here

r = a ^ ((a ^ b) & mask); 

允许根据掩码合并两个比特序列ab。我在想:

  1. 此操作是否具有特定/通常的名称?
  2. 在某些指令集上是否存在针对此操作的特定汇编指令?

1 个答案:

答案 0 :(得分:2)

在SSE / AVX编程中,基于蒙版从一个矢量到另一个矢量的选择性复制称为混合。 SSE4.1添加了像PBLENDVB xmm1, xmm2/m128, <XMM0>这样的指令,其中隐式操作数XMM0控制src的哪些字节覆盖dst中的相应字节。 (如果没有SSE4.1,你通常会将AND和ANDNOT掩码放在两个向量上,并且OR就在一起; xor技巧具有较少的指令级并行性,并且可能至少需要MOV指令的数量。复制寄存器。)

还有一个立即混合指令pblendw,其中掩码是8位立即而不是寄存器。并且有32位和64位立即混合(blendpsblendpdvpblendd)和可变混合(blendvpsblendvpd)。

IDK,如果其他SIMD指令集(NEON,AltiVec,MIPS调用它们等等)也称它们为#34;混合&#34;或不。

SSE / AVX(或x86整数指令)在AVX512F之前不提供比通常的按位XOR / AND更好的方法来进行按位(而不是逐元素)混合。

AVX512F可以使用单个vpternlogdvpternlogq指令执行此(或任何其他按位三元函数)的按位版本。 (d和q元素大小之间的唯一区别是,如果使用掩码寄存器进行合并屏蔽或对目标进行零屏蔽,但即使对于无掩码情况,这也不会阻止英特尔制作单独的内在函数:< / p>

__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)和等效的...... _ epi64版本。

imm8立即字节是真值表。通过将它们用作真值表的3位索引,从a,b和c的相应位独立地确定目的地的每个位。即imm8[a:b:c]

AVX512在最终出现在主流台式机/笔记本电脑CPU中时会很有趣,但这可能还需要几年时间。