2013-09-12 6 views
4

Я пытаюсь изменить порядок 128-битного вектора (uint16x8).Обратный векторный порядок в ARM NEON intrinsics

Например, если у меня есть

a b c d e f g h 

Я хотел бы получить

h g f e d c b a 

Есть простой способ сделать это с NEON встроенных функций? Я пробовал с VREV, но он не работает.

+0

как вы пытались 'vrev'? – auselen

ответ

3

Вы хотите, чтобы команда 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 
+0

Я использовал его неправильно. Он работает сейчас. Спасибо. – user1926328

Смежные вопросы