【发布时间】:2011-10-11 14:28:27
【问题描述】:
如果我理解正确的话,因为 ARM 指令是 32 位长,它们只能保存这么多位立即数。我想要做的是vmov.f32 s0, #0.0,我得到“immediate out of range”编译器错误。奇怪的是,当我使用即时值,比如#0.5 或#0.25(都非常整齐地以二进制表示)时,我的代码会编译。当我尝试分配 #0.1 的立即值时,我得到“garbage after following instruction”错误,如果它试图用更多可以适合 ARM 指令的位来表示这些值,这是有道理的。 #0.0 案例是唯一一个我得到“immediate out of range”的案例,所以我认为如果没有其他解释,这一定是一个错误。
有谁知道如何将#0.0 的立即值分配给单个字浮点寄存器,而无需从其他地方进行转换?如果有充分的理由它不应该首先工作,请让我知道。我正在使用带有 Android NDK 构建工具的 GNU 汇编器。
更新:
vmov.f32 d0, #0.0 确实工作。它的意义越来越小。
更新 2:
这也不起作用:vmov.s32 s0, #0
【问题讨论】:
-
我没有做过任何 ARM 组装。但是只是出于好奇查看了说明以了解您在说什么。所以请原谅我可能天真的问题:s32 的指定不是“有符号整数”类型吗?你确定你不是要使用
vmov.f32 #0.0? -
@HostileFork 你是对的。这是一个错字。更正问题。
-
您缺少第一个操作数的寄存器 - 还是另一个错字?您可以发布导致问题的实际行代码吗?
-
在“只是阅读文档”中更进一步......它说立即模式下的 VMOV 应该与
Qd or Dd一起使用,它们是 Neon 寄存器,而s寄存器是 VFP。也许您遇到了未定义行为的问题?另外,请注意 [b] cmets:“任何可以表示为+/- n * 2^(-r)的数字,其中 n 和 r 是整数,16 infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204h/…
标签: android assembly android-ndk arm neon