4

128 ビット ベクトル (uint16x8) の順序を逆にしようとしています。

たとえば、私が持っている場合

a b c d e f g h

入手したい

h g f e d c b a

NEON組み込み関数でそれを行う簡単な方法はありますか? VREVで試してみましたが、うまくいきません。

4

1 に答える 1

6

命令が必要ですvrev64.16が、単一のクワッドレジスタのダブルレジスタ間でスワップしません。追加の を使用してそれを達成する必要がありますvswp

組み込み関数の場合

q = vrev64q_u16(q)

ダブルワード内でスワップするためのトリックを行う必要があります。次に、クワッドレジスタでダブルワードをスワップする必要があります。vswpただし、組み込み関数が直接ないため、次のようなものを使用する必要があるため、面倒です。

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;
}

以下のようなアセンブリを生成します

vld1.16 {d16-d17}, [sp:64]
movs    r4, #0
vrev64.16   q8, q8
vswp    d16, d17
vst1.16 {d16-d17}, [r5]

と出力

$ rev
0x108 0x107 0x106 0x105 0x104 0x103 0x102 0x101
于 2013-09-12T09:55:57.940 に答える