请原谅我对以下问题的无知。我们支持 GCC 4.8(及更高版本)和 IBM XL C/C++ 12(及更高版本)。我们还在 AIX 和 Linux 上支持大端和小端。编译器和平台使代码相当混乱。
我们想将常量加载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 编译器很容易使用(当它不会产生难以理解的警告和错误时)。
回到 4.8 的 GCC 仅支持 64x2 排列,并且它只有 API 的一个子集。例如,GCC 缺少用于 8x16 排列的 IBM API,而 GCC 没有vec_reve
(这会使字节序反转变得容易)。
我真正想做的是这样的事情,让它在任何地方都“正常工作”,但它无法编译:
VectorType one = 1;
有没有更简单的方法将一个小常数加载到向量寄存器中?