Mercurial > repos > tabletprog
annotate modules/llcompile.tp @ 357:f237d0cae58b
llcompile now works well enough for the a simple fib program to work
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 16 Apr 2015 08:46:35 -0700 |
parents | 3b023e5a0b42 |
children | 0b83f15e819d |
rev | line source |
---|---|
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 _compileError <- :_msg _line { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 isError? <- { true } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 msg <- { _msg } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 line <- { _line } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
10 _notError:else <- :vals ifnoterr iferror { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
11 if: (object does: vals understand?: "find") { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
12 maybeErr <- vals find: :val { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
13 (object does: val understand?: "isError?") && (val isError?) |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
14 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
15 maybeErr value: :err { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
16 iferror: err |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
17 } none: ifnoterr |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
18 } else: ifnoterr |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
20 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
21 _notError <- :vals ifnoterr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
22 _notError: vals ifnoterr else: :e { e } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
23 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 _ilFun <- :_name { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 _buff <- #[] |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
27 _blockStack <- [] |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 _nextReg <- 0 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 name <- { _name } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 add <- :inst { _buff append: inst } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 getReg <- { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 r <- il reg: _nextReg |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 _nextReg <- _nextReg + 1 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 r |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
37 startBlock <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
38 _blockStack <- _buff | _blockStack |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
39 _buff <- #[] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
40 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
41 popBlock <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
42 res <- _buff |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
43 _buff <- _blockStack value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
44 _blockStack <- _blockStack tail |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
45 res |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
46 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
47 buffer <- { _buff } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
50 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
51 _sizeMap <- dict hash |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
52 _sizeMap set: "8" (il b) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
53 _sizeMap set: "16" (il w) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
54 _sizeMap set: "32" (il l) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
55 _sizeMap set: "64" (il q) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
56 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
57 _parseType <- :expr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
58 if: (expr nodeType) = (ast sym) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
59 name <- expr name |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
60 _signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
61 if: (name startsWith?: "u") { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
62 _signed? <- false |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
63 name <- name from: 1 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
64 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
65 if: (name startsWith?: "int") && ((name length) <= 5) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
66 size <- name from: 3 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
67 _sizeMap ifget: size :llsize { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
68 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
69 size <- llsize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
70 signed? <- _signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
71 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
72 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
73 _compileError: "LL integer type " . (expr name) . " has an invalid size" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
74 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
75 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
76 _compileError: "LL Type " . (expr name) . " not implemented yet" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
77 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
78 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
79 _compileError: "LL Type with node type " . (expr nodeType) . " not implemented yet" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
80 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
81 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
83 _exprHandlers <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 _compileExpr:syms:ilfun:dest <- :expr :syms :ilf :dst { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 _exprHandlers ifget: (expr nodeType) :handler { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 handler: expr syms ilf dst |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 _compileError: "Expression with node type " . (expr nodeType) . " not implemented yet" |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
91 _opMap <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
93 _compOps <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 _compileBinary <- :expr syms ilf assignTo { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 _assignSize? <- false |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
97 _asize <- il b |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
98 dest <- assignTo value: :asn { |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
99 _assignSize? <- true |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
100 _asize <- asn size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
101 asn |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
102 } none: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
103 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
104 val <- ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
105 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
106 size <- _asize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
107 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
108 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
109 l <- _compileExpr: (expr left) syms: syms ilfun: ilf dest: (option value: dest) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
110 r <- _compileExpr: (expr right) syms: syms ilfun: ilf dest: (option none) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
111 _notError: [(l) (r)] { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
112 lv <- l val |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
113 ls <- l size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
114 rv <- r val |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
115 rs <- r size |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
116 _size <- if: ls > rs { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
117 ls |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
118 //TODO: sign/zero extend rv |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
119 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
120 rs |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
121 //TODO: sign/zero extend lv if rs > ls |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
122 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
123 if: _assignSize? && _asize > _size { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
124 _size <- _asize |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
125 //TODO: sign/zero extend result |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
126 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
127 _signed <- (l signed?) || (r signed?) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 _opMap ifget: (expr op) :ingen { |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
129 if: (lv isInteger?) { |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
130 tmp <- lv |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
131 lv <- ilf getReg |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
132 ilf add: (il mov: tmp lv ls) |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
133 } |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
134 ilf add: (ingen: rv lv (dest val) _size) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
136 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 size <- _size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
138 signed? <- _signed |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
139 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
141 _compOps ifget: (expr op) :condFun { |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
142 if: (lv isInteger?) { |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
143 tmp <- lv |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
144 lv <- ilf getReg |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
145 ilf add: (il mov: tmp lv ls) |
353
95bc24c729e6
Move right hand parameter to cmp in _compileBinary to a temp reg if it is a constant since those are only supported in the left hand param currently
Michael Pavone <pavone@retrodev.com>
parents:
352
diff
changeset
|
146 } |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
147 ilf add: (il cmp: rv lv _size) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
148 cond <- condFun: _signed |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
149 ilf add: (il bool: cond (dest val)) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
151 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
152 size <- il b |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 signed? <- false |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
154 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
155 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 _compileError: "Operator " . (expr op) . " is not supported yet\n" 0 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
157 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
160 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 _compileString <- :expr syms ilf assignTo { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
162 |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
164 _compileInt <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
165 sz <- il sizeFromBytes: (expr size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
166 assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
167 ilf add: (il mov: (expr val) (asn val) sz) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
168 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
169 val <- asn val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
170 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
171 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
172 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
173 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
174 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
175 val <- expr val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
176 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
177 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
178 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
179 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
180 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
181 _compileSym <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
182 syms ifDefined: (expr name) :syminfo { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
183 if: (syminfo isLocal?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
184 syminfo def |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
185 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
186 print: "Symbol " . (expr name) . " is not local and other types are not yet supported in LL dialect\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
187 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
188 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
189 _compileError: "Symbol " . (expr name) . " is not defined in " . (ilf name) |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
190 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
191 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
192 _compileIf <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
193 if: ((expr args) length) != 2 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
194 _compileError: "if takes exactly 2 arguments" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
195 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
196 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
197 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
198 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
199 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
200 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
201 _compileError: "second argument to if must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
202 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
203 ilf add: (il cmp: 0 (cond val) (cond size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
204 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
205 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
206 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
207 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
208 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
209 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
210 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
211 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
212 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
213 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
214 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
215 foreach: (blockArg expressions) :idx expr{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
216 asn <- if: idx = ((blockArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
217 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
218 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
219 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
220 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
221 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
222 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
223 block <- ilf popBlock |
356
3b023e5a0b42
llcompile almost working well enough for fib sample
Michael Pavone <pavone@retrodev.com>
parents:
354
diff
changeset
|
224 ilf add: (il skipIf: (il eq) block) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
225 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
226 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
227 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
228 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
229 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
230 _compileIfElse <- :expr syms ilf assignTo { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
231 if: ((expr args) length) != 3 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
232 _compileError: "if:else takes exactly 3 arguments" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
233 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
234 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
235 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
236 elseArg <- (((expr args) tail) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
237 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
238 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
239 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
240 _compileError: "second argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
241 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
242 if: (elseArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
243 _compileError: "third argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
244 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
245 ilf add: (il cmp: 0 (cond val) (cond size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
246 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
247 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
248 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
249 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
250 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
251 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
252 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
253 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
254 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
255 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
256 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
257 foreach: (blockArg expressions) :idx expr { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
258 asn <- if: idx = ((blockArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
259 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
260 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
261 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
262 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
263 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
264 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
265 block <- ilf popBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
266 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
267 foreach: (elseArg expressions) :idx expr { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
268 asn <- if: idx = ((elseArg expressions) length) - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
269 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
270 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
271 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
272 } |
357
f237d0cae58b
llcompile now works well enough for the a simple fib program to work
Michael Pavone <pavone@retrodev.com>
parents:
356
diff
changeset
|
273 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
274 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
275 elseblock <- ilf popBlock |
356
3b023e5a0b42
llcompile almost working well enough for fib sample
Michael Pavone <pavone@retrodev.com>
parents:
354
diff
changeset
|
276 ilf add: (il skipIf: (il eq) block else: elseblock) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
277 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
278 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
279 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
280 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
281 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
282 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
283 _funMap <- false |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
284 _compileCall <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
285 if: ((expr tocall) nodeType) = (ast sym) && (_funMap contains?: ((expr tocall) name)) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
286 handler <- _funMap get: ((expr tocall) name) else: { false } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
287 handler: expr syms ilf assignTo |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
288 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
289 ctocall <- if: ((expr tocall) nodeType) = (ast sym) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
290 ctocall <- (expr tocall) name |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
291 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
292 _compileExpr: (expr tocall) syms: syms ilfun: ilf dest: (option none) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
293 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
294 cargs <- (expr args) map: :arg { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
295 _compileExpr: arg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
296 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
297 _notError: ctocall | cargs { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
298 ilf add: (il call: ctocall withArgs: (cargs map: :arg { arg val } )) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
299 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
300 retval <- assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
301 ilf add: (il mov: (il retr) (asn val) (asn size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
302 asn |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
303 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
304 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
305 val <- il retr |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
306 //TODO: Use correct values based on return type |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
307 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
308 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
309 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
310 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
311 retval |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
312 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
313 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
314 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
315 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
316 _compileAssign <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
317 dest <- _compileExpr: (expr to) syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
318 _notError: [dest] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
319 value <- _compileExpr: (expr assign) syms: syms ilfun: ilf dest: dest |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
320 _notError: [value] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
321 //TODO: adjust size of value if necessary |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
322 //ilf add: (il mov: (value val) (dest val) (dest size)) |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
323 value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
324 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
325 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
326 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
327 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
328 _initDone? <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
329 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 import: [ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 binary |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 stringlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
333 intlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 sym |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 call |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
336 obj |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
337 sequence |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
338 assignment |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
339 lambda |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
340 ] from: ast |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
341 _initHandlers <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
342 if: (not: _initDone?) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
343 _exprHandlers <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
344 _exprHandlers set: binary _compileBinary |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
345 _exprHandlers set: stringlit _compileString |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
346 _exprHandlers set: intlit _compileInt |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
347 _exprHandlers set: sym _compileSym |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
348 _exprHandlers set: assignment _compileAssign |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
349 _exprHandlers set: call _compileCall |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
350 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
351 _opMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
352 mapOp <- macro: :op ilfun { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
353 quote: (_opMap set: op :ina inb out size { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
354 il ilfun: ina inb out size |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
355 }) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
356 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
357 mapOp: "+" add |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
358 mapOp: "-" sub |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
359 mapOp: "*" mul |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
360 mapOp: "/" div |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
361 mapOp: "and" band |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
362 mapOp: "or" bor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
363 mapOp: "xor" bxor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
364 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
365 _compOps <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
366 _compOps set: "=" :signed? { il eq } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
367 _compOps set: "!=" :signed? { il ne } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
368 _compOps set: ">" :signed? { if: signed? { il gr } else: { il ugr } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
369 _compOps set: "<" :signed? { if: signed? { il ls } else: { il uls } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
370 _compOps set: ">=" :signed? { if: signed? { il ge } else: { il uge } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
371 _compOps set: "<=" :signed? { if: signed? { il le } else: { il ule } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
372 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
373 _funMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
374 _funMap set: "if" _compileIf |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
375 _funMap set: "if:else" _compileIfElse |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
376 //_funMap set: "while:do" _compileWhileDo |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
377 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
378 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
379 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
380 llFun:syms:vars:code <- :name :syms :vars :code{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
381 _initHandlers: |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
382 syms <- symbols tableWithParent: syms |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
383 argnames <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
384 foreach: (code args) :idx arg { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
385 if: (arg startsWith?: ":") { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
386 arg <- arg from: 1 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
387 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
388 argnames set: arg idx |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
389 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
390 ilf <- _ilFun: name |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
391 _nextReg <- 0 |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
392 varErrors <- (vars expressions) fold: [] with: :acc var { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
393 type <- _parseType: (var assign) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
394 _notError: [type] { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
395 varname <- ((var to) name) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
396 v <- argnames ifget: varname :argnum { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
397 il arg: argnum |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
398 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
399 ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
400 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
401 syms define: varname #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
402 val <- v |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
403 size <- (type size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
404 signed? <- (type signed?) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
405 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
406 acc |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
407 } else: :err { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
408 err | acc |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
409 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
410 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
411 if: (varErrors empty?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
412 last <- option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
413 numexprs <- (code expressions) length |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
414 foreach: (code expressions) :idx expr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
415 asn <- if: idx = numexprs - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
416 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
417 val <- ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
418 //TODO: FIxme |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
419 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
420 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
421 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
422 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
423 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
424 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
425 last <- option value: (_compileExpr: expr syms: syms ilfun: ilf dest: asn) |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
426 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
427 last value: :v { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
428 ilf add: (il return: (v val) (v size)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
429 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
430 ilf add: (il return: 0 (il l)) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
431 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
432 ilf |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
433 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
434 varErrors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
435 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
436 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
437 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
438 compileText <- :text { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
439 res <- parser top: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
440 if: res { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
441 tree <- res yield |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
442 if: (tree nodeType) = obj { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
443 errors <- [] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
444 syms <- symbols table |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
445 functions <- (tree messages) fold: [] with: :curfuncs msg { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
446 if: (msg nodeType) = call { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
447 if: ((msg tocall) name) = "llFun:withVars:andCode" { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
448 if: ((msg args) length) = 3 { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
449 fname <- ((msg args) value) name |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
450 syms define: fname #{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
451 type <- "topfun" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
452 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
453 rest <- (msg args) tail |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
454 #{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
455 name <- fname |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
456 vars <- rest value |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
457 body <- (rest tail) value |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
458 } | curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
459 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
460 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
461 _compileError: "llFun:withVars:andCode takes exactly 3 arguments" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
462 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
463 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
464 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
465 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
466 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
467 _compileError: "Only llFun:withVars:andCode expressions are allowed in top level object" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
468 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
469 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
470 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
471 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
472 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
473 _compileError: "Only call expresions are allowed in top level object" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
474 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
475 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
476 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
477 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
478 if: (errors empty?) { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
479 errors <- [] |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
480 fmap <- functions fold: (dict hash) with: :acc func { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
481 ilf <- llFun: (func name) syms: syms vars: (func vars) code: (func body) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
482 _notError: ilf { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
483 acc set: (func name) (ilf buffer) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
484 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
485 errors <- ilf . errors |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
486 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
487 acc |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
488 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
489 if: (errors empty?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
490 foreach: fmap :name instarr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
491 print: "Function: " . name . "\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
492 foreach: instarr :_ inst { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
493 print: "\t" . inst . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
494 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
495 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
496 print: "Translating IL to x86\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
497 il toBackend: fmap x86 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
498 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
499 errors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
500 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
501 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
502 errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
503 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
504 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
505 [(_compileError: "Top level must be an object in llcompile dialect" 1)] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
506 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
507 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
508 [(_compileError: "Failed to parse file" 0)] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
509 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
510 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
511 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
512 main <- :args { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
513 if: (length: args) > 1 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
514 text <- (file open: (args get: 1)) readAll |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
515 mcode <- compileText: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
516 _notError: mcode { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
517 ba <- bytearray executableFromBytes: mcode |
357
f237d0cae58b
llcompile now works well enough for the a simple fib program to work
Michael Pavone <pavone@retrodev.com>
parents:
356
diff
changeset
|
518 arg <- if: (length: args) > 2 { int64: (args get: 2) } else: {0} |
354
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
519 res <- ba runWithArg: (arg int64) |
a6cdcc1b1c02
Fix il and llcompile modules enough that it actually attempts to run the compiled program
Michael Pavone <pavone@retrodev.com>
parents:
353
diff
changeset
|
520 print: (string: res) . "\n" |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
521 } else: :err { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
522 (file stderr) write: (err msg) . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
523 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
524 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
525 (file stderr) write: "Usage: llcompile FILE\n" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
526 1 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
527 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
528 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
529 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
530 } |