1

请原谅我对以下问题的无知。我们支持 GCC 4.8(及更高版本)和 IBM XL C/C++ 12(及更高版本)。我们还在 AIX 和 Linux 上支持大端和小端。编译器和平台使代码相当混乱。

我们想将常量加载1到 VSX 寄存器中。这是我们能够编写的代码,但它似乎是错误的,因为它太复杂了。宏XLC_VERSION,GCC_VERSIONLITTLE_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;

有没有更简单的方法将一个小常数加载到向量寄存器中?

4

2 回答 2

2

您可能想在此处查看 BCD_INIT 示例。它使用宏来反转向量初始化。

关于 vec_reve:它是 vec_perm 的语法糖。您可以将它实现为头文件中的内联函数或库函数,并将其用于没有它的编译器。

于 2017-09-14T03:13:40.447 回答
2

你的例子

VectorType one = 1;

正在尝试将标量分配给向量。尝试改用向量。对于 16 字符向量,这将是:

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,但至少适用于大端:

   0:   10 41 03 0c     vspltisb v2,1

带有 gcc-5 的 LE 也可以正常工作。

   0:   0c 03 41 10     vspltisb v2,1
于 2017-09-13T02:26:16.327 回答