ARM NEON内部函数中的反向向量顺序

ARM NEON内部函数中的反向向量顺序,arm,neon,intrinsics,Arm,Neon,Intrinsics,我试图反转128位向量(uint16x8)的顺序 例如,如果我有 a b c d e f g h 我想获得 h g f e d c b a 有没有一种简单的方法可以用霓虹灯的内在特性来做到这一点? 我尝试使用VREV,但它不起作用。您需要vrev64.16指令,但它不能在单个四寄存器的两个寄存器之间交换。您需要使用额外的vswp来实现这一点 内在论 q = vrev64q_u16(q) 如果要在双字内进行交换,则需要在四元寄存器中交换双字。然而,这会变得很麻烦,因为没有直接的vswpint

我试图反转128位向量(uint16x8)的顺序

例如,如果我有

a b c d e f g h
我想获得

h g f e d c b a
有没有一种简单的方法可以用霓虹灯的内在特性来做到这一点?
我尝试使用VREV,但它不起作用。

您需要
vrev64.16
指令,但它不能在单个四寄存器的两个寄存器之间交换。您需要使用额外的
vswp
来实现这一点

内在论

q = vrev64q_u16(q)
如果要在双字内进行交换,则需要在四元寄存器中交换双字。然而,这会变得很麻烦,因为没有直接的
vswp
intrinsic迫使您使用

q = vcombine_u16(vget_high_u16(q), vget_low_u16(q))
它实际上以
vswp
指令结束

请参见下面的示例

#include <stdio.h>
#include <stdlib.h>
#include <arm_neon.h>

int main() {
    uint16_t s[] = {0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108};
    uint16_t *t = malloc(sizeof(uint16_t) * 8);
    for (int i = 0; i < 8; i++) {
        t[i] = 0;
    }
    uint16x8_t a = vld1q_u16(s);
    a = vrev64q_u16(a);
    a = vcombine_u16(vget_high_u16(a), vget_low_u16(a));
    vst1q_u16(t, a);
    for (int i = 0; i < 8; i++) {
        printf("0x%3x ", t[i]);
    }
    printf("\n");
    return 0;
}
和产出

$ rev
0x108 0x107 0x106 0x105 0x104 0x103 0x102 0x101

您是如何尝试vrev的?
$ rev
0x108 0x107 0x106 0x105 0x104 0x103 0x102 0x101