这与Power4有关,缺少vector long long
. 在 Power7 和 Power8 上,我们可以执行:
typedef __vector unsigned long long uint64x2_p;
...
uint64x2_p val = {...};
uint64x2_p res = vec_rl(val, val, bits);
我需要为丢失的 64 位矢量类型找到解决方法并在 Power4 上轮换。我认为有两种策略。首先,在 C/C++ 中旋转或;其次,使用 32 位向量类型。我猜(2)是更快的策略,因为数据在向量寄存器中。
我觉得这个问题很久以前就解决了,因为双字轮换没有什么特别之处。不幸的是,搜索没有返回有用的点击:"power4" "doubleword" rotate。
我想我的基本算法由三个 LOAD、两个 SHIFT、两个 PERM 和一个 OR 组成。但我不确定是否有更好的方法。
在没有双字循环的 Power4 上工作时,如何执行 64 位循环?
typedef __vector unsigned int uint32x4_p;
template <unsigned int R>
inline uint32x4_p VecRotateLeft64(const uint32x4_p val)
{
enum {LSHIFT = R%32};
enum {RSHIFT = 32 - (R%32)};
enum {PERMUTE = R > 32};
const uint32x4_p lbits = {LSHIFT,LSHIFT,LSHIFT,LSHIFT};
uint32x4_p left(vec_sl(val, lbits));
const uint32x4_p rbits = {RSHIFT,RSHIFT,RSHIFT,RSHIFT};
uint32x4_p right(vec_sr(val, rbits));
const uint8x16_p mask = {4,5,6,7, 0,1,2,3, 12,13,14,15, 8,9,10,11};
right = vec_perm(right, right, mask);
uint32x4_p result = vec_or(left, right);
// Permute left and right parts of 64-bit word as needed
if (PERMUTE)
result = vec_perm(result, result, mask);
return result;
}