c - 用 C/gcc 内在函数 : no intrinsic for VSWP? 交换 NEON vector 的一半

标签 c gcc arm intrinsics neon

我正在尝试使用 NEON vector 指令做一些相对简单的事情: 给定一个 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 ),但没有相应的内在函数。

这很奇怪。这是一个尽可能微不足道的操作,所以它必须是可能的。问题是:如何?

edit :作为引用,godbolt 结果使用@Jake 回答: https://godbolt.org/z/ueJ6nB . 没有 vswp,但 vext 效果很好。

最佳答案

你说得对,NEON 内部函数不支持 VSWP 指令。

但是,您可以使用 VEXT 指令代替,该指令也可以在内部函数中使用。

out = vextq_u64(in, in, 1);


或者,您可以使用 vcombine (并祈祷编译器不会搞砸):

out = vcombine_U64(vget_high_u64(in), vget_low_u64(in));

但请注意,编译器在看到 vcombine 和/或 vget 时往往会生成 FUBAR 机器代码。

坚持前者,这是我的建议。

关于c - 用 C/gcc 内在函数 : no intrinsic for VSWP? 交换 NEON vector 的一半,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57207397/

相关文章:

c - 如何使用预处理器识别 Linux 上的 64 位构建?

linux - 使用 gcc 编译胖可执行文件

c - 在 C 中使用 scanf 拆分字符串

c - 在子进程中操作流

c++ - 在哪里放置模板特化

c - 如何使用GCC的pure属性?

c - armv5 交叉编译 Node 的库兼容性

c++ - 使用 Maven NAR 插件对 ARM 进行交叉编译

c - ARM 指令到 C 语句

c - 无效的预处理器 token 警告消息