我有一些这样的代码
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++禁止使用复合文字”。没有这种构造,还有其他方法可以从多个标量初始化AltiVec
__vector
吗?还是我应该忽略警告。我发现一些表明
(__vector unsigned int)(B[0], B[1], B[2], B[3])
(注释括号而不是括号)的IBM文档可以工作,但是GCC拒绝了。我唯一想到的另一件事是首先将四个标量放入数组中,然后从内存中加载它。但是,这似乎会比较慢。我基本上是在寻找与SSE2的
_mm_set_epi32
内在等效项。
最佳答案
过去有两种不同的语法,这两种语法都值得一试:
__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
),但也许Motorola语法可能有用吗?如果Motorola语法不起作用,我可以提出的唯一其他建议是尝试使用gcc语法,但将其编译为C而不是C++,因为现在C++ 11和gcc风格的AltiVec初始化程序之间可能存在一些冲突。
关于c++ - 如何从标量初始化AltiVec寄存器而不使用复合文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49325114/