【问题标题】:immediate out of range in assembly装配中立即超出范围
【发布时间】:2019-10-27 16:28:45
【问题描述】:

当我编译代码时

"VMOV.I16    q1, #2730; "

我遇到了一个错误

 Error:  immediate out of range

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

【问题讨论】:

  • 要求编译器将其放入带有向量寄存器输入约束的向量寄存器中。

标签: assembly arm inline-assembly neon


【解决方案1】:

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

2730 是十六进制的 0xaaa,如您所见,您需要 11 位来表示文字,而vmov 仅接受 8 位,其中两位左移:8bit

将任何 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 位相同。

【讨论】:

    猜你喜欢
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多