return a + b + c + d;
}
100004b8: 80 01 00 24 lwz
r0,36(r1)
100004bc: 7f 9c 1a 14 add
r28,r28,r3
100004c0: 83 61 00 0c lwz
r27,12(r1)
100004c4: 7c 7d e2 14 add
r3,r29,r28
100004c8: 83 81 00 10 lwz
r28,16(r1)
100004cc: 83 a1 00 14 lwz
r29,20(r1)
100004d0: 7c 08 03 a6 mtlr
r0
100004d4: 38 21 00 20 addi
r1,r1,32
100004d8: 4e 80 00 20 blr
------------------------------------------------------------------
3. 分类概述
3.1 分支跳转指令
这类指令算是 PowerPC 里比较有特色的,也是稍显复杂的。这类指令与 CR, LR 和 CTR
紧密相联,建构起判断、循环和过程调用这些程序的基本结构。其大致可分为四类:
Branch
Branch Conditional
Branch Conditional to Count Register
Branch Conditional to Link Register
3.1.1 Branch
这类指令与 CR 没有联系,即为非条件跳转,助记符后直接跟立即数地址。指令内为立即数地址预留 26 位,即可跳转 2^26
大小的空间,如:(CIA, Current Instruction Address)
b 0x20
-----> 以当前指令地址为基点,往后跳转 0x20 字节,即 PC = CIA + 0x20
ba 0x20
-----> 直接跳转到地址 0x20 处。后缀为 a,则表示使用
Absolute Address,PC = 0x20。
bl 0x20
-----> 在 b 0x20 的基础上,将 LR 更新为 CIA + 4
bla 0x20
-----> 使用绝对地址,且更新 LR。后缀带 l,则表示更新 LR 为 CIA + 4
以上针对 32 位的情形,对 64 位则使用指令 be, bea, bel, bela 功能与上同。
3.1.2 Branch Conditional
此类为条件跳转指令。皆以 bc 开头,带 3 个操作数,如:
bc BO, BI, BD
bca BO, BI, BD
bcl BO, BI, BD
bcla BO, BI, BD
后缀 a, l 的含义与 branch 类指令同。BO 指定跳转的条件,5 位;BI 指定关联的 CR 位,也是 5 位;BD
为跳转的立即数地址,16 位。
其中以 BO 的编码最为复杂(BO 从左到右编号为 0 ~ 4):
BO[0]: 为 1,则直接跳转
BO[1]: 为 1,则条件为真时,跳转。否则条件为假时,跳转
BO[2]: 为 1,则 CTR 不自动减 1
BO[3]: 为 1 时,则 CTR == 0 时跳转;为 0 时,则 CTR != 0 时跳转
BO[4]: 静态预测位,1 表示 unlikely,0 表示 likely
则常见的 BO 值:
20 (0b10100) 则表示无条件跳转
12 (0b01100) 则表示 CR 的某个位为 1 时跳转
4 (0b00100) 则表示 CR 的某个位为 0 时跳转
至于静态预测的策略位,默认被置为0,则其行为为:
b1. 目标地址小于当前指令地址,预测为跳转
b2. 目标地址大于当前指令地址,预测为不跳转
b3. 对于目标地址在 CTR/LR 中的条件跳转指令,一律预测为不跳转
若该位被置 1,则上述 b1, b2, b3 的静态预测行为分别为:不
跳转,跳转,跳转。
可以给分支指令加一个 +/- 的后缀,来简化。加 '+' 的指令,一律预测为跳转。加 '-' 的分支指令,一律预测为不