2017-01-23 15 views
1

Я хочу оптимизировать алгоритм ассемблера, выполнив несколько операций и один раз. Это можно сделать, используя векторы неонового модуля в ассемблере руки.Как загрузить значение в неоновый 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 

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

Благодарим за помощь!

+0

Вы работаете с плавающей запятой? – InfinitelyManic

+0

@InfinitelyManic Nope, с целым числом без знака (32 бит) – michidk

ответ

1

@ 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} 

С инструкцией "võrr 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) 
+0

Спасибо, не знал про vorr .. есть ли способ скопировать первую часть вместо второй из d-регистра? – michidk

+0

@michidk Ну, если вы собираетесь использовать vorr, тогда dx.u32 [0] и dx.u32 [1] будут иметь значения. Вот почему использование отладчика является ценным. Является ли это присвоением класса? – InfinitelyManic

1

Возможно, вам потребуется проверить ассемблер, документацию по процессору для вашей целевой машины. Этот грубый пример работает на 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) 

Edit: Вы также можете загрузить значения в, скажем, 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} 
+0

Я использую Raspberry Pi 3 (ARM Cortex-A53). Как вы отлаживали/выводили значения этих регистров? Так что я должен сначала загрузить значения в регистры большого пальца? Поэтому, чтобы загрузить их из d-регистра, я должен сначала загрузить их в регистр большого пальца, а затем вернуться в s-регистры? Должен быть более эффективный способ? Что делать, если я хочу загрузить s2, в s6? – michidk

+0

@michidk Отладка была выполнена с использованием GNU Debugger GDB. Какие инструменты вы используете? – InfinitelyManic

+0

@michidk Отметьте https://people.xiph.org/~tterribe/daala/neon_tutorial.pdf для справки. Я не могу войти в ARM.com на данный момент – InfinitelyManic

 Смежные вопросы

  • Нет связанных вопросов^_^