如何在不使用复合文字的情况下从标量初始化AltiVec寄存器

时间:2018-03-16 16:07:52

标签: c++ gcc simd powerpc altivec

我有一些像这样的代码

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内在函数。

1 个答案:

答案 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初始化者。