我正在查看在XCode中为iOS编译的一些代码(因此使用gcc为ARM编译),据我所知,编译器从未使用过ARM允许任意指令附加条件的功能,但总是分支在英特尔和其他架构上的情况下。
这仅仅是对GCC的限制(我可以理解它可能是:“condition = branch”嵌入在编译器体系结构中太高的级别以允许否则),或者是否存在特定的优化标志需要打开以允许编译条件指令吗?
(显然我很欣赏我对使用条件指令“应该”使用的做法有很大的假设并且实际上是一种优化,但我有编程早期ARM芯片以及使用和分析Acorn原始输出的经验ARM C编译器,所以我有一个粗略的想法。)
更新:根据以下信息对此进行了调查,结果证明:
答案 0 :(得分:1)
看到一些实际的程序集会让事情变得清晰,但我怀疑iOS编译的默认设置更喜欢生成Thumb代码而不是ARM,以获得更好的代码密度。虽然Thumb32中有伪条件指令,也就是Thumb-2(通过IT指令在ARMv7架构中支持),但原始Thumb16只有条件分支。此外,即使在ARM模式下,也有一些指令不能是有条件的(例如,许多NEON指令使用扩展操作码空间,条件字段设置为NV)。
答案 1 :(得分:0)
是的,gcc并没有真正产生最优的代码WRT条件指令。它在最简单的情况下运行良好,但实际代码遭受一些无意义的减速,可以在手动编码臂ASM中避免。只是为了给你一个粗略的想法,通过在ARM asm中执行读/写和复制逻辑而不是gcc发出的C代码,我能够为非常低级别的图形blit方法获得2倍的加速。但是,请记住,这种优化仅适用于代码中使用最频繁的部分。编写优化的ARM asm需要做大量的工作,所以除非在优化中有实际的好处,否则不要尝试它。
首先要记住的是xcode默认使用Thumb模式,因此为了生成ARM asm,您需要将-mno-thumb选项添加到特定.c文件的模块特定选项中。包含ARM asm。一旦ARM asm被发出,您将需要有条件地编译asm语句,如以下问题的答案中所示: