Каждая инструкция 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 в вашем случае.