Mercurial > repos > icfp2014
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 |
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 } |