A function is a control flow graph that begins at an entry block.
The blocks are extended basic blocks, which can have multiple exit points, but will always be entered at the top.
Every block must be terminated by a jmp, return, or trap instruction, there is no fallthrough.
Inspired by LLVM IR
addsubmuldivmod
num_eqsym_eqptr_eqnum_lt
typeof
copy
allocloadstore <to> = <from>lookuplength
jmp blockbr value blockbrn value block
call value (args)return
trap
function list? (v0) entry=bb0
bb0:
result = alloc
v1 = global nil?
v2 = call v1 (v0)
br v2 bb1 bb2
bb1:
v10 = sym true
store result = v10
jmp end
bb2:
v3 = global pair?
v4 = call v3 (v0)
br v4 bb3 bb4
bb3:
v5 = global cdr
v6 = call v5 (v0)
v7 = global list?
v8 = call v7 (v6)
store result = v8
jmp end
bb4:
v9 = sym false
store result = v9
jmp end
end:
return result
function list? (v0) entry=bb0
bb0:
result = alloc
so_far = alloc
store so_far = v0
bb00:
v11 = load so_far
v1 = global nil?
v2 = call v1 (v11)
br v2 bb1 bb2
bb1:
v10 = sym true
store result = v10
jmp end
bb2:
v3 = global pair?
v4 = call v3 (v0)
br v4 bb3 bb4
bb3:
v5 = global cdr
v6 = call v5 (v0)
store so_far = v6
jmp bb00
bb4:
v9 = sym false
store result = v9
jmp end
end:
return result