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

Posted

技术标签:

【中文标题】如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器【英文标题】:How to initialize a AltiVec register from scalars without using compound literals 【发布时间】:2018-03-16 16:07:52 【问题描述】:

我有一些这样的代码

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])(注意括号而不是括号)可以工作,但 GCC 拒绝这样做。

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

【问题讨论】:

【参考方案1】:

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

__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 初始化程序。

【讨论】:

遗憾的是,摩托罗拉语法在 C++ 中不起作用,并且由于所讨论代码的性质(它充当 C++ 代码的 SSE2/AltiVec/NEON 寄存器的 100% 内联包装器),它是无法从 C 编译它;在此处添加函数调用开销会严重影响性能。 你能用 IBM 编译器 (xlC) 代替 gcc 吗?

以上是关于如何在不使用复合文字的情况下从标量初始化 AltiVec 寄存器的主要内容,如果未能解决你的问题,请参考以下文章

Android:如何在不拍照的情况下从相机捕获文本?

可以在不调用 memset 的情况下从构造函数初始化器列表中将成员结构设为零吗?

如何在不使用表单的情况下从 jsp 调用 servlet

如何在不使用子进程的情况下从 python 自动化脚本中运行 python 'sdist' 命令?

如何在不使用 Xcode、iPhone 中的谷歌地图的情况下从地址获取纬度和经度

如何在不使用 foreach 循环的情况下从视图访问模型