gol*_*ean 10 arm simd intrinsics neon
这与ARM Neon SIMD编码有关.我正在使用ARM Neon instrinsics来处理视频解码器中的某些模块.我有一个矢量化数据如下:
氖寄存器中有四个32位元素 - 比如Q0--大小为128位.
3B 3A 1B 1A
Run Code Online (Sandbox Code Playgroud)
在其他Neon寄存器中还有另外四个32位元素,即Q1,大小为128位.
3D 3C 1D 1C
Run Code Online (Sandbox Code Playgroud)
我希望最终数据按顺序排列如下:
1D 1C 1B 1A
3D 3C 3B 3A
Run Code Online (Sandbox Code Playgroud)
什么Neon instrinsics可以实现所需的数据顺序?
Nil*_*nck 10
这样的事情怎么样:
int32x4_t q0, q1;
/* split into 64 bit vectors */
int32x2_t q0_hi = vget_high_s32 (q0);
int32x2_t q1_hi = vget_high_s32 (q1);
int32x2_t q0_lo = vget_low_s32 (q0);
int32x2_t q1_lo = vget_low_s32 (q1);
/* recombine into 128 bit vectors */
q0 = vcombine_s32 (q0_lo, q1_lo);
q1 = vcombine_s32 (q0_hi, q1_hi);
Run Code Online (Sandbox Code Playgroud)
理论上,这应该只编译为两个移动指令,因为vget_high和vget_low只是将128位Q寄存器重新解释为两个64位D寄存器.vcombine otoh只编译为一个或两个移动(取决于寄存器分配).
哦 - 输出中整数的顺序可能完全错误.如果是这样,只需将参数交换到vcombine_s32.