about summary refs log tree commit diff stats
path: root/apps
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2020-02-07 00:11:02 -0800
committerKartik Agaram <vc@akkartik.com>2020-02-07 00:14:17 -0800
commit0b636ffe7218d888f446fa055ea8a121773c3f38 (patch)
treed1d6f1c45325a885c9cd60887b0923c69cd61dec /apps
parentf3d054032d8c67901c43b94d3ff42eb623561bda (diff)
downloadmu-0b636ffe7218d888f446fa055ea8a121773c3f38.tar.gz
5992
Diffstat (limited to 'apps')
-rwxr-xr-xapps/mubin116171 -> 116267 bytes
-rw-r--r--apps/mu.subx55
2 files changed, 43 insertions, 12 deletions
diff --git a/apps/mu b/apps/mu
index 47a7754d..458dcbad 100755
--- a/apps/mu
+++ b/apps/mu
Binary files differdiff --git a/apps/mu.subx b/apps/mu.subx
index e0dd1908..4dcc8aa1 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -4317,22 +4317,52 @@ $emit-subx-stmt-list:check-for-break:
           3d/compare-eax-and 0/imm32
           0f 84/jump-if-= break/disp32
           81 7/subop/compare *(ecx+8) 0/imm32  # Stmt1-inouts
-          0f 85/jump-if-!= break/disp32
+          {
+            0f 85/jump-if-!= break/disp32
 $emit-subx-stmt-list:zero-arg-break:
-          # create a new block for the remaining statements
-          (emit-indent *(ebp+8) *Curr-block-depth)
-          (write-buffered *(ebp+8) "{\n")
-          ff 0/subop/increment *Curr-block-depth
-          (emit-subx-stmt-list *(ebp+8) %esi *(ebp+0x10))
-          ff 1/subop/decrement *Curr-block-depth
-          (emit-indent *(ebp+8) *Curr-block-depth)
-          (write-buffered *(ebp+8) "}\n")
-          # return $emit-subx-stmt-list
-          e9/jump $emit-subx-stmt-list:cleanup/disp32
+            # create a new block for the remaining statements
+            (emit-indent *(ebp+8) *Curr-block-depth)
+            (write-buffered *(ebp+8) "{\n")
+            ff 0/subop/increment *Curr-block-depth
+            (emit-subx-stmt-list *(ebp+8) %esi *(ebp+0x10))
+            ff 1/subop/decrement *Curr-block-depth
+            (emit-indent *(ebp+8) *Curr-block-depth)
+            (write-buffered *(ebp+8) "}\n")
+            # return $emit-subx-stmt-list
+            e9/jump $emit-subx-stmt-list:cleanup/disp32
+          }
+          {
+            0f 84/jump-if-= break/disp32
+$emit-subx-stmt-list:one-arg-break:
+            # TODO
+            # continue
+            e9/jump $emit-subx-stmt-list:continue/disp32
+          }
         }
         {
+          # if !var-seen? break
+          81 7/subop/compare %edx 0/imm32/false
+          0f 84/jump-if-= break/disp32
 $emit-subx-stmt-list:check-for-loop:
-          # TODO
+          # if (!string-starts-with?(var->operation, "loop")) break
+          (string-starts-with? *(ecx+4) "loop")  # Stmt1-operation => eax
+          3d/compare-eax-and 0/imm32
+          0f 84/jump-if-= break/disp32
+          81 7/subop/compare *(ecx+8) 0/imm32  # Stmt1-inouts
+          {
+            0f 85/jump-if-!= break/disp32
+$emit-subx-stmt-list:zero-arg-loop:
+            # TODO
+            # continue
+            e9/jump $emit-subx-stmt-list:continue/disp32
+          }
+          {
+            0f 84/jump-if-= break/disp32
+$emit-subx-stmt-list:one-arg-loop:
+            # TODO
+            # continue
+            e9/jump $emit-subx-stmt-list:continue/disp32
+          }
         }
 $emit-subx-stmt-list:stmt:
         (emit-subx-statement *(ebp+8) %ecx Primitives *Program)
@@ -4371,6 +4401,7 @@ $emit-subx-stmt-list:regvardef:
         # var-seen? = true
         ba/copy-to-edx 1/imm32/true
       }
+$emit-subx-stmt-list:continue:
       # TODO: raise an error on unrecognized Stmt-tag
       8b/-> *(esi+4) 6/r32/esi  # List-next
       e9/jump loop/disp32