сразу за пределами диапазона в сборке - PullRequest
1 голос
/ 13 июня 2019

когда я скомпилировал код

"VMOV.I16    q1, #2730; "

Я получил ошибку

 Error:  immediate out of range

В чем может быть причина этой ошибки? Я знал, что S16 находится в пределах [-32768,32767], и что мне делать, если мне нужно сохранить постоянную 2730 в регистре Q или D? Спасибо!

1 Ответ

4 голосов
/ 13 июня 2019

Каждая инструкция ARM имеет ширину 32 бита, и только непосредственное значение выделяется только ограниченному количеству битов - если вообще.

2730 - это 0xaaa в шестнадцатеричном формате, и, как вы можете видеть, вам нужно 11 бит длявыражают литерал, и vmov принимает только 8 битов с двумя битами для сдвига влево: 8 бит << (n * 8);где n может быть от 0 до 3 </p>

Лучший способ загрузки ЛЮБОГО 16-битного значения в регистр NEON (2730 в вашем случае):

movw    %[temp], #2730
vdup.16 q1, %[temp]

movw - это инструкция ARM, котораяпринимает 16-битные литералы, и vdup.n - это инструкция NEON, которая выполняет те же действия, что и vmov.in, за исключением того, что исходный операнд является целочисленным регистром ARM вместо непосредственного значения.


Альтернативный способ:

Вы можете загрузить любое 8-битное значение в регистр NEON;Вы выполняете 8-битную загрузку со значением 0xaa, а затем очищаете старшие четыре бита из 16-битных значений

vmov.i8     q1, #0xaa
vbic.i16    q1, q1, #0xf000

Обратите внимание, что это работает только потому, что биты 16 ~ 19 совпадают сбиты 0 ~ 3 в вашем случае.

...