Skip to content

Commit a9bb425

Browse files
Merge pull request #203 from andrew-johnson-4/strict-compiler-dev-18
Strict compiler dev 18
2 parents cd8283e + 7a509f0 commit a9bb425

File tree

6 files changed

+75
-23
lines changed

6 files changed

+75
-23
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.67"
3+
version = "1.11.68"
44
authors = ["Andrew <andrew@subarctic.org>"]
55
license = "MIT"
66
description = "Lambda Mountain"

PRODUCTION/codegen-strict.lm

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ compile-push-rvalue := λctx e offset . (tail(
2121
()
2222
( StackVariable e1 )
2323
( _ (tail(
24-
(set e2 (fragment-apply( ctx 'push lt (() e1) e1 )))
25-
(expr::chain( e1 e2 ))
24+
()
25+
(fragment-apply( ctx 'push lt (() e1) e1 ))
2626
)))
2727
))
2828
)))
@@ -172,19 +172,27 @@ compile-expr-strict := λctx e offset used . (tail(
172172
(set e1 (expr::set-offset( e1 offset )))
173173
e1
174174
)))
175+
( (App( (Variable 'sizeof) (Literal ltype) )) (tail(
176+
(set ltype (parse-type ltype))
177+
(set e1 (expr::set-expr( (expr::new ()) (typecheck-sizeof ltype) )))
178+
(set e1 (expr::set-context( e1 ctx )))
179+
(set e1 (expr::set-offset( e1 offset )))
180+
(set e1 (expr::set-type( e1 ltype )))
181+
e1
182+
)))
175183
( (Literal lval) (tail(
176184
(set e1 (expr::set-expr( (expr::new ()) lval )))
177185
(set e1 (expr::set-context( e1 ctx )))
178186
(set e1 (expr::set-offset( e1 offset )))
179187
e1
180188
)))
181189
( (App( (App( (Literal ':) lval )) ltype )) (tail(
182-
(set e1 (compile-expr-strict( ctx lval offset Unused )))
190+
(set e1 (compile-expr-strict( ctx lval offset Used )))
183191
(set e1 (expr::set-type( e1 (typecheck-lookup e) )))
184192
e1
185193
)))
186194
( (App( (App( (Variable 'as) lval )) ltype )) (tail(
187-
(set e1 (compile-expr-strict( ctx lval offset Unused )))
195+
(set e1 (compile-expr-strict( ctx lval offset Used )))
188196
(set e1 (expr::set-type( e1 (typecheck-lookup e) )))
189197
e1
190198
)))

PRODUCTION/typecheck.lm

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ typecheck-assert-expr := λe . (tail(
8585
( (App( (App( (Literal ':) (Literal _) )) tt )) (
8686
(typecheck-assert-one( e ))
8787
))
88+
( (App( (Variable 'sizeof) (Literal tt) )) (
89+
(typecheck-assert-one( e ))
90+
))
8891
( (App( (App( (Literal ':) te )) tt )) (
8992
(typecheck-assert-expr( te ))
9093
(typecheck-assert-one( e ))
@@ -742,6 +745,9 @@ typecheck-infer-expr := λctx e used . (tail(
742745
(typecheck-infer-expr( ctx rhs Used ))
743746
(typecheck-ascript( e (typecheck-typeof-var( ctx lhs )) ))
744747
)))
748+
( (App( (Variable 'sizeof) (Literal tt) )) (tail(
749+
(typecheck-ascript( e (parse-type( U64+Literal+Constant )) ))
750+
)))
745751
( (App( (App( (App( (Variable 'if) cond )) t )) f )) (tail(
746752
(typecheck-infer-expr( ctx cond Used ))
747753
(typecheck-infer-expr( ctx t Used ))
@@ -808,7 +814,12 @@ typecheck-infer-expr := λctx e used . (tail(
808814
ctx
809815
));
810816

811-
typecheck-sizeof := λtt . (match tt (
817+
typecheck-sizeof := λtt . (tail(
818+
(local sz)
819+
(set sz (typecheck-sizeof-impl tt))
820+
sz
821+
));
822+
typecheck-sizeof-impl := λtt . (match tt (
812823
()
813824
( Nil 0 )
814825
( '? () )
@@ -927,6 +938,7 @@ typecheck-as-return := λrt . (tail(
927938
(2 (And( Reg16 rt )))
928939
(4 (And( Reg32 rt )))
929940
(8 (And( Reg64 rt )))
941+
(_ (And( LocalVariable rt )))
930942
))
931943
));
932944

STDLIB/default-instruction-set.lm

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,30 @@ fragment pop := λ(: src LocalVariable+Sized<size>). (: (
5858
)))
5959
) Nil);
6060

61+
fragment mov := λ(: src LocalVariable+Sized<size>)(: index Literal+Constant)(: dst Reg64+x[]). (: (
62+
(.program (
63+
(\t 'mov \s '% (.expression dst) , \s '%r14 \n)
64+
(for word-offset in (range( 0 (/( size 8 )) )) (
65+
\t 'movq \s (+( (.expression src) (*( word-offset 8 )) )) \[ '%rbp \] , \s '%r15 \n
66+
\t 'movq \s '%r15 , \s (*( word-offset 8 )) \[ '%r14 \] \n
67+
))
68+
))
69+
) Nil);
70+
fragment mov := λ(: src Reg64+x[])(: index Literal+Constant)(: dst LocalVariable+Sized<size>). (: (
71+
(.program (
72+
(\t 'mov \s '% (.expression src) , \s '%r14 \n)
73+
(for word-offset in (range( 0 (/( size 8 )) )) (
74+
\t 'movq \s (*( word-offset 8 )) \[ '%r14 \] , '%r15 \n
75+
\t 'movq \s '%r15 , \s (+( (.expression dst) (*( word-offset 8 )) )) \[ '%rbp \] \n
76+
))
77+
))
78+
) Nil);
79+
6180
fragment mov := λ(: src LocalVariable)(: dst Constant+Reg64). (: ( (.program( \t 'mov \t (.expression src) \[ '%rbp \] , \s '% (.expression dst) \n)) ) Nil);
62-
fragment mov := λ(: src LocalVariable)(: dst Constant+Reg64). (: ( (.program( \t 'mov \t (.expression src) \[ '%rbp \] , \s '% (.expression dst) \n)) ) Nil);
81+
fragment mov := λ(: src GlobalVariable)(: dst Constant+Reg64). (: ( (.program(
82+
\t 'mov \t '$ (.expression src) , \s '% (.expression dst) \n
83+
\t 'mov \t '0 \[ '% (.expression dst) \] , \s '% (.expression dst) \n
84+
)) ) Nil);
6385
fragment mov := λ(: src Constant+Literal+Sized<8>)(: dst Constant+Reg64). (: ( (.program( \t 'mov \t '$ (.expression src) , \s '% (.expression dst) \n)) ) Nil);
6486
fragment mov := λ(: src Reg64)(: dst Constant+Reg64). (: ( (.program( \t 'mov \t '% (.expression src) , \s '% (.expression dst) \n)) ) Nil);
6587

@@ -161,5 +183,7 @@ fragment div := λ(: l Reg64). (: (.program( \t 'div \s '% (.expression l) \n ))
161183
fragment add := λ(: src Constant+Literal+Sized<1>)(: dst LocalVariable). (: (.program( \t 'addb \s '$ (.expression src) , \s (.expression dst) \[ '%rbp \] \n )) Nil);
162184
fragment add := λ(: src Constant+Literal+Sized<8>)(: dst Reg64). (: (.program( \t 'addq \s '$ (.expression src) , \s '% (.expression dst) \n )) Nil);
163185

186+
fragment add := λ(: src LocalVariable+Sized<8>)(: dst Reg64). (: (.program( \t 'addq \s (.expression src) \[ '%rbp \] , \s '% (.expression dst) \n )) Nil);
187+
164188
fragment push := λ(: l Reg64). (: (.program( \t 'push \s '% (.expression l) \n )) Nil);
165189
fragment pop := λ(: l Reg64). (: (.program( \t 'pop \s '% (.expression l) \n )) Nil);

STDLIB/default-stdlib.lm

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@ type S (SNil)
55
| (SPointer( ?[] ));
66

77
close := λ(: x S). (: (tail(
8-
()
9-
(as 0u64 S[])
8+
(mov( (malloc(sizeof S)) R8 ))
9+
(mov( x 0u64 (as R8 S[]) ))
10+
(as R8 S[])
1011
)) S[]);
1112

1213
print := λ(: x S). (: (tail(
@@ -17,10 +18,15 @@ print := λ(: x S). (: (tail(
1718
(print (.1 (as x SAtom)))
1819
) (
1920
(if (==( (.0 x) 1u64 )) (tail(
21+
(let c SNil)
2022
(print '\[_s)
21-
(print (as (.1 (as x SCons)) U64))
23+
(print( (as (.1 (as x SCons)) U64) ))
24+
(mov( (.1 (as x SCons)) 0u64 c ))
25+
(print c)
2226
(print '\s_s)
23-
(print (as (.2 (as x SCons)) U64))
27+
(print( (as (.2 (as x SCons)) U64) ))
28+
(mov( (.2 (as x SCons)) 0u64 c ))
29+
(print c)
2430
(print '\]_s)
2531
)) (tail(
2632
(print '[_s)
@@ -189,6 +195,8 @@ malloc := λ (: sz U64) . (: (tail(
189195
(syscall())
190196
)) ())
191197
(let curr cons-page-tail)
192-
(set cons-page-tail (+( cons-page-tail sz )))
198+
(mov( cons-page-tail R8 ))
199+
(add( sz R8 ))
200+
(set cons-page-tail (as R8 U64))
193201
(as curr ?[])
194202
)) ?[]);

STRICT/cli.lm

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,17 @@ config-mode := Compile;
1414
main := λ(: argc U64)(: argv U8[][]).(tail(
1515
# (let argi 0u64)
1616
(let input_l (SAtom( 'an-atom_s )))
17-
(let input_r (SPointer( as 'test_s ?[] )))
18-
(let input (SCons(
19-
(close( input_l ))
20-
(close( input_r ))
21-
)))
22-
(print input)
23-
(print (as (malloc 24u64) U64))
24-
(print ',_s)
25-
(print (as (malloc 24u64) U64))
26-
(print ',_s)
27-
(print (as (malloc 24u64) U64))
17+
(let input_o SNil)
18+
(let close_l 0u64)
19+
(push (close( input_l )))
20+
(pop( close_l ))
21+
(mov( close_l R8 ))
22+
(mov( (as R8 S[]) 0u64 input_o ))
23+
(print input_o)
24+
# (push (close( input_r )))
25+
# (pop( close_r ))
26+
# (let input (SCons( (as close_l S[]) (as close_r S[]) )))
27+
# (print input)
2828
# (while (<( argi argc )) (
2929
# (if (==( ([]( argv argi )) '--tokenize_s )) (
3030
# (print '--tokenize_s)

0 commit comments

Comments
 (0)