Как переместить однословные данные между векторами ARMv7 NEON - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь разработать ассемблерный код, используя ARMv7 NEON векторизацию.В какой-то момент мне нужно скопировать 32-битное значение (одно слово) из одного вектора NEON в другой, что-то вроде mov dm[0], dn[1].Когда я проверил руководство, я не смог найти ни одной операции mov или vmov, которая могла бы выполнять эту логику, так как они должны иметь регистры ARM r либо в источнике, либо в месте назначения.Любая идея или альтернативы?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Если вы хотите:

1) mov d0 [0], d1 [0]

vext d0, d0, d1, #4
vrev64.32 d0, d0

2) mov d0 [0], d1 [1]

vtrn.32 d1, d0

3) mov d0 [1], d1 [0]

vtrn.32 d0, d1

4) mov d0 [1], d1 [1]

vext d0, d1, d0, #4
vrev64.32 d0, d0

Обратите внимание, что d1 будет поврежден в случае 2) и 3).Чтобы избежать этого, вы должны скопировать d1 во временный регистр d2 и использовать его вместо этого.

0 голосов
/ 24 мая 2018

В 32-битном режиме (ARMv7 и более ранних, а не ARMv8) каждый псевдоним каждого регистра Q 2 d регистров / 4 s регистров.Например, q1 - это d2..3, а также s4..7.Вы можете скопировать их отдельно.

Я не уверен, есть ли штраф за слияние за запись в регистр s и последующее чтение содержащего регистра q на любых ARM uarches.

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s03s02.html имеет карту регистров: только q0..q7 имеют s -регистрации псевдонимов.В q8..q15 есть только d регистровые компоненты.(т.е. есть только 32 s регистры, 32 d регистры и 16 q регистры, поэтому d16..31 не имеют своих подкомпонентов, адресуемых отдельно, а q8..15 имеет только 64-битные элементы dwordвыставляется отдельно).

Если нет лучшего способа сделать это, сохраните векторы, которые вам нужно разрезать и нарезать кубиками, в нижних регистрах 8 q.


ARMv8 (AArch64) ввел инструкции, которые могут индексироваться в векторных регистрах, потому что s3 является младшим словом q3: перекрытие / упаковка изменены.

AArch32 vs 64 SIMD registers

...