bc
Branch Conditional - 40 00 00 00
bc

Instruction Syntax

Mnemonic Format Flags
bc BO,BI,target_addr AA = 0, LK = 0
bca BO,BI,target_addr AA = 1, LK = 0
bcl BO,BI,target_addr AA = 0, LK = 1
bcla BO,BI,target_addr AA = 1, LK = 1

Instruction Encoding

0
1
0
0
0
0
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
B
A
L

Field Bits Description
Primary Opcode 0-5 010000 (0x10)
BO 6-10 Branch Options
BI 11-15 Branch Condition Index
BD 16-29 14-bit signed branch displacement
AA 30 Absolute Address
LK 31 Link Register Update

Operation

if ((BO[2] = 0) & (CTR ≠ 0)) then CTR ← CTR - 1
ctr_ok ← BO[2] | ((CTR ≠ 0) ⊕ BO[3])
cond_ok ← BO[0] | (CR[BI] ≡ BO[1])
if ctr_ok & cond_ok then
  if AA = 0 then NIA ← CIA + EXTS(BD || '00')
  else NIA ← EXTS(BD || '00')
if LK = 1 then LR ← CIA + 4

Branch conditional instruction tests a condition and branches if the condition is met. The condition is determined by the BO (Branch Options) and BI (Branch Index) fields.

Affected Registers

Count Register (CTR)

(if BO[2] = 0)

Link Register (LR)

(if LK = 1)

For more information on branching see Section 2.3, "Branch Processor," in the PowerPC Microprocessor Family: The Programming Environments manual.

Examples

Basic Conditional Branches

cmpwi r3, 0           # Compare r3 with 0
bc 12, 2, positive    # Branch if equal (cr0[eq] = 1)
bc 4, 1, negative     # Branch if greater than (cr0[gt] = 1)

Loop with Counter

li r3, 10             # Load loop counter
mtctr r3              # Move to count register
loop:
    # loop body here
    bc 16, 0, loop    # Branch if CTR ≠ 0 (decrement and branch)

Extended Mnemonics (more readable)

# Instead of: bc 12, 2, target
beq target            # Branch if equal (extended mnemonic)

# Instead of: bc 4, 1, target  
bgt target            # Branch if greater than

# Instead of: bc 16, 0, target
bdnz target           # Branch if CTR decremented and non-zero

Function Call with Condition

cmpwi r3, 0           # Test if r3 is zero
bcl 12, 2, subroutine # Call subroutine if equal (saves LR)

Absolute Branch

cmpwi r3, 1           # Compare with 1
bca 12, 2, 0x8000     # Branch to absolute address if equal

Related Instructions

b, bcctr, bclr

Back to Index