about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-03-10 16:34:42 -0700
committerKartik Agaram <vc@akkartik.com>2020-03-10 16:34:42 -0700
commite58a77d528cfe10dd4fc0aeb4abb2180e14659e0 (patch)
tree6f337dc7d68ac64209413bbe5cec92e48c710048 /apps
parentfed9e7135c13ef8fa745afd2075eb2ff529d6241 (diff)
downloadmu-e58a77d528cfe10dd4fc0aeb4abb2180e14659e0.tar.gz
6117 - fix offset computation
It makes no sense to know where the next variable will start before I've
seen it or how much space it needs. Things have only been working so far
because all variables take 4 bytes.
Diffstat (limited to 'apps')
-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
href='#n295'>295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366