Как загрузить значение в неоновый 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}