设置 SSE 寄存器的最后或前 n 位

use*_*317 5 c++ x86 sse simd intrinsics

如何创建__m128i具有n最高有效位集的(在整个向量中)?我需要它来屏蔽与计算相关的缓冲区部分。如果可能,解决方案应该没有分支,但这似乎很难实现

我怎样才能做到这一点 ?

Pau*_*l R 2

您可以使用此问题中的方法之一来生成掩码,并将 MS n字节设置为全部。当 n 不是 8 的倍数时,您只需要修复所有剩余的位。

我建议尝试这样的事情:

- init vector A = all (8 bit) elements to the residual mask of n % 8 bits
- init vector B = mask of n / 8 bytes using one of the above-mentioned methods
- init vector C = mask of (n + 7) / 8 bytes using one of the above-mentioned methods
- result = A | B & C
Run Code Online (Sandbox Code Playgroud)

例如,如果 n = 36:

A = f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0
B = ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00 00
C = ff ff ff ff ff 00 00 00 00 00 00 00 00 00 00 00
==> ff ff ff ff f0 00 00 00 00 00 00 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)

根据需要,这将是无分支的,但它可能约为 10 条指令。可能有一种更有效的方法,但我需要更多考虑。