寻找非立即移位值的sse 128位移位操作
Looking for sse 128 bit shift operation for non-immediate shift value
内部_mm_slli_si128
将对128位寄存器进行逻辑左移,但仅限于立即移位值,并按字节而非位进行移位。
我可以使用像_mm_sll_epi64
或_mm_sll_epi32
这样的内在函数来左移__m128i
寄存器中的一组值,但这些值不携带"溢出"位。
对于N位的移位,想象一下我可以做一个类似的事情:
_mm_sll_epi64
_mm_srr_epi64
(对于我要携带的比特:将它们移到低位)- 打乱srr结果
- 或者将这些放在一起
(但可能还必须包括N相对于64的检查)。
有更好的方法吗?
不是理想的解决方案,但如果您想将SSE寄存器旋转或移位8的倍数,那么PSHUFB
指令(以及_mm_shuffle_epi8()
内在指令)会有所帮助。它采用第二个SSE寄存器作为输入;寄存器中的每个字节都保存一个值,该值用于对第一输入寄存器中的字节进行索引。
这是(我的)一篇关于C预处理器使用异常的博客文章中的一个附带问题。对于127个不同的移位偏移,存在用于比特移位的SSE2指令的四个不同的最优序列。预处理器合理地构造了一个相当于129路切换语句的移位函数。请原谅这里的原始代码;我不熟悉直接在这里张贴代码。查看博客文章,了解正在发生的事情。
#include <emmintrin.h>
typedef __m128i XMM;
#define xmbshl(x,n) _mm_slli_si128(x,n) // xm <<= 8*n -- BYTE shift left
#define xmbshr(x,n) _mm_srli_si128(x,n) // xm >>= 8*n -- BYTE shift right
#define xmshl64(x,n) _mm_slli_epi64(x,n) // xm.hi <<= n, xm.lo <<= n
#define xmshr64(x,n) _mm_srli_epi64(x,n) // xm.hi >>= n, xm.lo >>= n
#define xmand(a,b) _mm_and_si128(a,b)
#define xmor(a,b) _mm_or_si128(a,b)
#define xmxor(a,b) _mm_xor_si128(a,b)
#define xmzero _mm_setzero_si128()
XMM xm_shl(XMM x, unsigned nbits)
{
// These macros generate (1,2,5,6) SSE2 instructions, respectively:
#define F1(n) case 8*(n): x = xmbshl(x, n); break;
#define F2(n) case n: x = xmshl64(xmbshl(x, (n)>>3), (n)&15); break;
#define F5(n) case n: x = xmor(xmshl64(x, n), xmshr64(xmbshl(x, 8), 64-(n))); break;
#define F6(n) case n: x = xmor(xmshl64(xmbshl(x, (n)>>3), (n)&15),
xmshr64(xmbshl(x, 8+((n)>>3)), 64-((n)&155))); break;
// These macros expand to 7 or 49 cases each:
#define DO_7(f,x) f((x)+1) f((x)+2) f((x)+3) f((x)+4) f((x)+5) f((x)+6) f((x)+7)
#define DO_7x7(f,y) DO_7(f,(y)+1*8) DO_7(f,(y)+2*8) DO_7(f,(y)+3*8) DO_7(f,(y)+4*8)
DO_7(f,(y)+5*8) DO_7(f,(y)+6*8) DO_7(f,(y)+7*8)
switch (nbits) {
case 0: break;
DO_7(F5, 0) // 1..7
DO_7(F1, 0) // 8,16,..56
DO_7(F1, 7) // 64,72,..120
DO_7x7(F6, 0) // 9..15 17..23 ... 57..63 i.e. [9..63][16,24,..,56]
DO_7x7(F2,56) // 65..71 73..79 ... 121..127 i.e. [65..127][64,72,..,120]
default: x = xmzero;
}
return x;
}
xm_shr相当于上述内容,但在F[1256]宏中到处交换"shl"answers"shr"。HTH。
相关文章:
- 如何打印boost多精度128位无符号整数
- 如何对__uint128_t进行位扫描(128位)?
- 如何在C ++中将二进制字符串128位转换为十进制字符串?
- 使用 AVX2 指令左移 128 位数字
- 如何创建128位整数文本
- 为什么SSE有128位加载函数?
- 此示例中指定的此 128 位 AES 密钥的格式是什么
- 如何处理MinGM32位加密编译器中的128位变量(Diffie-Hellman算法)
- 从 2 个 uint64 值中提取诡异哈希 128 位值
- 编译器用于编译 128 位整数的基本算术运算的技巧
- 优化 32 位架构上的可移植 128 位整数移位
- RC4-128位比AES-128位安全吗
- C++ 数据结构,可容纳 128 位数据
- 128位比较和交换固有
- 如何在 c++ 中输入 128 位无符号整数
- 如何在c++中存储128位数字
- 计算128位整数中前导零的数量
- uintmax_t不处理 128 位
- 将转换字符数组[16]键入为int 128位
- 寻找非立即移位值的sse 128位移位操作