c++ - 如何从标量初始化AltiVec寄存器而不使用复合文字

标签 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吗?还是我应该忽略警告。

我发现一些表明(__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/

相关文章:

绝对值的编译器优化

c++ - 两个 SSE2 打包 double 的最优无分支条件选择

c++ - 使用 OpenMP 线程和 std::(experimental::)simd 计算 Mandelbrot 集

Java 扩展泛型类型参数

c++ - HeapAlloc 簿记

c++ - 为sqlite3编译spellfix

c - 用于大小分析的 GCC 工具?

cuda - CUDA 标量和 SIMD 视频指令的效率

c++ - 代码优化;切换与 if 的

c++ - 高斯消去法不消去正确项