当我编译代码时
"VMOV.I16 q1, #2730; "
我遇到了一个错误
Error: immediate out of range
此错误的原因可能是什么?我知道S16在[-32768,32767]之内,如果我要在寄存器Q或D中存储常数2730,该怎么办?谢谢!
答案 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位相同。