Mercurial > repos > tabletprog
annotate modules/llcompile.tp @ 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
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 14 Apr 2015 19:54:03 -0700 |
parents | f74ce841fd1e |
children | a6cdcc1b1c02 |
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 { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 ilf add: (ingen: lv rv (dest val) _size) |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
130 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
131 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
132 size <- _size |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
133 signed? <- _signed |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
135 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
136 _compOps ifget: (expr op) :condFun { |
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
|
137 if: (rv isInteger?) { |
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
|
138 tmp <- rv |
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
|
139 rv <- ilf getReg |
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
|
140 ilf add: (il mov: tmp rv rs) |
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
|
141 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
142 ilf add: (il cmp: lv rv _size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
143 cond <- condFun: _signed |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
144 ilf add: (il bool: cond (dest val)) |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 #{ |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
146 val <- dest val |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 size <- il b |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
148 signed? <- false |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
150 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
151 _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
|
152 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
153 } |
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 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 _compileString <- :expr syms ilf assignTo { |
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 _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
|
160 sz <- il sizeFromBytes: (expr size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
161 assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
162 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
|
163 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
164 val <- asn val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
165 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
166 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
167 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
168 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
169 #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
170 val <- expr val |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
171 signed? <- expr signed? |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
172 size <- sz |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
173 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
174 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 _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
|
177 syms ifDefined: (expr name) :syminfo { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
178 if: (syminfo isLocal?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
179 syminfo def |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
180 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
181 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
|
182 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 } else: { |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 _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
|
185 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
187 _compileIf <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
188 if: ((expr args) length) != 2 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
189 _compileError: "if takes exactly 2 arguments" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
190 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
191 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
192 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
193 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
194 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
195 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
196 _compileError: "second argument to if must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
197 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
198 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
|
199 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
200 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
201 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
202 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
203 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
204 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
205 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
206 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
207 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
208 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
209 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
210 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
|
211 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
|
212 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
213 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
214 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
215 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
216 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
217 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
218 block <- ilf popBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
219 ilf add: (il skipIf: (il neq) block) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
220 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
221 } |
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 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
224 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
225 _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
|
226 if: ((expr args) length) != 3 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
227 _compileError: "if:else takes exactly 3 arguments" 0 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
228 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
229 condArg <- (expr args) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
230 blockArg <- ((expr args) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
231 elseArg <- (((expr args) tail) tail) value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
232 cond <- _compileExpr: condArg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
233 _notError: [cond] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
234 if: (blockArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
235 _compileError: "second argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
236 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
237 if: (elseArg nodeType) != (ast lambda) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
238 _compileError: "third argument to if:else must be a lambda" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
239 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
240 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
|
241 dest <- if: (assignTo none?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
242 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
243 val <- ilf reg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
244 //TODO: FIXME |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
245 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
246 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
247 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
248 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
249 assignTo |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
250 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
251 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
252 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
|
253 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
|
254 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
255 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
256 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
257 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
258 _compileExpr: expr syms: syms ilfun: ilf dest: asn |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
259 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
260 block <- ilf popBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
261 ilf startBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
262 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
|
263 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
|
264 dest |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
265 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
266 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
267 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
268 _compileExpr: expr syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
269 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
270 elseblock <- ilf popBlock |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
271 ilf add: (il skipIf: (il neq) block else: elseblock) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
272 dest value: :d { d } none: { _compileError: "Something went wrong" } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
273 } |
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 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
276 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
277 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
278 _funMap <- false |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
279 _compileCall <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
280 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
|
281 handler <- _funMap get: ((expr tocall) name) else: { false } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
282 handler: expr syms ilf assignTo |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
283 } else: { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
284 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
|
285 ctocall <- (expr tocall) name |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
286 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
287 _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
|
288 } |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
289 cargs <- (expr args) map: :arg { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
290 _compileExpr: arg syms: syms ilfun: ilf dest: (option none) |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
291 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
292 _notError: ctocall | cargs { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
293 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
|
294 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
295 retval <- assignTo value: :asn { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
296 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
|
297 asn |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
298 } none: { |
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 val <- il retr |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
301 //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
|
302 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
303 signed? <- true |
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 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
306 retval |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
307 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
308 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
309 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
310 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
311 _compileAssign <- :expr syms ilf assignTo { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
312 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
|
313 _notError: [dest] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
314 value <- _compileExpr: (expr assign) syms: syms ilfun: ilf dest: dest |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
315 _notError: [value] { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
316 //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
|
317 //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
|
318 value |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
319 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
320 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
321 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
322 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
323 _initDone? <- false |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
324 #{ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
325 import: [ |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
326 binary |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
327 stringlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
328 intlit |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
329 sym |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
330 call |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
331 obj |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
332 sequence |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
333 assignment |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
334 lambda |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
335 ] from: ast |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
336 _initHandlers <- { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
337 if: (not: _initDone?) { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
338 _exprHandlers <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
339 _exprHandlers set: binary _compileBinary |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
340 _exprHandlers set: stringlit _compileString |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
341 _exprHandlers set: intlit _compileInt |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
342 _exprHandlers set: sym _compileSym |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
343 _exprHandlers set: assignment _compileAssign |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
344 _exprHandlers set: call _compileCall |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
345 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
346 _opMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
347 mapOp <- macro: :op ilfun { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
348 quote: (_opMap set: op :ina inb out size { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
349 il ilfun: ina inb out size |
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 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
352 mapOp: "+" add |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
353 mapOp: "-" sub |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
354 mapOp: "*" mul |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
355 mapOp: "/" div |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
356 mapOp: "and" band |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
357 mapOp: "or" bor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
358 mapOp: "xor" bxor |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
359 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
360 _compOps <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
361 _compOps set: "=" :signed? { il eq } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
362 _compOps set: "!=" :signed? { il ne } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
363 _compOps set: ">" :signed? { if: signed? { il gr } else: { il ugr } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
364 _compOps set: "<" :signed? { if: signed? { il ls } else: { il uls } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
365 _compOps set: ">=" :signed? { if: signed? { il ge } else: { il uge } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
366 _compOps set: "<=" :signed? { if: signed? { il le } else: { il ule } } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
367 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
368 _funMap <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
369 _funMap set: "if" _compileIf |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
370 _funMap set: "if:else" _compileIfElse |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
371 //_funMap set: "while:do" _compileWhileDo |
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 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
374 |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
375 llFun:syms:vars:code <- :name :syms :vars :code{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
376 _initHandlers: |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
377 syms <- symbols tableWithParent: syms |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
378 argnames <- dict hash |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
379 foreach: (code args) :idx arg { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
380 if: (arg startsWith?: ":") { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
381 arg <- arg from: 1 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
382 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
383 argnames set: arg idx |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
384 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
385 ilf <- _ilFun: name |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
386 _nextReg <- 0 |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
387 varErrors <- (vars expressions) fold: [] with: :acc var { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
388 type <- _parseType: (var assign) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
389 _notError: [type] { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
390 varname <- ((var to) name) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
391 v <- argnames ifget: varname :argnum { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
392 il arg: argnum |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
393 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
394 ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
395 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
396 syms define: varname #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
397 val <- v |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
398 size <- (type size) |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
399 signed? <- (type signed?) |
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 acc |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
402 } else: :err { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
403 err | acc |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
404 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
405 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
406 if: (varErrors empty?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
407 last <- option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
408 numexprs <- (code expressions) length |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
409 foreach: (code expressions) :idx expr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
410 asn <- if: idx = numexprs - 1 { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
411 option value: #{ |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
412 val <- ilf getReg |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
413 //TODO: FIxme |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
414 size <- il q |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
415 signed? <- true |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
416 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
417 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
418 option none |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
419 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
420 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
|
421 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
422 last value: :v { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
423 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
|
424 } none: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
425 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
|
426 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
427 ilf |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
428 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
429 varErrors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
430 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
431 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
432 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
433 compileText <- :text { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
434 res <- parser top: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
435 if: res { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
436 tree <- res yield |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
437 if: (tree nodeType) = obj { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
438 errors <- [] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
439 syms <- symbols table |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
440 functions <- (tree messages) fold: [] with: :curfuncs msg { |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
441 if: (msg nodeType) = call { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
442 if: ((msg tocall) name) = "llFun:withVars:andCode" { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
443 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
|
444 fname <- ((msg args) value) name |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
445 syms define: fname #{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
446 type <- "topfun" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
447 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
448 rest <- (msg args) tail |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
449 #{ |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
450 name <- fname |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
451 vars <- rest value |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
452 body <- (rest tail) value |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
453 } | curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
454 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
455 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
456 _compileError: "llFun:withVars:andCode takes exactly 3 arguments" 0 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
457 ) | errors |
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 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
460 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
461 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
462 _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
|
463 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
464 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
465 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
466 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
467 errors <- ( |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
468 _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
|
469 ) | errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
470 curfuncs |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
471 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
472 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
473 if: (errors empty?) { |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
474 errors <- [] |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
475 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
|
476 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
|
477 _notError: ilf { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
478 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
|
479 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
480 errors <- ilf . errors |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
481 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
482 acc |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
483 } |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
484 if: (errors empty?) { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
485 foreach: fmap :name instarr { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
486 print: "Function: " . name . "\n" |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
487 foreach: instarr :_ inst { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
488 print: "\t" . inst . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
489 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
490 } |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
491 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
|
492 il toBackend: fmap x86 |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
493 } else: { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
494 errors |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
495 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
496 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
497 errors |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
498 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
499 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
500 [(_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
|
501 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
502 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
503 [(_compileError: "Failed to parse file" 0)] |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
504 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
505 } |
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 main <- :args { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
508 if: (length: args) > 1 { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
509 text <- (file open: (args get: 1)) readAll |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
510 mcode <- compileText: text |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
511 _notError: mcode { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
512 ba <- bytearray executableFromBytes: mcode |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
513 arg <- if: (length: args) > 2 { int32: (args get: 2) } else: {0} |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
514 ba runWithArg: (arg i64) |
352
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
515 } else: :err { |
f74ce841fd1e
Produce something resembling correct il from low level dialect
Michael Pavone <pavone@retrodev.com>
parents:
315
diff
changeset
|
516 (file stderr) write: (err msg) . "\n" |
315
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
517 } |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
518 } else: { |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
519 (file stderr) write: "Usage: llcompile FILE\n" |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
520 1 |
f987bb2a1911
WIP native compiler work
Michael Pavone <pavone@retrodev.com>
parents:
310
diff
changeset
|
521 } |
310
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
522 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
523 } |
2308336790d4
WIP compiler module for low-level dialect
Michael Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
524 } |