根据掩码合并位序列a和b

Merge bit sequences a and b according to a mask

本文关键字:掩码 合并      更新时间:2023-10-16

根据bit twidling 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); 

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

  1. 此操作是否有特定/常用名称
  2. 某个指令集上是否存在此操作的特定程序集指令

我会使用掩码xor方法将其称为位混合。相关:本次问答;A详细解释了这些布尔运算是如何实现这一点的。

在SSE/AVX编程中,基于掩码从一个向量选择性复制到另一个向量被称为混合。SSE4.1添加了类似PBLENDVB xmm1, xmm2/m128, <XMM0>的指令,其中隐式操作数XMM0控制src的哪些字节覆盖dst中的相应字节。(在没有SSE4.1的情况下,通常会将掩码与两个向量进行AND和ANDNOT运算,并将其进行OR运算;掩码异或技巧的指令级并行性较低,并且可能需要至少与OR方法一样多的MOV指令来复制寄存器。(

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

IDK,如果其他SIMD指令集(NEON、AltiVec、MIPS调用它们的任何指令集等(也调用它们";共混物";是否。


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

AVX512F可以使用单个a0或vpternlogq指令执行此函数的逐位版本(或任何其他逐位三元函数(。(d和q元素大小之间的唯一区别是,如果您使用掩码寄存器对目标进行合并掩码或零掩码,但这并没有阻止英特尔制作单独的内部函数,即使是在无掩码的情况下:

__m512i _mm512_ternarylogic_epi32 (__m512i a, __m512i b, __m512i c, int imm8)及其等价物_epi64版本。

imm8立即字节是一个真值表。通过使用a、b和c的对应比特作为真值表的3比特索引,独立地确定目的地的每个比特。即CCD_ 14。

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