ARM NEON 汇编器错误:“指令不能有条件”

Posted

技术标签:

【中文标题】ARM NEON 汇编器错误:“指令不能有条件”【英文标题】:ARM NEON assembler error: "instruction cannot be conditional" 【发布时间】:2011-08-10 00:31:16 【问题描述】:

根据arm info center vadd 可以有条件地执行但是当我尝试时

vaddeq.f32 d0,d0,d1

Xcode 返回

65:instruction cannot be conditional -- vaddeq.f32 d0,d0,d1

我注意到的一件事是,似乎只有 NEON 指令会出现此错误。 VFP 指令不会产生这些错误。

是否必须设置编译器标志才能启用 NEON 条件指令?

【问题讨论】:

【参考方案1】:

ARM 架构参考手册说:

 An ARM Advanced SIMD VADD instruction must be unconditional.

即,如果您处于 ARM 模式,则这些指令不是有条件的。如果将它们放在 IT 块中,则可以在 Thumb-2 中有条件地使用它们。

  .syntax unified
  .code 16
  .globl _foo
_foo:
  cmp r0, #0
  it eq
  vaddeq.f32 d0, d0, d1
  bx lr

【讨论】:

非常感谢,这真的为我解决了问题,我不会在我的代码中使用 Thumb,所以我想我会坚持使用分支。不过感谢您的出色回答! 太棒了。现在您可以继续并单击接受此答案的按钮,然后对您提出的所有其他问题以及人们花时间回答的所有其他问题执行相同的操作。 抱歉我刚接触堆栈溢出【参考方案2】:

条件 NEON 指令在 ARM 模式下不可用的原因是它们使用条件字段设置为 NV(从不)的编码。您需要使用条件分支或(更好)重写代码以不直接使用比较结果 - 例如根据结果​​将寄存器设置为 0 或 1,并在进一步的操作中使用它的值。

【讨论】:

【参考方案3】:

只有 NEON 和 VFP 共享的指令才能有条件地执行。

(例如 vldmia。)

对我来说,在某些情况下,条件执行本来可以让我免于一些小麻烦,但总的来说,你不会那么需要它。

仔细查看 NEON 逻辑和比较操作。它们很好地表明了 NEON 应该如何编程。

嘿嘿。

【讨论】:

以上是关于ARM NEON 汇编器错误:“指令不能有条件”的主要内容,如果未能解决你的问题,请参考以下文章

ffmpeg neon 在 android 上编译 - 汇编错误

带有 NEON 的 ARM 汇编中的高级数学函数

ARM NEON 汇编和浮点舍入

使用 NEON 在 ARM 汇编中对四字向量中的所有元素求和

解决一个Ubuntu中编译NEON优化的OpenCV的错误

如何使用 Neon Extension 有效地反转汇编语言 ARM 中的数组?