about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--apps/mu.subx92
1 files changed, 62 insertions, 30 deletions
diff --git a/apps/mu.subx b/apps/mu.subx
index ee90b29f..50e5360f 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -5165,19 +5165,21 @@ test-parse-mu-var-def:
     (clear-stack %ecx)
     # convert
     (parse-mu-var-def _test-input-stream %ecx %esi)
+    # var out-addr/esi: (addr stmt)
     (lookup *esi *(esi+4))  # => eax
     89/<- %esi 0/r32/eax
+    #
     (check-ints-equal *esi 2 "F - test-parse-mu-var-def/tag")  # Stmt-tag is var-def
     # var v/ecx: (addr var) = lookup(out->var)
-    (lookup *(esi+4) *(esi+8))  # Vardef-var => eax
+    (lookup *(esi+4) *(esi+8))  # Vardef-var Vardef-var => eax
     89/<- %ecx 0/r32/eax
     # v->name
-    (lookup *ecx *(ecx+4))  # Var-name => eax
+    (lookup *ecx *(ecx+4))  # Var-name Var-name => eax
     (check-strings-equal %eax "n" "F - test-parse-mu-var-def/var-name")
     # v->register
     (check-ints-equal *(ecx+0x18) 0 "F - test-parse-mu-var-def/var-register")  # Var-register
     # v->type == int
-    (lookup *(ecx+8) *(ecx+0xc))  # Var-type => eax
+    (lookup *(ecx+8) *(ecx+0xc))  # Var-type Var-type => eax
     (check-ints-equal *eax 1 "F - test-parse-mu-var-def/var-type:0")  # Tree-is-atom
     (check-ints-equal *(eax+4) 1 "F - test-parse-mu-var-def/var-type:1")  # Tree-value
     (check-ints-equal *(eax+0xc) 0 "F - test-parse-mu-var-def/var-type:2")  # Tree-right
@@ -5194,10 +5196,10 @@ test-parse-mu-reg-var-def:
     # setup
     (clear-stream _test-input-stream)
     (write _test-input-stream "n/eax: int <- copy 0\n")  # caller has consumed the 'var'
-    # var out/eax: (handle stmt)
+    # var out/esi: (handle stmt)
     68/push 0/imm32
     68/push 0/imm32
-    89/<- %eax 4/r32/esp
+    89/<- %esi 4/r32/esp
     # var vars/ecx: (stack (addr var) 16)
     81 5/subop/subtract %esp 0x80/imm32
     68/push 0x80/imm32/size
@@ -5205,20 +5207,31 @@ test-parse-mu-reg-var-def:
     89/<- %ecx 4/r32/esp
     (clear-stack %ecx)
     # convert
-    (parse-mu-var-def _test-input-stream %ecx %eax)
-    (lookup *eax *(eax+4))  # => eax
-    # check result
-    (check-ints-equal *eax 3 "F - test-parse-mu-reg-var-def/tag")  # Stmt-tag is reg-var-def
-    8b/-> *(eax+0xc) 0/r32/eax  # Regvardef-outputs
-    (check-ints-equal *(eax+4) 0 "F - test-parse-mu-reg-var-def/single-output")  # List-next
-    8b/-> *eax 0/r32/eax  # Stmt-var-value
-    (check-strings-equal *eax "n" "F - test-parse-mu-reg-var-def/output-name")  # Var-name
-    (check-strings-equal *(eax+0x10) "eax" "F - test-parse-mu-reg-var-def/output-register")  # Var-register
-    # ensure type is int
-    8b/-> *(eax+4) 0/r32/eax  # Var-type
-    (check-ints-equal *eax 1 "F - test-parse-mu-reg-var-def/var-type:0")  # Tree-is-atom
-    (check-ints-equal *(eax+4) 1 "F - test-parse-mu-reg-var-def/output-type:0")  # Tree-value
-    (check-ints-equal *(eax+8) 0 "F - test-parse-mu-reg-var-def/output-type:0")  # Tree-right
+    (parse-mu-var-def _test-input-stream %ecx %esi)
+    # var out-addr/esi: (addr stmt)
+    (lookup *esi *(esi+4))  # => eax
+    89/<- %esi 0/r32/eax
+    #
+    (check-ints-equal *esi 3 "F - test-parse-mu-reg-var-def/tag")  # Stmt-tag is reg-var-def
+    # var v/ecx: (addr var) = lookup(out->outputs->value)
+    # . eax: (addr stmt-var) = lookup(out->outputs)
+    (lookup *(esi+0x14) *(esi+0x18))  # Regvardef-outputs Regvardef-outputs => eax
+    # .
+    (check-ints-equal *(eax+8) 0 "F - test-parse-mu-reg-var-def/single-output")  # Stmt-var-next
+    # . eax: (addr var) = lookup(eax->value)
+    (lookup *eax *(eax+4))  # Stmt-var-value Stmt-var-value => eax
+    # . ecx = eax
+    89/<- %ecx 0/r32/eax
+    # v->name
+    (lookup *ecx *(ecx+4))  # Var-name Var-name => eax
+    (check-strings-equal %eax "n" "F - test-parse-mu-reg-var-def/output-name")  # Var-name
+    # v->register
+    (check-strings-equal *(eax+0x18) "eax" "F - test-parse-mu-reg-var-def/output-register")  # Var-register
+    # v->type == int
+    (lookup *(ecx+8) *(ecx+0xc))  # Var-type Var-type => eax
+    (check-ints-equal *eax 1 "F - test-parse-mu-reg-var-def/output-type:0")  # Tree-is-atom
+    (check-ints-equal *(eax+4) 1 "F - test-parse-mu-reg-var-def/output-type:1")  # Tree-value
+    (check-ints-equal *(eax+0xc) 0 "F - test-parse-mu-reg-var-def/output-type:2")  # Tree-right
     # . epilogue
     89/<- %esp 5/r32/ebp
     5d/pop-to-ebp
