From d9536d371e9d6123051306bfa51d2f6f074a909a Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 15:19:52 -0600 Subject: [PATCH 01/10] passing typecheck --- Makefile | 2 +- PRODUCTION/codegen-strict.lm | 2 +- PRODUCTION/typecheck.lm | 4 ++-- tests/strict/match3.lm | 26 ++++++++++++++++++++++++++ 4 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 tests/strict/match3.lm diff --git a/Makefile b/Makefile index 1278a6c2c..8b9e99cb8 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ nostd: prod - ./production --nostd -o tmp.s tests/strict/match2.lm + ./production --nostd -o tmp.s tests/strict/match3.lm as -o tmp.o tmp.s ld -o tmp tmp.o ./tmp && echo $? diff --git a/PRODUCTION/codegen-strict.lm b/PRODUCTION/codegen-strict.lm index f2af626d3..7d8593f24 100644 --- a/PRODUCTION/codegen-strict.lm +++ b/PRODUCTION/codegen-strict.lm @@ -101,7 +101,7 @@ compile-expr-strict := λctx e offset used . (tail( (set e1 (compile-expr-strict( ctx cond offset Used ))) (set e2 (compile-expr-strict( (expr::get-context e1) t offset Used ))) (set e3 (compile-expr-strict( ctx f offset Used ))) - (assert-eq( 'strict-compile-expr::while::ConditionMustBeBranchConditional (expr::get-type e1) BranchConditional )) + (assert-eq( 'strict-compile-expr::if::ConditionMustBeBranchConditional (expr::get-type e1) BranchConditional )) (set e4 e1) (local label-true-branch) (set label-true-branch (uuid())) diff --git a/PRODUCTION/typecheck.lm b/PRODUCTION/typecheck.lm index 581e1061b..e21bab2e5 100644 --- a/PRODUCTION/typecheck.lm +++ b/PRODUCTION/typecheck.lm @@ -269,7 +269,7 @@ typecheck-infer-ctx := λctx e . (match e ( ctx )) ( u ( - fail (UnknownLhs u) + fail (UnknownLhsInferCtx u) )) )); @@ -325,7 +325,7 @@ typecheck-typeof-lhs := λlhs . (match lhs ( Nil )) ( u ( - fail (UnknownLhs u) + fail (UnknownLhsTypeofLhs u) )) )); diff --git a/tests/strict/match3.lm b/tests/strict/match3.lm new file mode 100644 index 000000000..efb12863f --- /dev/null +++ b/tests/strict/match3.lm @@ -0,0 +1,26 @@ + +import STDLIB/default-instruction-set.lm; +import STDLIB/default-primitives.lm; +import STDLIB/default-rules.lm; +import STDLIB/default-stdlib.lm; + +main := (tail( + (match 'a_s ( + () + ('a_s (print a_s)) + ('b_s (print b_s)) + ('c_s (print c_s)) + )) + (match 'b_s ( + () + ('a_s (print a_s)) + ('b_s (print b_s)) + ('c_s (print c_s)) + )) + (match 'c_s ( + () + ('a_s (print a_s)) + ('b_s (print b_s)) + ('c_s (print c_s)) + )) +)); From 8e726ba13d7a1102ed8fcdfee0b9aab52eb7d1b4 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 15:28:19 -0600 Subject: [PATCH 02/10] truthy if statements are working --- PRODUCTION/codegen-strict.lm | 12 +++++++++++- STDLIB/default-stdlib.lm | 6 +++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/PRODUCTION/codegen-strict.lm b/PRODUCTION/codegen-strict.lm index 7d8593f24..3e121cb66 100644 --- a/PRODUCTION/codegen-strict.lm +++ b/PRODUCTION/codegen-strict.lm @@ -101,7 +101,17 @@ compile-expr-strict := λctx e offset used . (tail( (set e1 (compile-expr-strict( ctx cond offset Used ))) (set e2 (compile-expr-strict( (expr::get-context e1) t offset Used ))) (set e3 (compile-expr-strict( ctx f offset Used ))) - (assert-eq( 'strict-compile-expr::if::ConditionMustBeBranchConditional (expr::get-type e1) BranchConditional )) + (match (expr::get-type e1) ( + () + (BranchConditional ()) + ( _ (tail( + (set e1 (expr::set-prog( e1 ( + (expr::get-prog e1) + \t 'cmp \s '$1 , \s '%rax \n + )))) + (set e1 (expr::set-expr( e1 'je ))) + ))) + )) (set e4 e1) (local label-true-branch) (set label-true-branch (uuid())) diff --git a/STDLIB/default-stdlib.lm b/STDLIB/default-stdlib.lm index b3783b382..0d06f5957 100644 --- a/STDLIB/default-stdlib.lm +++ b/STDLIB/default-stdlib.lm @@ -183,9 +183,9 @@ print := λ(: x I8). (: (tail( )) Nil); == := λ(: l U8[])(: r U8[]). (: (tail( - 123u8 - 123u8 -)) U8); + 123u64 + 1u64 +)) U64); cons-page-tail := 0u64; malloc := λ (: sz U64) . (: (tail( From 1723903128aa5ca04857de88557a6e370696ace4 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 15:52:16 -0600 Subject: [PATCH 03/10] string comparison almost working --- STDLIB/default-instruction-set.lm | 7 ++++++- STDLIB/default-primitives.lm | 19 +++++++++++++++++++ STDLIB/default-stdlib.lm | 26 ++++++++++++++++++++++++-- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/STDLIB/default-instruction-set.lm b/STDLIB/default-instruction-set.lm index b0f7959d1..0b0f9a3b3 100644 --- a/STDLIB/default-instruction-set.lm +++ b/STDLIB/default-instruction-set.lm @@ -79,7 +79,7 @@ fragment mov := λ(: src LocalVariable+Sized)(: index Literal+Constant)(: )) )) ) Nil); -fragment mov := λ(: src Reg64+x[])(: index Literal+Constant)(: dst LocalVariable+Sized). (: ( +fragment mov := λ(: src Reg64)(: index Literal+Constant)(: dst LocalVariable+Sized). (: ( (.program ( (\t 'mov \s '% (.expression src) , \s '%r14 \n) (for word-offset in (range( 0 (/( size 8 )) )) ( @@ -177,6 +177,11 @@ fragment cmp := λ(: imm Constant+Literal+Sized<4>)(: r Constant+Reg32). (: (.pr fragment cmp := λ(: imm Constant+Literal+Sized<2>)(: r Constant+Reg16). (: (.program( \t 'cmp \s '$ (.expression imm) , '% (.expression r) \n )) Nil); fragment cmp := λ(: imm Constant+Literal+Sized<1>)(: r Constant+Reg8). (: (.program( \t 'cmp \s '$ (.expression imm) , '% (.expression r) \n )) Nil); +fragment cmp := λ(: l Constant+Reg8)(: r Constant+Reg8). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil); +fragment cmp := λ(: l Constant+Reg16)(: r Constant+Reg16). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil); +fragment cmp := λ(: l Constant+Reg32)(: r Constant+Reg32). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil); +fragment cmp := λ(: l Constant+Reg64)(: r Constant+Reg64). (: (.program( \t 'cmp \s '% (.expression l) , '% (.expression r) \n )) Nil); + fragment movsx := λ(: src Constant+Reg8)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil); fragment movsx := λ(: src Constant+Reg16)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil); fragment movsx := λ(: src Constant+Reg32)(: dst Constant+Reg64). (: (.program( \t 'movsx \s '% (.expression src) , '% (.expression dst) \n )) Nil); diff --git a/STDLIB/default-primitives.lm b/STDLIB/default-primitives.lm index f7f4a5f28..f3a622194 100644 --- a/STDLIB/default-primitives.lm +++ b/STDLIB/default-primitives.lm @@ -157,6 +157,25 @@ fragment - := λ(: l GlobalVariable+U64)(: r Constant+U64). (: ( (.expression( 'r15 )) ) Reg64+U64); +== := λ(: l U8)(: r U8). (: (tail( + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14B )) + (mov( r R15B )) + (cmp( R14B R15B )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (as RAX U64) +)) U64); + fragment == := λ(: l U64+Reg64)(: r U64+Reg64). (: ( (.program ( \t 'cmp \s '% (.expression l) , '% (.expression r) \n diff --git a/STDLIB/default-stdlib.lm b/STDLIB/default-stdlib.lm index 0d06f5957..194d03113 100644 --- a/STDLIB/default-stdlib.lm +++ b/STDLIB/default-stdlib.lm @@ -183,8 +183,30 @@ print := λ(: x I8). (: (tail( )) Nil); == := λ(: l U8[])(: r U8[]). (: (tail( - 123u64 - 1u64 + (let c1 0u8) + (let c2 0u8) + (gensym-label start) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R15 )) + (mov( r R14 )) + (label start ) + (mov( R15 0u64 c1 )) + (mov( R14 0u64 c2 )) + (if (==( c1 c2 )) () (jmp end-false)) + (if (==( c1 0u8 )) () (jmp end-true)) + (inc R14) + (inc R15) + (jmp start) + (label end-true) + (mov( 1u64 RAX )) + (jmp( end )) + (label end-false) + (mov( 0u64 RAX )) + (jmp( end )) + (label end) + (as RAX U64) )) U64); cons-page-tail := 0u64; From d973fa9823ab398bc1b2f0291f863dcc111ca788 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:00:29 -0600 Subject: [PATCH 04/10] nested if equals are problematic --- Makefile | 2 +- STDLIB/default-primitives.lm | 8 ++++---- STDLIB/default-stdlib.lm | 22 +++++++++++++--------- tests/strict/ifeq.lm | 11 +++++++++++ 4 files changed, 29 insertions(+), 14 deletions(-) create mode 100644 tests/strict/ifeq.lm diff --git a/Makefile b/Makefile index 8b9e99cb8..b40c068bc 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ nostd: prod - ./production --nostd -o tmp.s tests/strict/match3.lm + ./production --nostd -o tmp.s tests/strict/ifeq.lm as -o tmp.o tmp.s ld -o tmp tmp.o ./tmp && echo $? diff --git a/STDLIB/default-primitives.lm b/STDLIB/default-primitives.lm index f3a622194..5d8c02589 100644 --- a/STDLIB/default-primitives.lm +++ b/STDLIB/default-primitives.lm @@ -161,10 +161,10 @@ fragment - := λ(: l GlobalVariable+U64)(: r Constant+U64). (: ( (gensym-label end-true) (gensym-label end-false) (gensym-label end) - (mov( l R14B )) - (mov( r R15B )) - (cmp( R14B R15B )) - (je end-true) +# (mov( l R14B )) +# (mov( r R15B )) +# (cmp( R14B R15B )) +# (je end-true) (jmp end-false) (label end-true) (mov( 1u64 RAX )) diff --git a/STDLIB/default-stdlib.lm b/STDLIB/default-stdlib.lm index 194d03113..74fab38e3 100644 --- a/STDLIB/default-stdlib.lm +++ b/STDLIB/default-stdlib.lm @@ -189,16 +189,20 @@ print := λ(: x I8). (: (tail( (gensym-label end-true) (gensym-label end-false) (gensym-label end) - (mov( l R15 )) - (mov( r R14 )) - (label start ) - (mov( R15 0u64 c1 )) - (mov( R14 0u64 c2 )) +# (mov( l R15 )) +# (mov( r R14 )) +# (label start ) +# (mov( R15 0u64 c1 )) +# (mov( R14 0u64 c2 )) +# (push R14) +# (push R15) (if (==( c1 c2 )) () (jmp end-false)) - (if (==( c1 0u8 )) () (jmp end-true)) - (inc R14) - (inc R15) - (jmp start) +# (if (==( c1 0u8 )) () (jmp end-true)) +# (pop R15) +# (pop R14) +# (inc R14) +# (inc R15) +# (jmp start) (label end-true) (mov( 1u64 RAX )) (jmp( end )) diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm new file mode 100644 index 000000000..f131610a0 --- /dev/null +++ b/tests/strict/ifeq.lm @@ -0,0 +1,11 @@ + +import STDLIB/default-instruction-set.lm; +import STDLIB/default-primitives.lm; +import STDLIB/default-rules.lm; +import STDLIB/default-stdlib.lm; + +main := ( + (let x 0u8) + (let y 0u8) + (if (==( x y )) (print 'True_s) (print 'False_s) ) +); From a930b044ca69fc518305acd33d8992c1a19152e2 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:07:34 -0600 Subject: [PATCH 05/10] equality comparison for all integer primitive types --- STDLIB/default-primitives.lm | 207 +++++++++++++++++++++++++++-------- tests/strict/ifeq.lm | 2 + 2 files changed, 165 insertions(+), 44 deletions(-) diff --git a/STDLIB/default-primitives.lm b/STDLIB/default-primitives.lm index 5d8c02589..488c43cc6 100644 --- a/STDLIB/default-primitives.lm +++ b/STDLIB/default-primitives.lm @@ -158,13 +158,15 @@ fragment - := λ(: l GlobalVariable+U64)(: r Constant+U64). (: ( ) Reg64+U64); == := λ(: l U8)(: r U8). (: (tail( + (push R14) + (push R15) (gensym-label end-true) (gensym-label end-false) (gensym-label end) -# (mov( l R14B )) -# (mov( r R15B )) -# (cmp( R14B R15B )) -# (je end-true) + (mov( l R14B )) + (mov( r R15B )) + (cmp( R14B R15B )) + (je end-true) (jmp end-false) (label end-true) (mov( 1u64 RAX )) @@ -173,47 +175,164 @@ fragment - := λ(: l GlobalVariable+U64)(: r Constant+U64). (: ( (mov( 0u64 RAX )) (jmp end) (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l U16)(: r U16). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14W )) + (mov( r R15W )) + (cmp( R14W R15W )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l U32)(: r U32). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14D )) + (mov( r R15D )) + (cmp( R14D R15D )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l U64)(: r U64). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14 )) + (mov( r R15 )) + (cmp( R14 R15 )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) (as RAX U64) )) U64); -fragment == := λ(: l U64+Reg64)(: r U64+Reg64). (: ( - (.program ( - \t 'cmp \s '% (.expression l) , '% (.expression r) \n - )) - (.expression( 'je )) -) BranchConditional); -fragment == := λ(: l U64+Reg64)(: r U64+Literal+Constant). (: ( - (.program ( - \t 'cmp \s '$ (.expression r) , '% (.expression l) \n - )) - (.expression( 'je )) -) BranchConditional); -fragment == := λ(: l U64+Literal+Constant)(: r U64+Reg64). (: ( - (.program ( - \t 'cmp \s '$ (.expression l) , '% (.expression r) \n - )) - (.expression( 'je )) -) BranchConditional); -fragment == := λ(: l U64+GlobalVariable)(: r U64+Literal+Constant). (: ( - (.program ( - \t 'mov \s '$ (.expression l) , '%r15 \n - \t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n - \t 'cmp \s '$ (.expression r) , '%r15 \n - )) - (.expression( 'je )) -) BranchConditional); -fragment == := λ(: l U64+LocalVariable)(: r U64+Literal+Constant). (: ( - (.program ( - \t 'cmp \s '$ (.expression r) , (.expression l) \[ '%rbp \] \n - )) - (.expression( 'je )) -) BranchConditional); -fragment == := λ(: l U64+Literal+Constant)(: r U64+GlobalVariable). (: ( - (.program ( - \t 'mov \s '$ (.expression r) , '%r15 \n - \t 'mov \s '0 \[ '%r15 \] , \s '%r15 \n - \t 'cmp \s '$ (.expression l) , '%r15 \n - )) - (.expression( 'je )) -) BranchConditional); + +== := λ(: l I8)(: r I8). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14B )) + (mov( r R15B )) + (cmp( R14B R15B )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l I16)(: r I16). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14W )) + (mov( r R15W )) + (cmp( R14W R15W )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l I32)(: r I32). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14D )) + (mov( r R15D )) + (cmp( R14D R15D )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); +== := λ(: l I64)(: r I64). (: (tail( + (push R14) + (push R15) + (gensym-label end-true) + (gensym-label end-false) + (gensym-label end) + (mov( l R14 )) + (mov( r R15 )) + (cmp( R14 R15 )) + (je end-true) + (jmp end-false) + (label end-true) + (mov( 1u64 RAX )) + (jmp end) + (label end-false) + (mov( 0u64 RAX )) + (jmp end) + (label end) + (pop R15) + (pop R14) + (as RAX U64) +)) U64); diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm index f131610a0..1a7b58cd9 100644 --- a/tests/strict/ifeq.lm +++ b/tests/strict/ifeq.lm @@ -8,4 +8,6 @@ main := ( (let x 0u8) (let y 0u8) (if (==( x y )) (print 'True_s) (print 'False_s) ) + (set y 1u8) + (if (==( x y )) (print 'True_s) (print 'False_s) ) ); From 329b3499b264e9738abde36e920c601e172264b5 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:14:34 -0600 Subject: [PATCH 06/10] i8 comparison is wrong --- tests/strict/ifeq.lm | 65 +++++++++++++++++++++++++++++++++++++++----- 1 file changed, 58 insertions(+), 7 deletions(-) diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm index 1a7b58cd9..f9420b381 100644 --- a/tests/strict/ifeq.lm +++ b/tests/strict/ifeq.lm @@ -4,10 +4,61 @@ import STDLIB/default-primitives.lm; import STDLIB/default-rules.lm; import STDLIB/default-stdlib.lm; -main := ( - (let x 0u8) - (let y 0u8) - (if (==( x y )) (print 'True_s) (print 'False_s) ) - (set y 1u8) - (if (==( x y )) (print 'True_s) (print 'False_s) ) -); +main := (tail( + (tail( + (let x 0u8) + (let y 0u8) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1u8) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0u16) + (let y 0u16) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1u16) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0u32) + (let y 0u32) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1u32) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0u64) + (let y 0u64) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1u64) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i8) + (let y 0i8) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i8) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i16) + (let y 0i16) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i16) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i32) + (let y 0i32) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i32) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i64) + (let y 0i64) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i64) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) +)); From 8d1a646bae959007fb9a0dd45b2c520c0e4108b5 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:22:55 -0600 Subject: [PATCH 07/10] quite a strange bug --- tests/strict/ifeq.lm | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm index f9420b381..5bc8aeb96 100644 --- a/tests/strict/ifeq.lm +++ b/tests/strict/ifeq.lm @@ -40,25 +40,25 @@ main := (tail( (set y 1i8) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) - (tail( - (let x 0i16) - (let y 0i16) - (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) - (set y 1i16) - (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) - )) - (tail( - (let x 0i32) - (let y 0i32) - (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) - (set y 1i32) - (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) - )) - (tail( - (let x 0i64) - (let y 0i64) - (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) - (set y 1i64) - (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) - )) +# (tail( +# (let x 0i16) +# (let y 0i16) +# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) +# (set y 1i16) +# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) +# )) +# (tail( +# (let x 0i32) +# (let y 0i32) +# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) +# (set y 1i32) +# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) +# )) +# (tail( +# (let x 0i64) +# (let y 0i64) +# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) +# (set y 1i64) +# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) +# )) )); From 9952343fd8c807636bcee446ff725c12e95469dc Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:34:48 -0600 Subject: [PATCH 08/10] let values are getting corrupted somehow --- tests/strict/ifeq.lm | 58 ++++++++++++++++++++++++++++---------------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm index 5bc8aeb96..ce5bc1fb5 100644 --- a/tests/strict/ifeq.lm +++ b/tests/strict/ifeq.lm @@ -8,57 +8,73 @@ main := (tail( (tail( (let x 0u8) (let y 0u8) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) (set y 1u8) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) (tail( (let x 0u16) (let y 0u16) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) (set y 1u16) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) (tail( (let x 0u32) (let y 0u32) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) (set y 1u32) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) (tail( (let x 0u64) (let y 0u64) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) (set y 1u64) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) (tail( (let x 0i8) (let y 0i8) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) (set y 1i8) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i16) + (let y 0i16) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i16) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i32) + (let y 0i32) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i32) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) + )) + (tail( + (let x 0i64) + (let y 0i64) + (print x)(print y)(print \n_s) + (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) + (set y 1i64) + (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) -# (tail( -# (let x 0i16) -# (let y 0i16) -# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) -# (set y 1i16) -# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) -# )) -# (tail( -# (let x 0i32) -# (let y 0i32) -# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) -# (set y 1i32) -# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) -# )) -# (tail( -# (let x 0i64) -# (let y 0i64) -# (if (==( x y )) (print 'ZeroEqZero\n_s) (print 'Failure\n_s) ) -# (set y 1i64) -# (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) -# )) )); From 449b0b3d30e8590a9f3c1401fef025c76a2b0b80 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:53:49 -0600 Subject: [PATCH 09/10] fixed a nasty bug with push fragments not pushing --- Cargo.toml | 2 +- STDLIB/default-instruction-set.lm | 29 +++++++++++++++++++--------- tests/strict/ifeq.lm | 1 + tests/strict/ifeq.lm.out | 32 +++++++++++++++++++++++++++++++ 4 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 tests/strict/ifeq.lm.out diff --git a/Cargo.toml b/Cargo.toml index 15f118b83..3f32134ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "lambda_mountain" -version = "1.11.80" +version = "1.11.81" authors = ["Andrew "] license = "MIT" description = "Lambda Mountain" diff --git a/STDLIB/default-instruction-set.lm b/STDLIB/default-instruction-set.lm index 0b0f9a3b3..02f856ba7 100644 --- a/STDLIB/default-instruction-set.lm +++ b/STDLIB/default-instruction-set.lm @@ -54,15 +54,26 @@ fragment push := λ(: src GlobalVariable+Sized). (: ( )) ) Nil); fragment push := λ(: src LocalVariable+Sized). (: ( - (.program ( for word-offset in (range( 0 (/( size 8 )) )) ( - \t 'pushq \s (+( - (.expression src) - (+( - (+( size '-8 )) - (inv(*( word-offset 8 ))) - )) - )) \[ '%rbp \] \n - ))) + (.program ( + (for word-offset in (range( 0 (/( size 8 )) )) ( + \t 'pushq \s (+( + (.expression src) + (+( + (+( size '-8 )) + (inv(*( word-offset 8 ))) + )) + )) \[ '%rbp \] \n + )) + (if-eq size 4 ( + \t 'pushq \s (.expression src) \[ '%rbp \] \n + )) + (if-eq size 2 ( + \t 'pushq \s (.expression src) \[ '%rbp \] \n + )) + (if-eq size 1 ( + \t 'pushq \s (.expression src) \[ '%rbp \] \n + )) + )) ) Nil); fragment pop := λ(: src LocalVariable+Sized). (: ( (.program ( for word-offset in (range( 1 (+( (/( size 8 )) 1 )) )) ( diff --git a/tests/strict/ifeq.lm b/tests/strict/ifeq.lm index ce5bc1fb5..f841faab9 100644 --- a/tests/strict/ifeq.lm +++ b/tests/strict/ifeq.lm @@ -14,6 +14,7 @@ main := (tail( (print x)(print y)(print \n_s) (if (==( x y )) (print 'Failure\n_s) (print 'ZeroNotEqualOne\n_s) ) )) + () (tail( (let x 0u16) (let y 0u16) diff --git a/tests/strict/ifeq.lm.out b/tests/strict/ifeq.lm.out new file mode 100644 index 000000000..1cec3d93e --- /dev/null +++ b/tests/strict/ifeq.lm.out @@ -0,0 +1,32 @@ +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne +00 +ZeroEqZero +01 +ZeroNotEqualOne From 9fbc9c2772b54b9fecde09c1ce5034891684c5e6 Mon Sep 17 00:00:00 2001 From: Andrew Johnson Date: Mon, 15 Apr 2024 16:56:46 -0600 Subject: [PATCH 10/10] one test failing --- tests/strict/match3.lm.out | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/strict/match3.lm.out diff --git a/tests/strict/match3.lm.out b/tests/strict/match3.lm.out new file mode 100644 index 000000000..356e0d1ff --- /dev/null +++ b/tests/strict/match3.lm.out @@ -0,0 +1 @@ +abcabcabc