首先我将描述该任务:
我需要:
__m128i。uint16_t值(可能使用_mm_movemask_epi8先然后只是&)。blend结果计算初始值。所以问题是,正如您可能已经猜到的那样,混合接受__m128i作为掩模,而我将拥有uint16_t. 因此,我要么需要某种反向指令,_mm_movemask_epi8要么完全做其他事情。
有些观点——我可能无法将该uint16_t值更改为其他类型,这很复杂;我在 SSE4.2 上这样做,所以没有 AVX;这里有一个类似的问题How to Perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)? 但这是关于 avx 的,我对此非常缺乏经验,所以我无法采用该解决方案。
PS:我可能也需要为手臂做这件事,希望得到任何建议。
我想要实现的是基于一个字节中的每个位,设置为ymm寄存器(或内存位置)中每个dword中的所有位
例如
al = 0110 0001
ymm0 = 0x00000000 FFFFFFFF FFFFFFFF 00000000 00000000 00000000 00000000 FFFFFFFF
Run Code Online (Sandbox Code Playgroud)
即vmovmskps eax, ymm0/ 的倒数_mm256_movemask_ps,将位图转换为矢量蒙版.
我想有一些sse/avx指令可以相对简单地做到这一点,但我还是无法解决这个问题.优选沙桥兼容,因此没有avx2.
有没有办法转换以下代码:
int mask16 = 0b1010101010101010; // int or short, signed or unsigned, it does not matter
Run Code Online (Sandbox Code Playgroud)
到
__uint128_t mask128 = ((__uint128_t)0x0100010001000100 << 64) | 0x0100010001000100;
Run Code Online (Sandbox Code Playgroud)
所以要特别清楚,比如:
int mask16 = 0b1010101010101010;
__uint128_t mask128 = intrinsic_bits_to_bytes(mask16);
Run Code Online (Sandbox Code Playgroud)
或直接敷面膜:
int mask16 = 0b1010101010101010;
__uint128_t v = ((__uint128_t)0x2828282828282828 << 64) | 0x2828282828282828;
__uint128_t w = intrinsic_bits_to_bytes_mask(v, mask16); // w = ((__uint128_t)0x2928292829282928 << 64) | 0x2928292829282928;
Run Code Online (Sandbox Code Playgroud) 是否有一个内在函数可以在输入数组中的所有位置设置单个值,其中相应位置在提供的 BitMask 中具有 1 位?
10101010 是位掩码
值为 121
它将设置位置 0,2,4,6 值为 121