Как загрузить значение в неоновый s-регистр?

Я хочу оптимизировать наш ассемблерный алгоритм, выполняя несколько операций и один раз. Это можно сделать с помощью векторов неонового модуля в ассемблере руки.

Я пытаюсь добавить один вектор (2x32bit) в другой. Если я правильно понял, d0 состоит из s0 и s1. Я хочу загрузить одно значение в s0, а другое в s1. Таким образом, я могу добавить s0 и s1 и то же самое время к s2 и s3 (из d1).

VADD.I32    d1, d0 

Но для этого мне сначала нужно загрузить данные в d1 и d0. Я старался

VMOV    s0, d5

а также

VMOV    d0[0], d5

но оба они выдают ошибки при компиляции.

Спасибо за вашу помощь!

2 ответа

Решение

@michidk Поскольку регистры Sx могут быть связаны с регистрами Dx; например, {S0, S1} = D0. Обычно вы перемещаете Dm в Dd или делаете что-то вроде vmov d1, d2, так как я не думаю, что вы можете переместить Dx в Sx.

Итак, давайте поместим некоторые значения в s1 и s1 соответственно.

movw r1, #0x123
movw r2, #0xabc
vmov s1, r1             // s1 in this case is d0.u32[1]
vmov s2, r2             // s2 in this case is d1.u32[0]

vorr d1, d0             // 

...

GDB показывает, что необработанные значения действительно присутствуют. Кроме того, вы видите, что значения являются жизнеспособными из 32-разрядных частей без знака D0 и D1.

(gdb) info register all 
s1             4.07777853e-43   (raw 0x00000123)
s2             3.85076818e-42   (raw 0x00000abc)

(gdb) p/x $d0.u32
$24 = {0x0, 0x123}

(gdb) p/x $d1.u32
$25 = {0xabc, 0x0}

С помощью инструкции "vorr d1, d0" мы копируем d0.u32[1] в d1.u32[1], который является s3; без нарушения d1.u32[0], то есть s2. Таким образом, в этом смысле мы перемещаем часть D0 в S3.

(gdb) p/x $d1.u32
$28 = {0xabc, 0x123}

(geb) info register s3
s3             4.07777853e-43   (raw 0x00000123)

Возможно, вам потребуется проверить документацию на ассемблере и процессоре для вашей целевой машины. Этот грубый пример работает на Cortex-A9 Marvell PJ4Bv7 от Scaleway.

movw r0, #0xc0de
movw r1, #0xdead
vmov s0, s1, r0, r1

movw r0, #0xf00d
movw r1, #0xbaad
vmov s2, s3, r0, r1


(gdb) i r a 
d0             1.2096437008836935e-309  (raw 0x0000dead0000c0de)
d1             1.0140805688480121e-309  (raw 0x0000baad0000f00d)

Изменить: Вы также можете загрузить значения, скажем, в d0 из памяти:

array: .byte 3,1,4,1,5,9,2,6,5,3,5,9
...
ldr r0,=array
vldr d0, [r0]

Результаты GDB для 8 целых чисел без знака в D0

(gdb) print $d0.u8
$8 = {3, 1, 4, 1, 5, 9, 2, 6}
Другие вопросы по тегам