annotate code/gcc.tp @ 76:47eb447a74cc

Don't chase ghosts we can't catch
author Michael Pavone <pavone@retrodev.com>
date Mon, 28 Jul 2014 02:57:56 -0700
parents ec87d53603dd
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
1 #{
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
2 getTag <- :val {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
3 if: (val isInteger?) {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
4 "INTEGER"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
5 } else: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
6 val tag
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
7 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
8 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
9
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
10 ifError:else <- :val iferr :else {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
11 if: (val isInteger?) {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
12 else:
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
13 } else: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
14 if: (val isError?) {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
15 iferr:
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
16 } else: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
17 else:
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
18 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
19 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
20 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
21
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
22 new <- :rawCode {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
23 consUsage <- 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
24 dataStack <- []
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
25 controlStack <- 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
26 stackSize <- 0
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
27 _pc <- 0
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
28
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
29 error <- :_msg {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
30 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
31 msg <- { _msg }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
32 isInteger? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
33 isError? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
34 isClosure? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
35 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
36 isCons? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
37 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
38 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
39 tag <- { "ERROR" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
40 string <- { _msg }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
41 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
42 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
43 _dummy <- #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
44 isInteger? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
45 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
46 isClosure? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
47 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
48 isCons? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
49 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
50 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
51 tag <- { "DUMMY" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
52 string <- { tag }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
53 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
54
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
55 push <- :val {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
56 dataStack <- val | dataStack
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
57 stackSize <- stackSize + 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
58 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
59
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
60 pop <- {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
61 if: (dataStack empty?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
62 error: "datastack empty"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
63 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
64 ret <- dataStack value
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
65 dataStack <- dataStack tail
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
66 stackSize <- stackSize - 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
67 ret
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
68 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
69 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
70
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
71 _curEnv <- #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
72 ld <- :envNum slotNum {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
73 error: "invalid environment"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
74 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
75 st <- :envNum slotNum val {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
76 error: "invalid environment"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
77 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
78 rapLoad <- {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
79 error: "invalid environment"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
80 }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
81 arr <- { #[] }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
82 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
83 isEnvironment? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
84 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
85 isReturn? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
86 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
87 tag <- { "TOPENV" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
88 string <- { tag }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
89 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
90
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
91 cons <- :_car _cdr {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
92 consUsage <- consUsage + 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
93 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
94 car <- { _car }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
95 cdr <- { _cdr }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
96 isInteger? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
97 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
98 isClosure? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
99 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
100 isCons? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
101 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
102 tag <- { "CONS" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
103 string <- { "(" . _car . ", " . _cdr . ")" }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
105 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
106
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
107
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
108 env:dummy? <- :_size _parent :_dummy? {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
109 consUsage <- consUsage + 1 + _size / 2
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
110 _arr <- #[]
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
111 _hasError <- false
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
112 _error <- false
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
113 if: _size > 0 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
114 _arr resize: _size
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
115 i <- 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
116 while: { i < _size } do: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
117 _arr append: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
118 i <- i + 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
119 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
120
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
121 if: (not: _dummy?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
122 i <- _size - 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
123 while: { (not: _hasError) && i >= 0 } do: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
124 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
125 if: ((not: (val isInteger?)) && (val isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
126 _error <- error: "data stack empty while populating env at slot " . i . " of " . _size
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
127 _hasError <- true
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
128 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
129 _arr set: i val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
130 i <- i - 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
131 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
132 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
133 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
134 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
135 if: _hasError {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
136 _error
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
137 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
138 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
139 != <- :other {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
140 //TODO: implement me properly
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
141 tag != (other tag)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
142 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
143 ld <- :envNum slotNum {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
144 if: envNum > 0 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
145 _parent ld: envNum - 1 slotNum
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
146 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
147 if: _dummy? {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
148 error: "attempt to ld from dummy env"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
149 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
150 if: slotNum < _size {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
151 _arr get: slotNum
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
152 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
153 error: "attempt to access invalid slot " . slotNum . " in env of size " . _size
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
154 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
155 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
156 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
157 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
158 st <- :envNum slotNum val {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
159 if: envNum > 0 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
160 _parent st: envNum - 1 slotNum val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
161 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
162 if: _dummy? {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
163 error: "attempt to st to dummy env"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
164 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
165 if: slotNum < _size {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
166 _arr set: slotNum val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
167 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
168 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
169 error: "attempt to access invalid slot " . slotNum . " in env of size " . _size
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
170 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
172 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
173 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
174 rapLoad <- :rapSize {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
175 if: _dummy? {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
176 if: rapSize != _size {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
177 _hasError <- true
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
178 _error <- error: "frame size mismatch for RAP instruction"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
179 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
180 i <- 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
181 i <- _size - 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
182 while: { (not: _hasError) && i >= 0 } do: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
183 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
184 if: ((not: (val isInteger?)) && (val isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
185 _error <- error: "data stack empty while populating env at slot " . i . " of " . _size
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
186 _hasError <- true
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
187 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
188 _arr set: i val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
189 i <- i - 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
190 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
191 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
192 _dummy? <- false
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
193 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
194 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
195 _hasError <- true
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
196 _error <- error: "attempt to RAP into non-dummy environment"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
197 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
198 if: _hasError { _error } else: { _dummy }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
199 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
200 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
201 isEnvironment? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
202 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
203 isReturn? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
204 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
205 tag <- { "ENVIRONMENT" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
206 string <- { tag }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
207 arr <- { _arr }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
208 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
209 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
210 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
211
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
212
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
213 closure <- :_address {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
214 _env <- _curEnv
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
215 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
216 address <- { _address }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
217 env <- { _env }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
218 isInteger? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
219 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
220 isClosure? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
221 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
222 isCons? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
223 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
224 tag <- { "CLOSURE" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
225 string <- { "{" . _address . ", " . _env . "}" }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
226 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
227 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
228
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
229 joinVal <- :_address {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
230 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
231 address <- { _address }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
232 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
233 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
234 isJoin? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
235 isReturn? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
236 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
237 tag <- { "JOIN" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
238 string <- { tag }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
239 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
240 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
241 return <- :_address {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
242 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
243 address <- { _address }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
244 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
245 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
246 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
247 isReturn? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
248 isStop? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
249 tag <- { "RETURN" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
250 string <- { tag . " " . _address }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
251 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
252 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
253 stop <- #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
254 isError? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
255 isEnvironment? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
256 isJoin? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
257 isReturn? <- { false }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
258 isStop? <- { true }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
259 tag <- { "STOP" }
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
260 string <- { tag }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
261 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
262
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
263 _instConstructors <- dict hash
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
264 _instConstructors set: "LDC" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
265 _const <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
266 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
267 push: _const
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
268 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
269 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
270 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
271 _instConstructors set: "LD" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
272 _env <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
273 _slot <- args get: 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
274 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
275 val <- _curEnv ld: _env _slot
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
276 if: (not: (val isInteger?)) && (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
277 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
278 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
279 push: val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
280 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
281 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
282 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
283 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
284 _instConstructors set: "ST" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
285 _env <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
286 _slot <- args get: 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
287 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
288 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
289 if: (not: (val isInteger?)) && (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
290 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
291 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
292 _curEnv st: _env _slot val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
293 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
294 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
295 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
296
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
297 binaryConstruct <- macro: :name op a b{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
298 quote: (_instConstructors set: name :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
299 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
300 a <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
301 if: (a isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
302 b <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
303 if: (b isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
304 push: op
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
305 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
306 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
307 if: (b isError?) {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
308 b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
309 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
310 error: "Got wrong type for left param of " . name . " instruction"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
311 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
312 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
313 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
314 if: (a isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
315 a
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
316 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
317 error: "Got wrong type for right param of " . name . " instruction"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
318 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
319 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
320 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
321 })
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
322 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
323
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
324 binaryConstruct: "ADD" b + a a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
325 binaryConstruct: "SUB" b - a a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
326 binaryConstruct: "MUL" b * a a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
327 binaryConstruct: "DIV" b / a a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
328 binaryConstruct: "CEQ" (if: b = a { 1 } else: { 0 }) a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
329 binaryConstruct: "CGT" (if: b > a { 1 } else: { 0 }) a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
330 binaryConstruct: "CGTE" (if: b >= a { 1 } else: { 0 }) a b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
331 _instConstructors set: "ATOM" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
332 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
333 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
334 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
335 push: 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
336 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
337 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
338 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
339 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
340 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
341 push: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
342 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
343 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
344 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
345 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
346 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
347 _instConstructors set: "CONS" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
348 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
349 a <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
350 if: ((not: (a isInteger?)) && (a isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
351 a
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
352 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
353 b <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
354 if: ((not: (b isInteger?)) && (b isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
355 b
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
356 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
357 push: (cons: b a)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
358 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
359 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
360 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
361 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
362 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
363 _instConstructors set: "CAR" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
364 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
365 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
366 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
367 error: "CAR expects CONS cell, got INTEGER instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
368 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
369 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
370 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
371 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
372 if: (val isCons?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
373 push: (val car)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
374 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
375 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
376 error: "CAR expects CONS cell, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
377 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
378 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
379 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
380 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
381 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
382 _instConstructors set: "CDR" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
383 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
384 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
385 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
386 error: "CDR expects CONS cell, got integer instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
387 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
388 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
389 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
390 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
391 if: (val isCons?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
392 push: (val cdr)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
393 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
394 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
395 error: "CDR expects CONS cell, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
396 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
397 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
398 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
399 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
400 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
401 _instConstructors set: "SEL" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
402 _t <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
403 _f <- args get: 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
404 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
405 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
406 if: (val isInteger?) {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
407 controlStack <- cons: (joinVal: _pc) controlStack
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
408 _pc <- if: (val != 0) { _t } else: { _f }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
409 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
410 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
411 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
412 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
413 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
414 error: "SEL expects INTEGER, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
415 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
416 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
417 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
418 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
419 _instConstructors set: "TSEL" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
420 _t <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
421 _f <- args get: 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
422 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
423 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
424 if: (val isInteger?) {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
425 _pc <- if: (val != 0) { _t } else: { _f }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
426 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
427 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
428 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
429 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
430 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
431 error: "TSEL expects INTEGER, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
432 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
433 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
434 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
435 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
436 _instConstructors set: "JOIN" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
437 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
438 if: (controlStack isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
439 error: "JOIN tried to pull value from empty control stack"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
440 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
441 val <- controlStack car
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
442 controlStack <- controlStack cdr
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
443 if: (val isJoin?) {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
444 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
445 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
446 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
447 error: "JOIN expects JOIN cell, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
448 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
449 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
450 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
451 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
452 _instConstructors set: "LDF" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
453 _address <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
454 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
455 push: (closure: _address)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
456 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
457 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
458 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
459 _instConstructors set: "AP" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
460 _envSize <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
461 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
462 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
463 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
464 error: "AP expects CLOSURE, got INTEGER instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
465 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
466 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
467 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
468 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
469 if: (val isClosure?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
470 frame <- env: _envSize (val env) dummy?: false
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
471 if: (frame isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
472 frame
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
473 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
474 controlStack <- cons: (return: _pc) (cons: _curEnv controlStack)
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
475 _curEnv <- frame
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
476 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
477 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
478 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
479 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
480 error: "AP expects CLOSURE, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
481 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
482 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
483 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
484 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
485 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
486 _instConstructors set: "TAP" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
487 _envSize <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
488 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
489 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
490 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
491 error: "TAP expects CLOSURE, got INTEGER instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
492 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
493 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
494 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
495 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
496 if: (val isClosure?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
497 frame <- env: _envSize (val env) dummy?: false
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
498 if: (frame isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
499 frame
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
500 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
501 _curEnv <- frame
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
502 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
503 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
504 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
505 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
506 error: "TAP expects CLOSURE, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
507 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
508 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
509 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
510 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
511 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
512 _instConstructors set: "RTN" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
513 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
514 if: (controlStack isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
515 error: "control stack is empty for RTN instruction"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
516 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
517 val <- controlStack car
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
518 controlStack <- controlStack cdr
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
519 if: (val isReturn?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
520 _curEnv <- controlStack car
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
521 controlStack <- controlStack cdr
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
522 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
523 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
524 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
525 if: (val isStop?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
526 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
527 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
528 error: "RTN expects RETURN, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
529 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
530 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
531 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
532 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
533 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
534 _instConstructors set: "DUM" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
535 _envSize <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
536 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
537 frame <- env: _envSize _curEnv dummy?: true
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
538 if: (frame isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
539 frame
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
540 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
541 _curEnv <- frame
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
542 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
543 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
544 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
545 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
546 _instConstructors set: "RAP" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
547 _envSize <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
548 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
549 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
550 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
551 error: "RAP expects CLOSURE, got INTEGER instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
552 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
553 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
554 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
555 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
556 if: (val isClosure?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
557 res <- _curEnv rapLoad: _envSize
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
558 if: (not: (res isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
559 if: (val env) != _curEnv {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
560 res <- error: "CLOSURE environment must equal current environment for RAP"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
561 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
562 controlStack <- cons: (return: _pc) (cons: (_curEnv parent) controlStack)
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
563 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
564 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
565 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
566 res
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
567 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
568 error: "RAP expects CLOSURE, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
569 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
570 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
571 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
572 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
573 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
574 _instConstructors set: "TRAP" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
575 _envSize <- args get: 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
576 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
577 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
578 if: (val isInteger?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
579 error: "RAP expects CLOSURE, got INTEGER instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
580 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
581 if: (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
582 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
583 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
584 if: (val isClosure?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
585 res <- _curEnv rapLoad: _envSize
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
586 if: (not: (res isError?)) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
587 if: (val env) != _curEnv {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
588 res <- error: "CLOSURE environment must equal current environment for RAP"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
589 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
590 _pc <- val address
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
591 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
592 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
593 res
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
594 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
595 error: "RAP expects CLOSURE, got " . (val tag) . " instead"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
596 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
597 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
598 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
599 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
600 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
601 _instConstructors set: "STOP" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
602 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
603 stop
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
604 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
605 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
606 _instConstructors set: "DBUG" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
607 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
608 val <- pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
609 if: (not: (val isInteger?)) && (val isError?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
610 val
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
611 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
612 print: (string: val) . "\n"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
613 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
614 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
615 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
616 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
617 _instConstructors set: "BRK" :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
618 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
619 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
620 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
621 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
622
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
623 code <- rawCode map: :i {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
624 foobar <- _instConstructors get: (i inst) else: { { stop } }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
625 foobar: (i args)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
626 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
627
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
628
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
629 _stepMode? <- false
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
630 _lastCommand <- ""
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
631 _breakFun <- :cpu {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
632 i <- (rawCode get: (cpu pc))
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
633 print: (string: (cpu pc)) . ": " . (i inst) . " " . ((i args) join: " ") . "\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
634
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
635 command <- ""
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
636 while: { command != "c" && command != "s"} do: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
637 command <- ((file stdin) nextLine) trim
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
638 if: command = "" {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
639 command <- _lastCommand
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
640 } else: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
641 _lastCommand <- command
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
642 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
643 if: command = "d" {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
644 print: "Data Stack:\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
645 ds <- cpu dstack
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
646 while: { not: (ds empty?) } do: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
647 print: "\t" . (ds value) . "\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
648 ds <- ds tail
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
649 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
650 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
651 if: command = "b" {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
652 print: "Control Stack:\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
653 cs <- cpu cstack
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
654 while: { not: (cs isInteger?) } do: {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
655 print: "\t" . (cs car) . "\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
656 cs <- cs cdr
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
657 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
658 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
659 if: command = "e" {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
660 print: "Environment:\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
661 env <- cpu environment
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
662 foreach: ((cpu environment) arr) :idx val {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
663 print: "\t" . idx . ": " . val . "\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
664 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
665 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
666 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
667 if: command = "c" {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
668 cpu runMode
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
669 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
670 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
671 _cycles <- 0
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
672 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
673 limit <- 3072 * 1000
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
674 stepMode <- {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
675 _stepMode? <- true
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
676 self
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
677 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
678 runMode <- {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
679 _stepMode? <- false
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
680 self
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
681 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
682 breakFun <- _breakFun
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
683
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
684 pc <- { _pc }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
685 dstack <- { dataStack }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
686 cstack <- { controlStack }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
687 environment <- { _curEnv }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
688 cycles <- { _cycles }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
689
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
690 run <- {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
691 _cycles <- 0
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
692 controlStack <- cons: stop 0
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
693 status <- _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
694 while: { (not: (status isError?)) && (not: (status isStop?)) } do: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
695 if: _stepMode? {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
696 break <- breakFun
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
697 break: self
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
698 }
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
699 if: (_cycles >= limit) {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
700 status <- error: "cycle limit of " . limit . " exceeded"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
701 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
702 if: (_pc >= (code length)) {
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
703 status <- error: "PC walked off end of program"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
704 } else: {
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
705 inst <- code get: _pc
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
706 _pc <- _pc + 1
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
707 status <- inst:
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
708 _cycles <- _cycles + 1
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
709 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
710 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
711 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
712 if: (status isStop?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
713 if: (dataStack empty?) {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
714 _dummy
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
715 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
716 pop:
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
717 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
718 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
719 status
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
720 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
721 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
722 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
723 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
724
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
725 parseLines <- :lines {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
726 //remove comments and filter blank lines
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
727 lines <- (lines map: :line {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
728 ((line partitionOn: ";") before) trim
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
729 }) filter: :line { line != "" }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
730 //parse the preprocessed lines
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
731 lines map: :line {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
732 ret <- line partitionOn: " "
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
733 _inst <- ret before
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
734 _args <- (((ret after) trim) splitOn: " ") map: :arg { int32: arg }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
735 #{
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
736 inst <- { _inst }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
737 args <- { _args }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
738 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
739 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
740 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
741
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
742 parseFile <- :f {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
743 parseLines: (f lines)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
744 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
745
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
746 main <- :args {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
747 if: (args length) > 1 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
748 f <- file open: (args get: 1)
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
749 if: (f fd) >= 0 {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
750 code <- parseFile: f
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
751 cpu <- new: code
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
752 if: (args length) > 2 {
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
753 cpu stepMode
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
754 }
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
755 res <- cpu run
49
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
756 print: "Ran for " . (cpu cycles) . " cycles\n"
ec87d53603dd gcc simulator now works correctly at least for the subset used by ghc.lm and has some primitive debugging facilities
Michael Pavone <pavone@retrodev.com>
parents: 43
diff changeset
757 print: "Returned value of type: " . (getTag: res) . " - value: " . res . "\n"
43
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
758 0
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
759 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
760 (file stderr) write: "Failed to open " . (args get: 1) . " for reading\n"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
761 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
762 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
763 } else: {
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
764 (file stderr) write: "USAGE: gcc FILE\n"
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
765 1
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
766 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
767 }
6d2cbad5fca9 WIP version of a compiler for the LamCo GCC
Michael Pavone <pavone@retrodev.com>
parents:
diff changeset
768 }