diff options
author | Camil Staps | 2021-01-07 20:48:59 +0100 |
---|---|---|
committer | Camil Staps | 2021-01-07 20:48:59 +0100 |
commit | d703325c0196deeb1e66e308f914bef0fc56d419 (patch) | |
tree | 9f252aa4e0e5862377aea9fe851a627bb72c88c4 | |
parent | Replace tabs by two spaces (diff) |
Add heap pointer
-rw-r--r-- | fib_eqI_b.ll | 76 | ||||
-rw-r--r-- | rts.ll | 18 |
2 files changed, 58 insertions, 36 deletions
diff --git a/fib_eqI_b.ll b/fib_eqI_b.ll index ac9cbca..8b7f547 100644 --- a/fib_eqI_b.ll +++ b/fib_eqI_b.ll @@ -1,4 +1,5 @@ -define i64* @e_fib_eqI_b_nfib(i64* %n, i64** %globasp) prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 1} { +define {i64*,i64*} @e_fib_eqI_b_nfib(i64* %n, i64** %globasp, i64* %hp.0) align 8 + prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 1} { %astack = alloca i64*, i64 10 %asp.000 = getelementptr i64*, i64** %astack %bstack = alloca i64, i64 10 @@ -7,24 +8,29 @@ define i64* @e_fib_eqI_b_nfib(i64* %n, i64** %globasp) prefix {i8*, i64} {i8* in %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 - %t.0 = bitcast i64*(i64**)* @_cycle_in_spine to i64* + %t.0 = bitcast {i64*,i64*}(i64**,i64*)* @_cycle_in_spine to i64* %asp.002 = call i64** @push_node(i64* %t.0, i64 1, i64** %asp.001) %t.1 = call i64* @peek_a(i64** %asp.002) %asp.003 = call i64** @pop_a1(i64** %asp.002) %globasp.0 = call i64** @_push_local_astack(i64** %asp.003, i64** %asp.000, i64** %globasp) - %t.2 = call i64 @ea1(i64* %t.1, i64** %globasp.0) - %bsp.001 = call i64* @pushI(i64 %t.2, i64* %bsp.000) + %t.2 = call {i64,i64*} @ea1(i64* %t.1, i64** %globasp.0, i64* %hp.0) + %t.2.0 = extractvalue {i64,i64*} %t.2, 0 + %hp.1 = extractvalue {i64,i64*} %t.2, 1 + %bsp.001 = call i64* @pushI(i64 %t.2.0, i64* %bsp.000) %asp.004 = call i64** @fillI_b(i64 0, i64 -0, i64* %bsp.001, i64** %asp.003) %bsp.002 = call i64* @pop_b1(i64* %bsp.001) %t.3 = call i64* @peek_a(i64** %asp.004) %asp.005 = call i64** @pop_a1(i64** %asp.004) - ret i64* %t.3 + + %ret.0 = insertvalue {i64*,i64*} undef, i64* %t.3, 0 + %ret.1 = insertvalue {i64*,i64*} %ret.0, i64* %hp.1, 1 + ret {i64*,i64*} %ret.1 } -define private i64 @ea1(i64* %n, i64** %globasp) { +define private {i64,i64*} @ea1(i64* %n, i64** %globasp, i64* %hp.0) { %astack = alloca i64*, i64 10 %asp.000 = getelementptr i64*, i64** %astack, i64 0 %bstack = alloca i64, i64 10 @@ -33,22 +39,22 @@ define private i64 @ea1(i64* %n, i64** %globasp) { %asp.001 = getelementptr i64*, i64** %asp.000, i64 1 store i64* %n, i64** %asp.001 - %asp.002 = call i64** @jsr_eval(i64 -0, i64** %asp.001, i64** %asp.000, i64** %globasp) - %bsp.001 = call i64* @pushI_a(i64 -0, i64* %bsp.000, i64** %asp.002) - %asp.003 = call i64** @pop_a1(i64** %asp.002) + %hp.1 = call i64* @jsr_eval(i64 -0, i64** %asp.001, i64** %asp.000, i64** %globasp, i64* %hp.0) + %bsp.001 = call i64* @pushI_a(i64 -0, i64* %bsp.000, i64** %asp.001) + %asp.002 = call i64** @pop_a1(i64** %asp.001) %t.0 = call i64 @peek_b(i64* %bsp.001) %bsp.002 = call i64* @pop_b1(i64* %bsp.001) - %t.1 = tail call i64 @s1(i64 %t.0, i64** %globasp) - ret i64 %t.1 -} + %t.1 = tail call {i64,i64*} @s1(i64 %t.0, i64** %globasp, i64* %hp.1) + %t.2 = extractvalue {i64,i64*} %t.1, 0 + %hp.2 = extractvalue {i64,i64*} %t.1, 1 -define i64 @e_fib_eqI_b_sfib(i64 %arg, i64** %globasp) #0 { - %r = tail call i64 @s1(i64 %arg, i64** %globasp) - ret i64 %r + %ret.0 = insertvalue {i64,i64*} undef, i64 %t.2, 0 + %ret.1 = insertvalue {i64,i64*} %ret.0, i64* %hp.2, 1 + ret {i64,i64*} %ret.1 } -define private i64 @s1(i64 %arg, i64** %globasp) #0 { +define private {i64,i64*} @s1(i64 %arg, i64** %globasp, i64* %hp.0) #0 { %astack = alloca i64*, i64 10000 %asp.000 = getelementptr i64*, i64** %astack %bstack = alloca i64, i64 10000 @@ -76,7 +82,9 @@ case.1: %r.1 = call i64 @peek_b(i64* %bsp.101) %bsp.102 = call i64* @pop_b1(i64* %bsp.101) - ret i64 %r.1 + %ret.0 = insertvalue {i64,i64*} undef, i64 %r.1, 0 + %ret.1 = insertvalue {i64,i64*} %ret.0, i64* %hp.0, 1 + ret {i64,i64*} %ret.1 case.2: %bsp.200 = call i64* @pop_b1(i64* %bsp.005) @@ -85,7 +93,9 @@ case.2: %r.2 = call i64 @peek_b(i64* %bsp.201) %bsp.202 = call i64* @pop_b1(i64* %bsp.201) - ret i64 %r.2 + %ret.2 = insertvalue {i64,i64*} undef, i64 %r.2, 0 + %ret.3 = insertvalue {i64,i64*} %ret.2, i64* %hp.0, 1 + ret {i64,i64*} %ret.3 case.3: %bsp.300 = call i64* @pushI(i64 1, i64* %bsp.005) @@ -94,8 +104,10 @@ case.3: %arg.0 = call i64 @peek_b(i64* %bsp.302) %bsp.302.0 = call i64* @pop_b1(i64* %bsp.302) - %ret.0 = call i64 @s1(i64 %arg.0, i64** %globasp) - %bsp.303 = call i64* @pushI(i64 %ret.0, i64* %bsp.302.0) + %t.4 = call {i64,i64*} @s1(i64 %arg.0, i64** %globasp, i64* %hp.0) + %t.5 = extractvalue {i64,i64*} %t.4, 0 + %hp.1 = extractvalue {i64,i64*} %t.4, 1 + %bsp.303 = call i64* @pushI(i64 %t.5, i64* %bsp.302.0) %bsp.304 = call i64* @pushI(i64 2, i64* %bsp.303) %bsp.305 = call i64* @push_b(i64 2, i64* %bsp.304) @@ -103,8 +115,10 @@ case.3: %arg.1 = call i64 @peek_b(i64* %bsp.306) %bsp.306.0 = call i64* @pop_b1(i64* %bsp.306) - %ret.1 = call i64 @s1(i64 %arg.1, i64** %globasp) - %bsp.307 = call i64* @pushI(i64 %ret.1, i64* %bsp.306.0) + %t.6 = call {i64,i64*} @s1(i64 %arg.1, i64** %globasp, i64* %hp.1) + %t.7 = extractvalue {i64,i64*} %t.6, 0 + %hp.2 = extractvalue {i64,i64*} %t.6, 1 + %bsp.307 = call i64* @pushI(i64 %t.7, i64* %bsp.306.0) %bsp.308 = call i64* @update_b(i64 1, i64 2, i64* %bsp.307) %bsp.309 = call i64* @updatepop_b01(i64* %bsp.308) @@ -113,27 +127,33 @@ case.3: %r.3 = call i64 @peek_b(i64* %bsp.310) %bsp.311 = call i64* @pop_b1(i64* %bsp.310) - ret i64 %r.3 + %ret.4 = insertvalue {i64,i64*} undef, i64 %r.3, 0 + %ret.5 = insertvalue {i64,i64*} %ret.4, i64* %hp.2, 1 + ret {i64,i64*} %ret.5 } define i64 @main() { - %heap = bitcast [10000 x i64]* @heap to i64* + %hp.0 = bitcast [10000 x i64]* @heap to i64* %astack = bitcast [10000 x i64*]* @astack to i64** - %n.0 = getelementptr i64, i64* %heap + %n.0 = getelementptr i64, i64* %hp.0 %INT.0 = ptrtoint {i64, i64, i64*, i64, i8, i8, i8}* @INT to i64 %INT.1 = add i64 %INT.0, 2 store i64 %INT.1, i64* %n.0 %n.0.0 = getelementptr i64, i64* %n.0, i64 1 store i64 43, i64* %n.0.0 + %hp.1 = getelementptr i64, i64* %hp.0, i64 2 - %n.1 = getelementptr i64, i64* %n.0, i64 2 - store i64 ptrtoint (i64*(i64*,i64**)* @e_fib_eqI_b_nfib to i64), i64* %n.1 + %n.1 = getelementptr i64, i64* %hp.1 + store i64 ptrtoint ({i64*,i64*}(i64*,i64**,i64*)* @e_fib_eqI_b_nfib to i64), i64* %n.1 %t.0 = ptrtoint i64* %n.0 to i64 %n.1.0 = getelementptr i64, i64* %n.1, i64 1 store i64 %t.0, i64* %n.1.0 + %hp.2 = getelementptr i64, i64* %hp.0, i64 3 - %n.2 = call i64* @e_fib_eqI_b_nfib(i64* %n.1, i64** %astack) + %t.1 = call {i64*,i64*} @e_fib_eqI_b_nfib(i64* %n.1, i64** %astack, i64* %hp.2) + %n.2 = extractvalue {i64*,i64*} %t.1, 0 + %hp.3 = extractvalue {i64*,i64*} %t.1, 1 %n.3 = getelementptr i64, i64* %n.2, i64 1 %r = load i64, i64* %n.3 @@ -67,7 +67,7 @@ define private i64** @fillI_b(i64 %b_offset, i64 %a_offset, i64* %bsp.0, i64** % ret i64** %asp.0 } -define private i64** @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0) #0 { +define private i64* @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0, i64* %hp.0) #0 { ; TODO in case %n != 0 do we need to push it to the top of the stack? %asp.1 = getelementptr i64*, i64** %asp.0, i64 %n @@ -79,14 +79,16 @@ define private i64** @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %glo br i1 %t.1, label %eval, label %done done: - ret i64** %asp.0 + ret i64* %hp.0 eval: %globasp.1 = call i64** @_push_local_astack(i64** %asp.0, i64** %aspstart, i64** %globasp.0) - %nentry.0 = inttoptr i64 %d.0 to i64*(i64*, i64**)* - %n.1 = call i64* %nentry.0(i64* %n.0, i64** %globasp.1) + %nentry.0 = inttoptr i64 %d.0 to {i64*, i64*} (i64*, i64**, i64*)* + %t.2 = call {i64*, i64*} %nentry.0(i64* %n.0, i64** %globasp.1, i64* %hp.0) + %n.1 = extractvalue {i64*, i64*} %t.2, 0 + %hp.1 = extractvalue {i64*, i64*} %t.2, 1 store i64* %n.1, i64** %asp.1 - ret i64** %asp.0 + ret i64* %hp.1 } define private i64* @ltI(i64* %bsp.0) #0 { @@ -144,7 +146,7 @@ done: ret i64** %asp.1 loop.0: - %n.1 = getelementptr i64, i64* %n.0, i64 %arity + %n.1 = getelementptr i64, i64* %n.0, i64 %arity.0 %n.2 = load i64, i64* %n.1 %n.3 = inttoptr i64 %n.2 to i64* %asp.2 = getelementptr i64*, i64** %asp.1, i64 1 @@ -207,9 +209,9 @@ define private i64 @peek_b(i64* %bsp) #0 { } @INT = constant {i64, i64, i64*, i64, i8, i8, i8} - {i64 0, i64 0, i64* inttoptr (i64 0 to i64*), i64 3, i8 73, i8 78, i8 84} + {i64 0, i64 0, i64* inttoptr (i64 0 to i64*), i64 3, i8 73, i8 78, i8 84}, align 8 -define i64* @_cycle_in_spine(i64** %globasp) prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 0} { +define {i64*,i64*} @_cycle_in_spine(i64** %globasp, i64* %hp.0) align 8 prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 0} { call i64 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @printf_cycle, i64 0, i64 0)) unreachable } |