GCC优化:使用ARM条件指令?

3
我正在查看在XCode中编译的iOS代码(使用gcc编译为ARM架构),据我所见,编译器从未使用过ARM允许任意指令带有条件的特性,而是像在英特尔和其他架构上一样,在条件下分支。
这是否只是GCC的限制(我可以理解,因为“条件=分支”嵌入到编译器体系结构中的层次太高,以至于不允许其他情况),还是需要打开特定的优化标志才能允许编译条件指令?
(显然,我很清楚我正在做出关于应该使用条件指令的大胆假设,并且实际上会进行优化,但我有使用早期ARM芯片编程并使用和分析Acorn原始ARM C编译器输出的经验,因此我有一个大致的想法。)
更新:经过以下信息的调查,发现:
- XCode以Thumb-2模式编译,其中没有提供任意指令的条件执行; - 在某些情况下,它会使用ITE(if-then-else)指令来有效地生成具有条件执行的指令。

我认为你所看到的并不是真实情况(例如,请参阅有关此主题的电子邮件线程 - 好吧,它是关于其中的错误,但仍然如此)。您是否设置了正确的优化和目标CPU类型? - Mat
嗯,在某种意义上,这就是我想要找出的:什么是“正确的优化”...!感谢提供链接 - 我会看看那个特定的示例是否使用条件执行进行编译。 - Neil Coffey
它们已经有文档记录了:http://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html - Mat
ARM指令的条件执行并不总是更快,尽管它可能更小。在LLVM中,该决策是在http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBaseInstrInfo.cpp?view=markup中进行的,可以在任一`ARMBaseInstrInfo :: isProfitableToIfCvt()`重载中进行。 - ohmantics
已更新问题:原来XCode是以Thumb模式进行编译。然而,我尝试了Mat提到的电子邮件中提到的代码,并且XCode编译为一系列在Thumb模式下可用的ITE/MOVEQ/MOVNE。因此,在某些情况下显然使用了条件执行,而这与优化选项本身无关。 - Neil Coffey
2个回答

1

看到一些实际的汇编代码会让事情更清晰,但我怀疑iOS编译的默认设置更喜欢生成Thumb代码而不是ARM代码,以获得更好的代码密度。虽然在Thumb32(也称为Thumb-2,通过IT指令在ARMv7架构中支持)中有伪条件指令,但原始的Thumb16只有条件分支。此外,即使在ARM模式下,也有一些无法条件执行的指令(例如,许多NEON指令使用带有条件字段设置为NV的扩展操作码空间)。


0

是的,gcc在条件指令方面实际上并不能生成最优化的代码。它在最简单的情况下表现良好,但是真正的代码会遭受一些无意义的减速,这可以通过手写的ARM ASM避免。举个例子,我成功地让一个非常低级别的图形传输方法加倍提速,方法是使用ARM ASM来替换由gcc生成的C代码中的读/写和复制逻辑。但是请记住,这种优化只对代码中最常用的部分有价值。编写良好优化的ARM ASM需要大量工作,因此,除非优化带来了真正的好处,否则不要尝试。

首先要记住的是,xcode默认使用Thumb模式,因此,为了生成ARM ASM,您需要将-mno-thumb选项添加到特定.c文件的模块特定选项中。一旦ARM asm发出,您将希望按照以下问题的答案指示有条件地编译asm语句:

ARM asm条件编译问题


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接