about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--apps/mu.subx28
1 files changed, 15 insertions, 13 deletions
diff --git a/apps/mu.subx b/apps/mu.subx
index 4a4bde35..2a3d331d 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -6090,8 +6090,8 @@ $type-equal?:end:
 
 Curr-block-depth:  # (addr int)
     0/imm32
-Next-local-stack-offset:  # (addr int)
-    -4/imm32
+Curr-local-stack-offset:  # (addr int)
+    0/imm32
 
 == code
 
@@ -6151,12 +6151,12 @@ emit-subx-function:  # out: (addr buffered-file), f: (handle function)
     (write-buffered %edi ":\n")
     # initialize some global state
     c7 0/subop/copy *Curr-block-depth 1/imm32
-    c7 0/subop/copy *Next-local-stack-offset -4/imm32
+    c7 0/subop/copy *Curr-local-stack-offset 0/imm32
     #
     (emit-subx-prologue %edi)
     (emit-subx-block %edi *(ecx+0x10) %edx)  # Function-body
     (emit-subx-epilogue %edi)
-    # TODO: validate that *Curr-block-depth and *Next-local-stack-offset have
+    # TODO: validate that *Curr-block-depth and *Curr-local-stack-offset have
     # been cleaned up
 $emit-subx-function:end:
     # . reclaim locals
@@ -6425,8 +6425,8 @@ compute-reg-and-maybe-emit-spill:  # out: (addr buffered-file), stmt: (handle re
     3d/compare-eax-and 0/imm32/false
     75/jump-if-!= $compute-reg-and-maybe-emit-spill:end/disp8
     # TODO: assert(sizeof(output) == 4)
-    # *Next-local-stack-offset -= 4
-    81 5/subop/subtract *Next-local-stack-offset 4/imm32
+    # *Curr-local-stack-offset -= 4
+    81 5/subop/subtract *Curr-local-stack-offset 4/imm32
     # emit spill
     (emit-indent *(ebp+8) *Curr-block-depth)
     (write-buffered *(ebp+8) "ff 6/subop/push %")
@@ -6961,13 +6961,13 @@ $clean-up-blocks:reclaim-loop:
       # if (v->block-depth < until-block-depth) break
       39/compare *(eax+8) 1/r32/ecx  # Var-block-depth
       7c/jump-if-< break/disp8
-      # if v is on the stack, update Next-local-stack-offset
+      # if v is on the stack, update Curr-local-stack-offset
       81 7/subop/compare *(eax+0x10) 0/imm32  # Var-register
       {
         75/jump-if-!= break/disp8
 $clean-up-blocks:reclaim-var-on-stack:
         (size-of %eax)  # => eax
-        01/add *Next-local-stack-offset 0/r32/eax
+        01/add *Curr-local-stack-offset 0/r32/eax
       }
       (pop %esi)
       e9/jump loop/disp32
@@ -6989,20 +6989,21 @@ emit-subx-var-def:  # out: (addr buffered-file), stmt: (handle stmt)
     # . save registers
     50/push-eax
     51/push-ecx
+    52/push-edx
     # eax = stmt
     8b/-> *(ebp+0xc) 0/r32/eax
     # var v/ecx: (handle var)
     8b/-> *(eax+4) 1/r32/ecx
-    # v->offset = *Next-local-stack-offset
-    8b/-> *Next-local-stack-offset 0/r32/eax
-    89/<- *(ecx+0xc) 0/r32/eax  # Var-offset
     # v->block-depth = *Curr-block-depth
     8b/-> *Curr-block-depth 0/r32/eax
     89/<- *(ecx+8) 0/r32/eax  # Var-block-depth
     # var n/eax: int = size-of(stmt->var)
     (size-of %ecx)  # Vardef-var => eax
-    # *Next-local-stack-offset -= n
-    29/subtract-from *Next-local-stack-offset 0/r32/eax
+    # *Curr-local-stack-offset -= n
+    29/subtract-from *Curr-local-stack-offset 0/r32/eax
+    # v->offset = *Curr-local-stack-offset
+    8b/-> *Curr-local-stack-offset 2/r32/edx
+    89/<- *(ecx+0xc) 2/r32/edx  # Var-offset
     # while n > 0
     {
       3d/compare-eax-with 0/imm32
@@ -7016,6 +7017,7 @@ emit-subx-var-def:  # out: (addr buffered-file), stmt: (handle stmt)
     }
 $emit-subx-var-def:end:
     # . restore registers
+    5a/pop-to-edx
     59/pop-to-ecx
     58/pop-to-eax
     # . epilogue