@@ -5405,6 +5418,7 @@ $add-operation-and-inputs-to-stmt:inout-is-deref:
         ff 0/subop/increment *ecx
         ba/copy-to-edx 1/imm32/true
       }
+      # HERE
       (lookup-var-or-literal %ecx *(ebp+0x10))  # => eax
 $add-operation-and-inputs-to-stmt:save-var:
       (append-stmt-var Heap %eax *(edi+8) %edx)  # Stmt1-inouts or Regvardef-inouts => eax
@@ -5485,7 +5499,6 @@ $stmt-has-outputs:end:
     5d/pop-to-ebp
     c3/return
 
-# TODO
 # if 'name' starts with a digit, create a new literal var for it
 # otherwise return first 'name' from the top (back) of 'vars' and abort if not found
 lookup-var-or-literal:  # name: (addr slice), vars: (addr stack (handle var)), out: (addr handle var)
@@ -5493,6 +5506,7 @@ lookup-var-or-literal:  # name: (addr slice), vars: (addr stack (handle var)), o
     55/push-ebp
     89/<- %ebp 4/r32/esp
     # . save registers
+    50/push-eax
     51/push-ecx
     56/push-esi
     # esi = name
@@ -5510,24 +5524,26 @@ lookup-var-or-literal:  # name: (addr slice), vars: (addr stack (handle var)), o
       (is-decimal-digit? %ecx)  # => eax
       3d/compare-eax-and 0/imm32/false
       74/jump-if-= break/disp8
-      (new-literal-integer Heap %esi)  # => eax
+      (new-literal-integer Heap %esi *(ebp+0x10))
       eb/jump $lookup-var-or-literal:end/disp8
     }
     # else if (c == '"') return new var(name)
     {
       81 7/subop/compare %ecx 0x22/imm32/dquote
       75/jump-if-!= break/disp8
-      (new-literal Heap %esi)  # => eax
+      (new-literal Heap %esi *(ebp+0x10))
       eb/jump $lookup-var-or-literal:end/disp8
     }
     # otherwise return lookup-var(name, vars)
     {
+      # HERE
       (lookup-var %esi *(ebp+0xc))  # => eax
     }
 $lookup-var-or-literal:end:
     # . restore registers
     5e/pop-to-esi
     59/pop-to-ecx
+    58/pop-to-eax
     # . epilogue
     89/<- %esp 5/r32/ebp
     5d/pop-to-ebp
@@ -5802,28 +5818,44 @@ $new-var:end:
     5d/pop-to-ebp
     c3/return
 
-# TODO
 new-literal-integer:  # ad: (addr allocation-descriptor), name: (addr slice), out: (addr handle var)
     # . prologue
     55/push-ebp
     89/<- %ebp 4/r32/esp
     # . save registers
+    50/push-eax
     51/push-ecx
+    52/push-edx
     # if (!is-hex-int?(name)) abort
     (is-hex-int? *(ebp+0xc))  # => eax
     3d/compare-eax-and 0/imm32/false
     0f 84/jump-if-= $new-literal-integer:abort/disp32
-    # var type/ecx: (handle tree type-id) = new type()
-    (allocate *(ebp+8) *Tree-size)  # => eax
+    # var type/ecx: (handle tree type-id)
+    68/push 0/imm32
+    68/push 0/imm32
+    89/<- %ecx 4/r32/esp
+    # type = new tree()
+    (allocate *(ebp+8) *Tree-size %ecx)
+    c7 0/subop/copy *ecx 1/imm32/true  # Tree-is-atom
     # nothing else to do; default type is 'literal'
-    c7 0/subop/copy *eax 1/imm32/true  # Tree-is-atom
-    89/<- %ecx 0/r32/eax
-    # result = new var(s)
-    (new-var-from-slice *(ebp+8) *(ebp+0xc))  # => eax
-    89/<- *(eax+4) 1/r32/ecx
+    # out = new var(s)
+    (new-var-from-slice *(ebp+8) *(ebp+0xc) *(ebp+0x10))
+    # var out-addr/edx: (addr var) = lookup(*out)
+    8b/-> *(ebp+0x10) 0/r32/eax
+    (lookup *eax *(eax+4))  # => eax
+    89/<- %edx 0/r32/eax
+    # out-addr->type = type
+    8b/-> *ecx 0/r32/eax
+    89/<- *(edx+8) 0/r32/eax  # Var-type
+    8b/-> *(ecx+4) 0/r32/eax
+    89/<- *(edx+0xc) 0/r32/eax  # Var-type
 $new-literal-integer:end:
+    # . reclaim locals
+    81 0/subop/add %esp 8/imm32
     # . restore registers
+    5a/pop-to-edx
     59/pop-to-ecx
+    58/pop-to-eax
     # . epilogue
     89/<- %esp 5/r32/ebp
     5d/pop-to-ebp