.text:91C034B4 li r11, 0x1E # Load Immediate
.text:91C034B8 divw r11, r27, r11 # Divide Word
.text:91C034BC mulli r11, r11, 0x1E # Multiply Low Immediate
.text:91C034C0 subf. r11, r11, r27 # Subtract from
.text:91C034C4 bne loc_91C034E0
通常在PowerPC中,在bne
(如果不相等的分支)指令之前存在比较指令。有人可以解释一下这是如何比较或上面的说明中发生了什么?
答案 0 :(得分:3)
关于Power的BNE
指令,就像许多具有类似分支指令的指令集一样,实际上并不需要比较函数。在电源上,该指令只是检查条件寄存器(CR)中的位,测试是否设置或清除某些位。
在您提供的情况下,subf
的结果将根据结果修改CR寄存器。程序员依靠这个减法的副作用来执行测试。
实际上,这通常等效于实际的比较指令,因为比较通常会执行减法以确定在CR中设置哪些位。程序员只是一次做两件事。
我建议您查看PowerPC User Instruction Architecture参考中的第2章,其中介绍了分支处理器。特别要注意2.3.1节:
对于比较指令,设置指定的CR字段以反映 比较结果。指定CR字段的位是 解释如下。有关位如何的完整描述 set在第3.3.9节“固定 - 中的指令说明中给出 点对比指令“第58页和第4.6.7节, 第113页的“浮点比较指令”。
位描述:
0-小于,浮点小于(LT,FL)用于定点比较 说明书,(RA)< SI或(RB)(签名比较)或(RA)
1-大于,浮点大于(GT,FG) 对于定点比较指令,(RA)> SI或(RB)(签名 比较)或(RA)> u UI或(RB)(无符号比较)。对于 浮点比较指令,(FRA)> (FRB)。
2-等于, 浮点等于(EQ,FE)对于定点比较指令, (RA)= SI,UI或(RB)。对于浮点比较指令,(FRA) =(FRB)。
3-汇总溢出,浮点无序(SO,FU)对于定点比较指令,这是最终状态的副本 XERSO完成指令。用于浮点比较 说明书,(FRA)和(FRB)中的一个或两个是NaN。
请注意,这是在比较之后如何设置这些位,因此然后由分支指令使用。如果检查subf
指令的参考,您可以看到哪些CR
位也受到减法的影响,允许您像进行比较一样进行分支。