立即超出装配范围
immediate out of range in assembly
当我编译代码时
"VMOV.I16 q1, #2730; "
我收到一个错误
Error: immediate out of range
这个错误可能是什么原因?我知道S16在[-32768,32767]范围内,请问如果我要在寄存器Q或D中存储常量2730怎么办?谢谢!
每条 ARM 指令都是 32 位宽,只有有限数量的位专用于立即值 - 如果有的话。
2730 在十六进制中是 0xaaa,如您所见,您需要 11 位来表示文字,而 vmov
只接受 8 位,其中两位用于左移:8bit<<(n* 8);其中 n 可以是 0 到 3
将任何 16 位值加载到 NEON 寄存器的最佳方法是(在您的情况下为 2730):
movw %[temp], #2730
vdup.16 q1, %[temp]
movw
是一条接受 16 位文字的 ARM 指令,而 vdup.n
是一条 NEON 指令,其功能与 vmov.in
相同,只是源操作数是 ARM 整数寄存器而不是立即值。
替代方式:
您可以将任何 8 位值加载到 NEON 寄存器;您使用值 0xaa 进行 8 位加载,然后清除 16 位值的最高四位
vmov.i8 q1, #0xaa
vbic.i16 q1, q1, #0xf000
但是请注意,这个之所以有效,只是因为 16~19 位与你的情况下的 0~3 位相同。
当我编译代码时
"VMOV.I16 q1, #2730; "
我收到一个错误
Error: immediate out of range
这个错误可能是什么原因?我知道S16在[-32768,32767]范围内,请问如果我要在寄存器Q或D中存储常量2730怎么办?谢谢!
每条 ARM 指令都是 32 位宽,只有有限数量的位专用于立即值 - 如果有的话。
2730 在十六进制中是 0xaaa,如您所见,您需要 11 位来表示文字,而 vmov
只接受 8 位,其中两位用于左移:8bit<<(n* 8);其中 n 可以是 0 到 3
将任何 16 位值加载到 NEON 寄存器的最佳方法是(在您的情况下为 2730):
movw %[temp], #2730
vdup.16 q1, %[temp]
movw
是一条接受 16 位文字的 ARM 指令,而 vdup.n
是一条 NEON 指令,其功能与 vmov.in
相同,只是源操作数是 ARM 整数寄存器而不是立即值。
替代方式:
您可以将任何 8 位值加载到 NEON 寄存器;您使用值 0xaa 进行 8 位加载,然后清除 16 位值的最高四位
vmov.i8 q1, #0xaa
vbic.i16 q1, q1, #0xf000
但是请注意,这个之所以有效,只是因为 16~19 位与你的情况下的 0~3 位相同。