请原谅我对以下问题的无知。我们支持GCC 4.8(及以上)和IBM XL C / C ++ 12(及以上版本)。我们还在AIX和Linux上支持big和little-endian。编译器和平台使代码变得相当混乱。
我们希望将常量1
加载到VSX寄存器中。这是我们能够制作的代码,但它似乎是错误的,因为它非常复杂。宏XLC_VERSION
,GCC_VERSION
和LITTLE_ENDIAN
具有惯常含义,因此省略了导致它们的其他预处理器宏。
typedef __vector unsigned char uint8x16_p8;
typedef __vector unsigned long long uint64x2_p8;
#if defined(XLC_VERSION)
typedef uint8x16_p8 VectorType;
#elif defined(GCC_VERSION)
typedef uint64x2_p8 VectorType;
#endif
#if defined(LITTLE_ENDIAN)
const VectorType one = {1};
#else
const VectorType one = (VectorType)((uint64x2_p8){0,1});
#endif
不明显的是,XL C / C ++支持所有数据安排并具有丰富的API集。使用IBM编译器是轻而易举的(当它不产生难以理解的警告和错误时)。
GCC回到4.8仅支持64x2排列,它只有一部分API。例如,GCC缺少用于8x16排列的IBM API,而GCC没有vec_reve
(这会使端点反转变得容易)。
我真正想做的是这样的事情,并且只需要工作"无处不在,但无法编译:
VectorType one = 1;
是否有一种不太复杂的方法将一个小常量加载到向量寄存器中?
答案 0 :(得分:2)
的例子
VectorType one = 1;
正在尝试为矢量指定标量。尝试使用矢量。对于16-char矢量,这将是:
vector char one = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
gcc-4.8似乎编译好了;我没有LE 4.8方便,但至少适用于big-endian:
0: 10 41 03 0c vspltisb v2,1
LE与gcc-5也很好。
0: 0c 03 41 10 vspltisb v2,1
答案 1 :(得分:2)
您可能需要查看BCD_INIT示例here。它使用宏来反转向量初始化。
关于vec_reve:它是vec_perm的语法糖。您可以将其实现为标题中的内联函数或库函数,并将其用于没有它的编译器。