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