UP | HOME

Branching
Compiler Implementation
COP-3402

Branching

Goal

Map SimpleIR branching operations

loop:
goto loop

to assembly, e.g.,

loop:
 jmp loop

Labels

Named locations in the code.

labelname:
 mov $1, %rax

Where is code stored?

How are locations represented in the machine?

What address does the label correspond to at runtime?

Unconditional branching/jump

jmp loop

Addresses are relative to the instruction pointer

Absolute address can be specified with a value in a register

For our compiler, we'll only need to use labels

Assembler will compute relative offset for us

Conditional branching

How can we represent conditional statements in machine-like code?

if (x > 10) {
 x = 11;
}
x += 1;
function main
localvars x
if x <= 10 goto falselabel
x := 11
falselabel:
x := x + 1
return x

Why is the condition inverted?

Won't need compile to SimpleIR but should understand how conditionals are translated to branch instructions.

Accessing variables

How we do access x's data?

if x <= 10 goto falselabel
x := 11
falselabel:
x := x + 1

Load from the stack frame, e.g., -16(%rbp)

 # ifgoto x 10 to falselabel
 mov	-8(%rbp), %rax
 mov	$10, %rbx
 cmp	%rbx, %rax
 jle falselabel
 # assign 11 to x
 mov	$11, %rax
 mov	%rax, -8(%rbp)
falselabel:
 # operation x 1 to x
 mov	-8(%rbp), %rax
 mov	$1, %rbx
 add	%rbx, %rax
 mov	%rax, -8(%rbp)

Comparing operands

cmp	%rbx, %rax

x86's conditional jumps

jle jump if result of comparison is less than

jle falselabel

ifgoto translation

SimpleIR

if x <= 10 goto falselabel

assembly (assuming %rbx and %rax already set)

cmp	%rbx, %rax  # %rbx is 10, %rax is x
jle falselabel

Note: assembly operand order!

Just like subtraction, left operand is the second operand.

Other condition codes

ASM Op SimpleIR Op Jump if…
je = Equal
jne != Not equal
jl < Less than
jle <= Less than or equal
jg > Greater than
jge >= Greater than or equal

Pattern of conditional jumps

SimpleIR pattern

if OPERAND1 OPERATOR OPERAND2 goto LABEL

Convert operator to ASM jCC. Assembly code pattern

mov OPERAND1, %rax
mov OPERAND2, %rbx
      cmp	%rbx, %rax  # %rbx is 10, %rax is x
jOP LABEL

Complete example

if x <= 10 goto falselabel
x := 11
falselabel:
x := x + 1

Complete example

if x <= 10 goto falselabel

# getoperands
      mov	-8(%rbp), %rax
      mov	$10, %rbx
cmp	%rbx, %rax
jle falselabel

x := 11

mov	$11, %rax
mov	%rax, -8(%rbp)

falselabel:

# label
falselabel:

x := x + 1

# x := x + 1
mov	-8(%rbp), %rax
mov	$1, %rbx
add	%rbx, %rax
mov	%rax, -8(%rbp)

Author: Paul Gazzillo

Created: 2024-11-15 Fri 08:53

Validate