1

如果我理解正确,因为 ARM 指令是 32 位长,它们只能保存这么多位立即数。我想要做的是vmov.f32 s0, #0.0,我得到“ immediate out of range”编译器错误。奇怪的是,当我使用一个立即值,比如#0.5or #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

4

4 回答 4

3

0.0不能表示为 VFP/NEON 浮点立即数。可表示的浮点立即数的大小在 1/8 到 31 之间,而零显然不是。

然而,相应的位模式可以表示为一个整数 NEON 立即数。您的汇编程序正在为您提供帮助并为您生成此编码,而不是(不可能的)浮点立即数;当您编写vmov.f32 d0, #0.0它时,它实际上会发出vmov.s32 d0, #0,这与您似乎正在尝试做的事情具有相同的效果,但实际上是合法的指令。

vmov.s32 s0, #0没有任何意义;NEON 不提供对s寄存器进行操作的任何指令。

但是,如果您只想将 NEON 寄存器归零,首选的习惯用法通常是veor d0, d0. 有没有理由不使用它?

于 2011-10-11T20:41:43.483 回答
1

如果要将 0 分配给 s 寄存器,可以使用以下指令轻松完成:vsub.f32 s0, s0, s0

于 2011-12-16T05:15:36.777 回答
1

要将“0”分配给寄存器(不管它是通用寄存器还是 NEON 向量),只需执行以下操作:

"eor s0, s0, s0 \n\t"
于 2016-03-02T19:24:23.420 回答
0

你可以简单地使用这个: vmov.u32 d0, #0

因为 0x00000000 也被解释为 0.0f。

仅供参考,浮动中不能有任何“真正的”零。实际上是 1.0 * (2^-128)

或 1.0 * (2^-129),我记不太清了。

于 2011-11-01T07:12:49.837 回答