1

我有一些这样的代码

void op(uint32_t B0, uint32_t B1, uint32_t B2, uint32_t B3)
{
   auto v = (__vector unsigned int){B0, B1, B2, B3};
   ...
}

当我编译它时,GCC 警告说“ISO C++ 禁止复合文字”。__vector有没有其他方法可以在没有此构造的情况下从多个标量初始化 AltiVec ?或者我应该忽略警告。

我发现一些 IBM 文档表明(__vector unsigned int)(B[0], B[1], B[2], B[3])(注意括号而不是括号)可以工作,但 GCC 拒绝了这一点。

我能想到的唯一另一件事是首先将四个标量放入一个数组中,然后从内存中加载它。但是,这似乎会比较慢。我基本上是在寻找 SSE2 的_mm_set_epi32内在函数。

4

1 回答 1

0

在过去有两种不同的语法,这两种语法都值得一试:

__vector unsigned int v = (__vector unsigned int){ B0, B1, B2, B3 }; // gcc syntax

__vector unsigned int v = (__vector unsigned int)(B0, B1, B2, B3); // Motorola syntax

看起来您已经尝试过“gcc”语法(除了使用auto),但也许摩托罗拉语法可能有效?

如果摩托罗拉语法不起作用,我可以提出的唯一其他建议是尝试使用 gcc 语法,但将其编译为 C 而不是 C++,因为现在 C++11 和 gcc 样式的 AltiVec 初始化程序之间可能存在一些冲突。

于 2018-03-16T19:16:17.517 回答