我有一些像这样的代码
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
?或者我应该忽略警告。
我发现一些IBM文档表明(__vector unsigned int)(B[0], B[1], B[2], B[3])
(注意parens而不是括号)可行,但GCC拒绝这一点。
我能想到的另一件事是首先将四个标量放入一个数组中,然后从内存中加载它。然而,这似乎会相当慢。我基本上都在寻找相当于SSE2的_mm_set_epi32
内在函数。
答案 0 :(得分: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
),但也许摩托罗拉语法可能有效?
如果Motorola语法不起作用,我可以做的唯一其他建议是尝试使用gcc语法,但将其编译为C而不是C ++,因为C ++ 11和gcc样式之间可能存在一些冲突AltiVec初始化者。