bc (分支条件) 指令
用途
有条件地分支到指定的目标地址。
语法
| 位数 | 值 |
|---|---|
| 0 - 5 | 16 |
| 6 - 10 | BO |
| 11 - 15 | BI |
| 16 - 29 | BD |
| 30 | AA |
| 31 | LK |
| 项 | 描述 |
|---|---|
| bc | BO, BI, target_address |
| bca | BO, BI, target_address |
| bcl | BO, BI, target_address |
| bcla | BO, BI, target_address |
描述
bc 指令将分支到由分支目标地址指定的指令。 通过以下两种方法之一计算分支目标地址:
- 如果 "绝对地址" 位 (AA) 为 0 ,那么将通过将 14 位 "分支移位" (BD) 和 b "00" 并置,将其符号扩展为 32 位并将结果添加到此分支指令的地址来计算分支目标地址。
- 如果 AA 是 1 ,那么分支目标地址是与 b '00' 符号并置的 BD-扩展至 32 位。
bc 指令有四种语法形式。 每种语法形式对 "条件寄存器" 字段 0 和 "定点异常寄存器" 都有不同的影响。
| 项 | 描述 | |||
|---|---|---|---|---|
| 语法表单 | 绝对地址位 (AA) | 定点异常寄存器 | 链路位 (LK) | 条件寄存器字段 0 |
| bc | 0 | 无 | 0 | 无 |
| bca | 1 | 无 | 0 | 无 |
| bcl | 0 | 无 | 1 | 无 |
| bcla | 1 | 无 | 1 | 无 |
bc 指令的四种语法形式从不影响定点异常寄存器或条件寄存器字段 0。 语法形式设置 AA 位和链接位 (LK) ,并确定使用哪种方法计算分支目标地址。 如果将 "链接位" (LK) 设置为 1 ,那么指令的有效地址将放在 "链接寄存器" 中。
"分支选项" 字段 (BO) 用于将不同类型的分支组合到单个指令中。 提供了扩展助记符以自动设置 "分支选项" 字段。
BO 字段的编码是在 PowerPC® 体系结构中定义的。 以下列表简要描述了使用 pre-V2.00 编码的此字段的可能值:
| BO | 描述 |
|---|---|
| 0000y | 减量 CTR; 然后分支 (如果减量 CTR 不是 0 且条件为 False)。 |
| 0001y | 减少 CTR; 然后分支 (如果已减少的 CTR 为 0 且条件为 False)。 |
| 001zy | 分支 (如果条件为 False)。 |
| 0100y | 减小 CTR; 然后分支 (如果已减小的 CTR 的位不是 0 且条件为 True)。 |
| 0101y | 递减 CTR; 然后分支 (如果递减 CTR 为 0 且条件为 True)。 |
| 011zy | 条件为 True 时进行分支。 |
| 1z00y | 减小 CTR; 然后分支 (如果已减小的 CTR 不是 0)。 |
| 1z01y | 减小 CTR; 然后分支 (如果已减小的 CTR 为 0)。 |
| 1z1zz | 总是分支。 |
在 PowerPC® 体系结构中,位如下所示:
z位表示必须为 0 的位。 如果位不是 0 ,那么指令格式无效。y位提供有关是否可能采用条件分支的提示。 此位的值可以是 0 或 1。 缺省值为 0。
在 POWER ® 系列架构中, z 和 y 位可以是 0 或 1。
下面简要描述了使用 V2.00 编码的 BO 字段的编码:
| BO | 描述 |
|---|---|
| 0000z | 减量 CTR; 然后分支 (如果减量 CTR 不是 0 且条件为 False)。 |
| 0001z | 减少 CTR; 然后分支 (如果已减少的 CTR 为 0 且条件为 False)。 |
| 001at | 分支 (如果条件为 False)。 |
| 0100z | 减小 CTR; 然后分支 (如果已减小的 CTR 的位不是 0 且条件为 True)。 |
| 0101z | 递减 CTR; 然后分支 (如果递减 CTR 为 0 且条件为 True)。 |
| 011at | 条件为 True 时进行分支。 |
| 1a00t | 减小 CTR; 然后分支 (如果已减小的 CTR 不是 0)。 |
| 1a01t | 减小 CTR; 然后分支 (如果已减小的 CTR 为 0)。 |
| 1z1zz | 总是分支。 |
BO 字段的 a 和 t 位可由软件用于提供关于是否可能采用分支的提示,如下所示:
| 项 | 描述 |
|---|---|
| at | Hint |
| 00 | 未提供任何提示。 |
| 01 | 已预留 |
| 10 | 支部很可能不拿。 |
| 11 | 支很可能。 |
参数
| 项 | 描述 |
|---|---|
| 目标地址 | 指定目标地址。 对于绝对分支 (例如 bca 和 bcla) ,目标地址可以是可包含在 16 位中的即时数据。 |
| BI | 指定条件比较的条件寄存器中的位。 |
| BO | 指定指令中使用的 "分支选项" 字段。 |
示例
以下代码将分支到依赖于 "盘点寄存器" 中的值的目标地址:
addi 8,0,3
# Loads GPR 8 with 0x3.
mtctr 8
# The Count Register (CTR) equals 0x3.
addic. 9,8,0x1
# Adds one to GPR 8 and places the result in GPR 9.
# The Condition Register records a comparison against zero
# with the result.
bc 0xC,0,there
# Branch is taken if condition is true. 0 indicates that
# the 0 bit in the Condition Register is checked to
# determine if it is set (the LT bit is on). If it is set,
# the branch is taken.
bcl 0x8,2,there
# CTR is decremented by one, becomming 2.
# The branch is taken if CTR is not equal to 0 and CTR bit 2
# is set (the EQ bit is on).
# The Link Register contains address of next instruction.