using WORD_t = __m512i;
static inline void shift_swap(WORD_t &a, WORD_t &b, int j, WORD_t mask)
{
const WORD_t t = (a ^ (b >> j)) & mask;
a ^= t;
b ^= (t << j);
}
这段代码中,赋值,AND,OR,XOR都能直接对应到直接的simd操作。
但是这个shift操作,我的需要的是把这512bit当成一个大interger,而gcc直接编译出来的结果是对8个64bit正数分别移位。那些需要cross-boundary的bits都没有了。
如何手动实现这个shift呢?
我需要把这8个64bits当成一个512bits的大整数,需要支持左移/右移的位数是:256,128,64,32,16,8,4,2,1。
版上有巨佬做过这个吗?谢谢!
--
FROM 158.140.1.*