立即超出装配范围

时间:2019-06-13 06:17:14

标签: assembly arm inline-assembly neon

当我编译代码时

"VMOV.I16    q1, #2730; "

我遇到了一个错误

 Error:  immediate out of range

此错误的原因可能是什么?我知道S16在[-32768,32767]之内,如果我要在寄存器Q或D中存储常数2730,该怎么办?谢谢!

1 个答案:

答案 0 :(得分:4)

每条ARM指令都是32位宽,并且只有有限数量的位专用于立即数-如果有的话。

2730是十六进制的0xaaa,如您所见,您需要11位来表示文字,并且vmov仅接受8位和两位左移:8bit <<(n * 8) ;其中n可以是0到3

将任何16位值加载到NEON寄存器中的最佳方法是(在您的情况下为2730):

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

movw是一条ARM指令,它接受16位文字,而vdup.n是一条NEON指令,其作用与vmov.in相同,只是源操作数是一个ARM整数寄存器而不是立即数。值。


备用方式:

您可以将任何8位值加载到NEON寄存器中。加载值为0xaa的8位负载,然后清除16位值的最高有效四位

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

但是请注意,该位之所以起作用是因为您的情况下第16〜19位与第0〜3位相同。