我的C编译器(GCC)正在生成此代码,我认为这不是最佳的
8000500:2b1c cmp r3,#28
8000502:bfd4 ite
8000504:f841 3c70 strle.w r3,[r1,#-112]
8000508:f841 0c70 strgt.w r0,[r1,#-112]
在我看来,编译器可以很高兴地省略ITE LE指令,因为紧随其后的两个存储区使用CMP指令中的LE和GT标志,因此实际上将只执行一个。 ITE指令意味着将仅测试和执行一个STR,因此时间应该相等,但是它使用了额外的指令存储器字。
对此有何看法?
答案 0 :(得分:2)
在Thumb模式下,指令操作码(分支指令除外)没有用于条件执行的空间。在Thumb1中,这意味着只需要使用分支就可以跳过指令。
在Thumb2模式下,添加了IT指令,它增加了条件执行功能,而没有将其嵌入到指令操作码本身中。在您的情况下,le
指令的strle.w
条件部分未嵌入在操作码f841 3c70
中,但实际上是由反汇编程序从前面的ite le
指令中推断出来的。如果您使用十六进制编辑器将ite le
指令更改为其他指令,则strle.w
和strgt.w
都将突然分解为简单的str.w
。
有关其他详细信息,请参见另一个链接的答案https://stackoverflow.com/a/26001101。
答案 1 :(得分:1)
支持A32和T32目标的unified assembler syntax在这里增加了一些困惑。反汇编中显示的内容比操作码中编码的内容更为冗长。
您的ITE
指令在很大程度上是Thumb指令集的占位符,它定义了一个IT块,该IT块跨越了以下两个指令(并且,大拇指而言,这两个指令不是单独有条件的)。从微体系结构/时序的角度来看,只需要执行一条指令即可(但您不应该假定总是发生这种折叠)。
对于T32目标,可以单独使用strle
/ strgt
语法,因为指令集具有专用的条件代码字段,因此不需要IT块。
为了编写(或反汇编)A32和T32汇编程序都可以使用的代码,这里您要使用两种方法来一起编写条件执行。这样做的好处是,相同的汇编例程可以具有更高的可移植性(即使结果代码不相同-目标cpu的优化也将有所不同)。
对于T32,it
和单个16位指令的组合与等效的A32指令的指令密度匹配,如果可以组合多个条件指令,则总的来说是成功的。