Как изменить порядок векторных данных четверного слова с помощью Neon Intrinsics?

Вопрос связан с внутренностями ARM NEON. Я использую встроенные функции ARM neon для реализации FIR. Я хочу переупорядочить векторные данные в четырех словах. Например, в регистре Neon есть четыре 32-битных элемента, скажем, Q0, размер которых составляет 128 бит.

A3 A2 A1 A0

Я хочу переупорядочить Q0 как A0 A1 A2 A3.

Есть ли возможность это сделать?


person Priya    schedule 20.12.2010    source источник


Ответы (1)


Чтение http://gcc.gnu.org/onlinedocs/gcc/ARM-NEON-Intrinsics.html вместе с информационным центром ARM, я думаю, что следующее будет делать то, о чем вы просите:

    uint32x2_t dvec_h = vget_high_u32(qvec);
    uint32x2_t dvec_l = vget_low_u32(qvec);

    dvec_h = vrev64_u32(dvec_h);
    dvec_l = vrev64_u32(dvec_l);

    qvec = vcombine_u32(dvec_h, dvec_l);

В сборке это можно было бы записать просто как:

    VSWP      d0, d1
    VREV64.32 q0, q0
person unixsmurf    schedule 04.01.2011
comment
Может ли vrev64q_u32 сделать это за один шаг? Кроме того, vzip_u32 может сделать вещи немного компактнее. Что-то вроде vzip_u32(vget_high_u32(x), vget_low_u32(x)) также может работать. См. Также Кодирование для NEON - Часть 5: Перестановка векторов. - person jww; 30.10.2018
comment
@jww: понятия не имею :) Не делал NEON много лет, и не знаю, было ли это доступно в то время. Предлагаю вам опубликовать свой ответ. - person unixsmurf; 30.10.2018