Перестановка векторов ARMv8 NEON

Рассмотрим память, расположенную так, что восемь последовательных 4-байтовых блоков читаются как [abcdefgh]. Я загружаю их в два регистра v0.4s и v1.4s, поэтому я получаю v0.4s = [abcd] и v1.4s = [efgh], где каждый символ представляет собой 32-битный блок. Я хочу переупорядочить их, чтобы получить [abef] и [cdgh] в двух (возможно, разных) регистрах.

Мой подход на данный момент состоял бы в том, чтобы сначала перевернуть 64-битные половины [efgh], чтобы получить [ghef]. Затем я могу использовать экстракт, чтобы получить [abef] и [ghcd]. Затем я снова могу, наконец, перевернуть 64-битные половины [ghcd], чтобы получить [cdgh].

Может ли кто-нибудь сказать лучший подход?


person Martin Lauridsen    schedule 21.08.2017    source источник
comment
Есть ли причина, по которой вы не используете zip, uzp или trn?   -  person EOF    schedule 21.08.2017


Ответы (1)


Именно для этого и предназначены инструкции TRN:

// v0: abcd // v1: efgh

trn1 v2.2d, v0.2d, v1.2d
trn2 v3.2d, v0.2d, v1.2d

// v2: перед // v3: cdgh

И пожалуйста, пожалуйста, не спрашивайте меня, почему это 2d, а не 4s.

person Jake 'Alquimista' LEE    schedule 14.10.2017