aboutsummaryrefslogtreecommitdiff
path: root/rts.ll
diff options
context:
space:
mode:
Diffstat (limited to 'rts.ll')
-rw-r--r--rts.ll59
1 files changed, 36 insertions, 23 deletions
diff --git a/rts.ll b/rts.ll
index c625a9f..c0f4a86 100644
--- a/rts.ll
+++ b/rts.ll
@@ -53,19 +53,24 @@ loop.0:
br label %loop
}
-; TODO remove only the used positions
-define private void @_cleanup_global_astack(i64** %globasp.0) noinline optnone {
- %globasp.0.1 = getelementptr i64*, i64** %globasp.0, i64 1
- %globasp.0.2 = getelementptr i64*, i64** %globasp.0, i64 2
- %globasp.0.3 = getelementptr i64*, i64** %globasp.0, i64 3
- %globasp.0.4 = getelementptr i64*, i64** %globasp.0, i64 4
- %globasp.0.5 = getelementptr i64*, i64** %globasp.0, i64 5
- store i64* undef, i64** %globasp.0.1
- store i64* undef, i64** %globasp.0.2
- store i64* undef, i64** %globasp.0.3
- store i64* undef, i64** %globasp.0.4
- store i64* undef, i64** %globasp.0.5
- ret void
+define private i64** @_pop_global_astack(i64** %asp, i64** %aspstart.0, i64** %globasp.0) noinline optnone {
+entry:
+ br label %loop
+
+loop:
+ %aspstart = phi i64** [%aspstart.0, %entry], [%aspstart.1, %loop.0]
+ %globasp = phi i64** [%globasp.0, %entry], [%globasp.1, %loop.0]
+ %t.0 = icmp eq i64** %aspstart, %asp
+ br i1 %t.0, label %done, label %loop.0
+done:
+ ret i64** %globasp
+
+loop.0:
+ %n = load i64*, i64** %globasp
+ %aspstart.1 = getelementptr i64*, i64** %aspstart, i64 1
+ store i64* %n, i64** %aspstart.1
+ %globasp.1 = getelementptr i64*, i64** %globasp, i64 -1
+ br label %loop
}
define private i64* @addI(i64* %bsp.0) #0 {
@@ -155,7 +160,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, i64* %hp.0) #0 {
+define private {i64*,i64**} @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %globasp.0, i64* %hp.0) #0 {
%asp.1 = getelementptr i64*, i64** %asp.0, i64 %n
%n.0 = load i64*, i64** %asp.1
@@ -166,17 +171,23 @@ define private i64* @jsr_eval(i64 %n, i64** %asp.0, i64** %aspstart, i64** %glob
br i1 %t.1, label %eval, label %done
done:
- ret i64* %hp.0
+ %r.0 = insertvalue {i64*,i64**} undef, i64* %hp.0, 0
+ %r.1 = insertvalue {i64*,i64**} %r.0, i64** %globasp.0, 1
+ ret {i64*,i64**} %r.1
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*, i64**, i64*)*
- %t.2 = call {i64*, i64*} %nentry.0(i64* %hp.0, i64** %globasp.1, i64* %n.0)
- call void @_cleanup_global_astack(i64** %globasp.0)
- %hp.1 = extractvalue {i64*, i64*} %t.2, 0
- %n.1 = extractvalue {i64*, i64*} %t.2, 1
- store i64* %n.1, i64** %asp.1
- ret i64* %hp.1
+ %nentry.0 = inttoptr i64 %d.0 to {i64*,i64**,i64*} (i64*, i64**, i64*)*
+ %t.2 = call {i64*,i64**,i64*} %nentry.0(i64* %hp.0, i64** %globasp.1, i64* %n.0)
+ %hp.1 = extractvalue {i64*,i64**,i64*} %t.2, 0
+ %globasp.2 = extractvalue {i64*,i64**,i64*} %t.2, 1
+ %n.1 = extractvalue {i64*,i64**,i64*} %t.2, 2
+ %globasp.3 = call i64** @_pop_global_astack(i64** %asp.0, i64** %aspstart, i64** %globasp.2)
+ store i64* %n.1, i64** %asp.1 ; TODO this may not be needed?
+
+ %r.2 = insertvalue {i64*,i64**} undef, i64* %hp.1, 0
+ %r.3 = insertvalue {i64*,i64**} %r.2, i64** %globasp.3, 1
+ ret {i64*,i64**} %r.3
}
define private i64* @ltI(i64* %bsp.0) #0 {
@@ -307,7 +318,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}, align 8
-define {i64*,i64*} @_cycle_in_spine(i64** %globasp, i64* %hp.0) align 8 prefix {i8*, i64} {i8* inttoptr (i64 0 to i8*), i64 0} {
+define {i64*,i64**,i64*} @_cycle_in_spine(i64* %hp, i64** %globasp)
+ 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
}