Skip to content

Commit 6166a58

Browse files
Merge pull request #217 from andrew-johnson-4/strict-compiler-dev-3
Strict compiler dev 3
2 parents 31172c8 + 9fbc9c2 commit 6166a58

File tree

11 files changed

+388
-58
lines changed

11 files changed

+388
-58
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "lambda_mountain"
3-
version = "1.11.80"
3+
version = "1.11.81"
44
authors = ["Andrew <andrew@subarctic.org>"]
55
license = "MIT"
66
description = "Lambda Mountain"

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
nostd: prod
3-
./production --nostd -o tmp.s tests/strict/match2.lm
3+
./production --nostd -o tmp.s tests/strict/ifeq.lm
44
as -o tmp.o tmp.s
55
ld -o tmp tmp.o
66
./tmp && echo $?

PRODUCTION/codegen-strict.lm

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,17 @@ compile-expr-strict := λctx e offset used . (tail(
101101
(set e1 (compile-expr-strict( ctx cond offset Used )))
102102
(set e2 (compile-expr-strict( (expr::get-context e1) t offset Used )))
103103
(set e3 (compile-expr-strict( ctx f offset Used )))
104-
(assert-eq( 'strict-compile-expr::while::ConditionMustBeBranchConditional (expr::get-type e1) BranchConditional ))
104+
(match (expr::get-type e1) (
105+
()
106+
(BranchConditional ())
107+
( _ (tail(
108+
(set e1 (expr::set-prog( e1 (
109+
(expr::get-prog e1)
110+
\t 'cmp \s '$1 , \s '%rax \n
111+
))))
112+
(set e1 (expr::set-expr( e1 'je )))
113+
)))
114+
))
105115
(set e4 e1)
106116
(local label-true-branch)
107117
(set label-true-branch (uuid()))

PRODUCTION/typecheck.lm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ typecheck-infer-ctx := λctx e . (match e (
269269
ctx
270270
))
271271
( u (
272-
fail (UnknownLhs u)
272+
fail (UnknownLhsInferCtx u)
273273
))
274274
));
275275

@@ -325,7 +325,7 @@ typecheck-typeof-lhs := λlhs . (match lhs (
325325
Nil
326326
))
327327
( u (
328-
fail (UnknownLhs u)
328+
fail (UnknownLhsTypeofLhs u)
329329
))
330330
));
331331

STDLIB/default-instruction-set.lm

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,15 +54,26 @@ fragment push := λ(: src GlobalVariable+Sized<size>). (: (
5454
))
5555
) Nil);
5656
fragment push := λ(: src LocalVariable+Sized<size>). (: (
57-
(.program ( for word-offset in (range( 0 (/( size 8 )) )) (
58-
\t 'pushq \s (+(
59-
(.expression src)
60-
(+(
61-
(+( size '-8 ))
62-
(inv(*( word-offset 8 )))
63-
))
64-
)) \[ '%rbp \] \n
65-
)))
57+
(.program (
58+
(for word-offset in (range( 0 (/( size 8 )) )) (
59+
\t 'pushq \s (+(
60+
(.expression src)
61+
(+(
62+
(+( size '-8 ))
63+
(inv(*( word-offset 8 )))
64+
))
65+
)) \[ '%rbp \] \n
66+
))
67+
(if-eq size 4 (
68+
\t 'pushq \s (.expression src) \[ '%rbp \] \n
69+
))
70+
(if-eq size 2 (
71+
\t 'pushq \s (.expression src) \[ '%rbp \] \n
72+
))
73+
(if-eq size 1 (
74+
\t 'pushq \s (.expression src) \[ '%rbp \] \n
75+
))
76+
))
6677
) Nil);
6778
fragment pop := λ(: src LocalVariable+Sized<size>). (: (
6879
(.program ( for word-offset in (range( 1 (+( (/( size 8 )) 1 )) )) (
@@ -79,7 +90,7 @@ fragment mov := λ(: src LocalVariable+Sized<size>)(: index Literal+Constant)(:
7990
))
8091
))
8192
) Nil);
82-
fragment mov := λ(: src Reg64+x[])(: index Literal+Constant)(: dst LocalVariable+Sized<size>). (: (
93+
fragment mov := λ(: src Reg64)(: index Literal+Constant)(: dst LocalVariable+Sized<size>). (: (
8394
(.program (
8495
(\t 'mov \s '% (.expression src) , \s '%r14 \n)
8596
(for word-offset in (range( 0 (/( size 8 )) )) (
@@ -177,6 +188,11 @@ fragment cmp := λ(: imm Constant+Literal+Sized<4>)(: r Constant+Reg32). (: (.pr
177188
fragment cmp := λ(: imm Constant+Literal+Sized<2>)(: r Constant+Reg16). (: (.program( \t 'cmp \s '$ (.expression imm) , '% (.expression r) \n )) Nil);
178189
fragment cmp := λ(: imm Constant+Literal+Sized<1>)(: r Constant+Reg8). (: (.program( \t 'cmp \s '$ (.expression imm) , '% (.expression r) \n )) Nil);
179190

191+
fragment cmp := λ(: l Constant+Reg8)(: r Constant+Reg8). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil);
192+
fragment cmp := λ(: l Constant+Reg16)(: r Constant+Reg16). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil);
193+
fragment cmp := λ(: l Constant+Reg32)(: r Constant+Reg32). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil);
194+
fragment cmp := λ(: l Constant+Reg64)(: r Constant+Reg64). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil);
195+
180196
fragment movsx := λ(: src Constant+Reg8)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil);
181197
fragment movsx := λ(: src Constant+Reg16)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil);
182198
fragment movsx := λ(: src Constant+Reg32)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil);

STDLIB/default-primitives.lm

Lines changed: 178 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -157,44 +157,182 @@ fragment - := λ(: l GlobalVariable+U64)(: r Constant+U64). (: (
157157
(.expression( 'r15 ))
158158
) Reg64+U64);
159159

160-
fragment == := λ(: l U64+Reg64)(: r U64+Reg64). (: (
161-
(.program (
162-
\t 'cmp \s '% (.expression l) , '% (.expression r) \n
163-
))
164-
(.expression( 'je ))
165-
) BranchConditional);
166-
fragment == := λ(: l U64+Reg64)(: r U64+Literal+Constant). (: (
167-
(.program (
168-
\t 'cmp \s '$ (.expression r) , '% (.expression l) \n
169-
))
170-
(.expression( 'je ))
171-
) BranchConditional);
172-
fragment == := λ(: l U64+Literal+Constant)(: r U64+Reg64). (: (
173-
(.program (
174-
\t 'cmp \s '$ (.expression l) , '% (.expression r) \n
175-
))
176-
(.expression( 'je ))
177-
) BranchConditional);
178-
fragment == := λ(: l U64+GlobalVariable)(: r U64+Literal+Constant). (: (
179-
(.program (
180-
\t 'mov \s '$ (.expression l) , '%r15 \n
181-
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
182-
\t 'cmp \s '$ (.expression r) , '%r15 \n
183-
))
184-
(.expression( 'je ))
185-
) BranchConditional);
186-
fragment == := λ(: l U64+LocalVariable)(: r U64+Literal+Constant). (: (
187-
(.program (
188-
\t 'cmp \s '$ (.expression r) , (.expression l) \[ '%rbp \] \n
189-
))
190-
(.expression( 'je ))
191-
) BranchConditional);
192-
fragment == := λ(: l U64+Literal+Constant)(: r U64+GlobalVariable). (: (
193-
(.program (
194-
\t 'mov \s '$ (.expression r) , '%r15 \n
195-
\t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n
196-
\t 'cmp \s '$ (.expression l) , '%r15 \n
197-
))
198-
(.expression( 'je ))
199-
) BranchConditional);
160+
== := λ(: l U8)(: r U8). (: (tail(
161+
(push R14)
162+
(push R15)
163+
(gensym-label end-true)
164+
(gensym-label end-false)
165+
(gensym-label end)
166+
(mov( l R14B ))
167+
(mov( r R15B ))
168+
(cmp( R14B R15B ))
169+
(je end-true)
170+
(jmp end-false)
171+
(label end-true)
172+
(mov( 1u64 RAX ))
173+
(jmp end)
174+
(label end-false)
175+
(mov( 0u64 RAX ))
176+
(jmp end)
177+
(label end)
178+
(pop R15)
179+
(pop R14)
180+
(as RAX U64)
181+
)) U64);
182+
== := λ(: l U16)(: r U16). (: (tail(
183+
(push R14)
184+
(push R15)
185+
(gensym-label end-true)
186+
(gensym-label end-false)
187+
(gensym-label end)
188+
(mov( l R14W ))
189+
(mov( r R15W ))
190+
(cmp( R14W R15W ))
191+
(je end-true)
192+
(jmp end-false)
193+
(label end-true)
194+
(mov( 1u64 RAX ))
195+
(jmp end)
196+
(label end-false)
197+
(mov( 0u64 RAX ))
198+
(jmp end)
199+
(label end)
200+
(pop R15)
201+
(pop R14)
202+
(as RAX U64)
203+
)) U64);
204+
== := λ(: l U32)(: r U32). (: (tail(
205+
(push R14)
206+
(push R15)
207+
(gensym-label end-true)
208+
(gensym-label end-false)
209+
(gensym-label end)
210+
(mov( l R14D ))
211+
(mov( r R15D ))
212+
(cmp( R14D R15D ))
213+
(je end-true)
214+
(jmp end-false)
215+
(label end-true)
216+
(mov( 1u64 RAX ))
217+
(jmp end)
218+
(label end-false)
219+
(mov( 0u64 RAX ))
220+
(jmp end)
221+
(label end)
222+
(pop R15)
223+
(pop R14)
224+
(as RAX U64)
225+
)) U64);
226+
== := λ(: l U64)(: r U64). (: (tail(
227+
(push R14)
228+
(push R15)
229+
(gensym-label end-true)
230+
(gensym-label end-false)
231+
(gensym-label end)
232+
(mov( l R14 ))
233+
(mov( r R15 ))
234+
(cmp( R14 R15 ))
235+
(je end-true)
236+
(jmp end-false)
237+
(label end-true)
238+
(mov( 1u64 RAX ))
239+
(jmp end)
240+
(label end-false)
241+
(mov( 0u64 RAX ))
242+
(jmp end)
243+
(label end)
244+
(pop R15)
245+
(pop R14)
246+
(as RAX U64)
247+
)) U64);
248+
249+
250+
== := λ(: l I8)(: r I8). (: (tail(
251+
(push R14)
252+
(push R15)
253+
(gensym-label end-true)
254+
(gensym-label end-false)
255+
(gensym-label end)
256+
(mov( l R14B ))
257+
(mov( r R15B ))
258+
(cmp( R14B R15B ))
259+
(je end-true)
260+
(jmp end-false)
261+
(label end-true)
262+
(mov( 1u64 RAX ))
263+
(jmp end)
264+
(label end-false)
265+
(mov( 0u64 RAX ))
266+
(jmp end)
267+
(label end)
268+
(pop R15)
269+
(pop R14)
270+
(as RAX U64)
271+
)) U64);
272+
== := λ(: l I16)(: r I16). (: (tail(
273+
(push R14)
274+
(push R15)
275+
(gensym-label end-true)
276+
(gensym-label end-false)
277+
(gensym-label end)
278+
(mov( l R14W ))
279+
(mov( r R15W ))
280+
(cmp( R14W R15W ))
281+
(je end-true)
282+
(jmp end-false)
283+
(label end-true)
284+
(mov( 1u64 RAX ))
285+
(jmp end)
286+
(label end-false)
287+
(mov( 0u64 RAX ))
288+
(jmp end)
289+
(label end)
290+
(pop R15)
291+
(pop R14)
292+
(as RAX U64)
293+
)) U64);
294+
== := λ(: l I32)(: r I32). (: (tail(
295+
(push R14)
296+
(push R15)
297+
(gensym-label end-true)
298+
(gensym-label end-false)
299+
(gensym-label end)
300+
(mov( l R14D ))
301+
(mov( r R15D ))
302+
(cmp( R14D R15D ))
303+
(je end-true)
304+
(jmp end-false)
305+
(label end-true)
306+
(mov( 1u64 RAX ))
307+
(jmp end)
308+
(label end-false)
309+
(mov( 0u64 RAX ))
310+
(jmp end)
311+
(label end)
312+
(pop R15)
313+
(pop R14)
314+
(as RAX U64)
315+
)) U64);
316+
== := λ(: l I64)(: r I64). (: (tail(
317+
(push R14)
318+
(push R15)
319+
(gensym-label end-true)
320+
(gensym-label end-false)
321+
(gensym-label end)
322+
(mov( l R14 ))
323+
(mov( r R15 ))
324+
(cmp( R14 R15 ))
325+
(je end-true)
326+
(jmp end-false)
327+
(label end-true)
328+
(mov( 1u64 RAX ))
329+
(jmp end)
330+
(label end-false)
331+
(mov( 0u64 RAX ))
332+
(jmp end)
333+
(label end)
334+
(pop R15)
335+
(pop R14)
336+
(as RAX U64)
337+
)) U64);
200338

STDLIB/default-stdlib.lm

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,35 @@ print := λ(: x I8). (: (tail(
183183
)) Nil);
184184

185185
== := λ(: l U8[])(: r U8[]). (: (tail(
186-
123u8
187-
123u8
188-
)) U8);
186+
(let c1 0u8)
187+
(let c2 0u8)
188+
(gensym-label start)
189+
(gensym-label end-true)
190+
(gensym-label end-false)
191+
(gensym-label end)
192+
# (mov( l R15 ))
193+
# (mov( r R14 ))
194+
# (label start )
195+
# (mov( R15 0u64 c1 ))
196+
# (mov( R14 0u64 c2 ))
197+
# (push R14)
198+
# (push R15)
199+
(if (==( c1 c2 )) () (jmp end-false))
200+
# (if (==( c1 0u8 )) () (jmp end-true))
201+
# (pop R15)
202+
# (pop R14)
203+
# (inc R14)
204+
# (inc R15)
205+
# (jmp start)
206+
(label end-true)
207+
(mov( 1u64 RAX ))
208+
(jmp( end ))
209+
(label end-false)
210+
(mov( 0u64 RAX ))
211+
(jmp( end ))
212+
(label end)
213+
(as RAX U64)
214+
)) U64);
189215

190216
cons-page-tail := 0u64;
191217
malloc := λ (: sz U64) . (: (tail(

0 commit comments

Comments
 (0)