【发布时间】:2019-12-04 01:15:33
【问题描述】:
我正在尝试使用 NEON 矢量指令做一些相对简单的事情:
给定uint64x2_t,我想交换 64 位成员的位置。
好吧,如果这是一个简单的普通代码:
typedef struct {
U64 u[2];
} u64x2;
u64x2 swap(u64x2 in)
{
u64x2 out;
out.u[0] = in.u[1];
out.u[1] = in.u[0];
return out;
}
令人惊讶的是,我找不到它的内在函数。显然有一个汇编指令(VSWP),但没有相应的内在指令。
这很奇怪。这是一个尽可能微不足道的操作,所以它必须是可能的。问题是:如何?
编辑:作为参考,godbolt 结果使用@Jake 答案:
https://godbolt.org/z/ueJ6nB 。
没有vswp,但vext 效果很好。
【问题讨论】:
-
你应该提到你的编译器。是海合会吗?还是 ARMCC?
-
对,目前是
gcc -
这里是适用于armcc 的引用: 这条指令作为内在函数没有任何好处,因为内在函数使用变量来封装寄存器分配和访问。因此。可以使用简单的 C 风格变量赋值来执行变量交换。。我想这同样适用于 GCC。
-
@Cyan:您只是使用 ABI 以整数 reg 而不是向量传递的普通结构。我添加了一个类型双关语和一个 GNU C 本机向量尝试 (godbolt.org/z/EPeMFo),它们仍然编译为 vec->int->vec。所以还是不行。
标签: c gcc arm intrinsics neon