相关疑难解决方法(0)

_mm_movemask_epi8 的内在逆

首先我将描述该任务:

我需要:

  1. 比较两个__m128i
  2. 以某种方式对结果进行按位与某个uint16_t值(可能使用_mm_movemask_epi8先然后只是&)。
  3. 根据blend结果​​计算初始值。

所以问题是,正如您可能已经猜到的那样,混合接受__m128i作为掩模,而我将拥有uint16_t. 因此,我要么需要某种反向指令,_mm_movemask_epi8要么完全做其他事情。

有些观点——我可能无法将该uint16_t值更改为其他类型,这很复杂;我在 SSE4.2 上这样做,所以没有 AVX;这里有一个类似的问题How to Perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)? 但这是关于 avx 的,我对此非常缺乏经验,所以我无法采用该解决方案。

PS:我可能也需要为手臂做这件事,希望得到任何建议。

c x86 sse simd sse4

3
推荐指数
1
解决办法
734
查看次数

如何在没有AVX2的情况下使用字节中的位来设置ymm寄存器中的dword?(反向vmovmskps)

我想要实现的是基于一个字节中的每个位,设置为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.

assembly sse x86-64 avx

2
推荐指数
2
解决办法
196
查看次数

将 16 位掩码转换为 16 字节掩码

有没有办法转换以下代码:

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)

c c++ sse bit-manipulation intrinsics

1
推荐指数
1
解决办法
261
查看次数

基于 BitMask 在数组中设置值的本质

是否有一个内在函数可以在输入数组中的所有位置设置单个值,其中相应位置在提供的 BitMask 中具有 1 位?

10101010 是位掩码

值为 121

它将设置位置 0,2,4,6 值为 121

c x86 bit-manipulation intel intrinsics

0
推荐指数
1
解决办法
1854
查看次数

标签 统计

c ×3

sse ×3

bit-manipulation ×2

intrinsics ×2

x86 ×2

assembly ×1

avx ×1

c++ ×1

intel ×1

simd ×1

sse4 ×1

x86-64 ×1