about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik Agaram <vc@akkartik.com>2019-11-25 21:00:07 -0800
committerKartik Agaram <vc@akkartik.com>2019-11-25 21:00:07 -0800
commitedce9c00ee20d2ff12260783440cbac4573fdee9 (patch)
treed23ef320810d99400389f9b3e425002ea6d8567e
parentf88f77cdabae2062903e24fc0a42108eccfe519d (diff)
downloadmu-edce9c00ee20d2ff12260783440cbac4573fdee9.tar.gz
5759 - design statement data structure
-rw-r--r--apps/mu.subx94
1 files changed, 80 insertions, 14 deletions
diff --git a/apps/mu.subx b/apps/mu.subx
index 1612e9ce..d70414e8 100644
--- a/apps/mu.subx
+++ b/apps/mu.subx
@@ -91,13 +91,39 @@
 #   A var-type contains:
 #     name: string
 #     type: s-expression of type ids
-#   Statements are not yet fully designed.
-#   statement = var definition or simple statement or block
-#   simple statement:
+#
+#   A statement can be:
+#     tag 0: a block
+#     tag 1: a simple statement
+#     tag 2: a variable defined on the stack
+#     tag 3: a variable defined in a register
+#     tag 4: a named block
+#
+#   A block contains:
+#     tag: 0
+#     statements: (address list statement)
+#
+#   A regular statement contains:
+#     tag: 1
 #     operation: string
-#     inouts: linked list of vars
-#     outputs: linked list of vars
-#   block = linked list of statements
+#     inouts: (address list operand)
+#     outputs: (address list var)
+#
+#   A variable defined on the stack contains:
+#     tag: 2
+#     name: string
+#     type: type-tree
+#
+#   A variable defined in a register contains:
+#     tag: 3
+#     name: string
+#     type: type-tree
+#     reg: string
+#
+#   A named block contains:
+#     tag: 4
+#     name: string
+#     statements: (address list statement)
 
 # == Translation: managing the stack
 # Now that we know what the language looks like in the large, let's think
@@ -246,6 +272,36 @@ Primitive-next:  # (address function)
 Primitive-size:
   0x20/imm32/24
 
+Stmt-tag:
+  0/imm32
+
+Block-statements:  # (address list statement)
+  4/imm32
+
+Stmt1-operation:  # string
+  4/imm32
+Stmt1-inouts:  # (address list operand)
+  8/imm32
+Stmt1-outputs:  # (address list var)
+  0xc/imm32
+
+Vardef-name:  # string
+  4/imm32
+Vardef-type:  # (address tree type-id)
+  8/imm32
+
+Regvardef-name:  # string
+  4/imm32
+Regvardef-type:  # (address tree type-id)
+  8/imm32
+Regvardef-register:  # string
+  0xc/imm32
+
+Named-block-name:
+  4/imm32
+Named-block-statements:  # (address list statement)
+  8/imm32
+
 Stmt-operation:
   0/imm32
 Stmt-inouts:
@@ -1080,7 +1136,7 @@ get-stmt-operand-from-arg-location:  # stmt : (address statement), l : arg-locat
       3d/compare-eax-and 1/imm32
       75/jump-if-not-equal break/disp8
 $get-stmt-operand-from-arg-location:1:
-      8b/-> *(ecx+4) 0/r32/eax  # Stmt-inouts
+      8b/-> *(ecx+8) 0/r32/eax  # Stmt1-inouts
       8b/-> *eax 0/r32/eax  # Operand-var
       eb/jump $get-stmt-operand-from-arg-location:end/disp8
     }
@@ -1089,7 +1145,7 @@ $get-stmt-operand-from-arg-location:1:
       3d/compare-eax-and 2/imm32
       75/jump-if-not-equal break/disp8
 $get-stmt-operand-from-arg-location:2:
-      8b/-> *(ecx+4) 0/r32/eax  # Stmt-inouts
+      8b/-> *(ecx+8) 0/r32/eax  # Stmt1-inouts
       8b/-> *(eax+4) 0/r32/eax  # Operand-next
       8b/-> *eax 0/r32/eax  # Operand-var
       eb/jump $get-stmt-operand-from-arg-location:end/disp8
@@ -1099,7 +1155,7 @@ $get-stmt-operand-from-arg-location:2:
       3d/compare-eax-and 3/imm32
       75/jump-if-not-equal break/disp8
 $get-stmt-operand-from-arg-location:3:
-      8b/-> *(ecx+8) 0/r32/eax  # Stmt-outputs
+      8b/-> *(ecx+0xc) 0/r32/eax  # Stmt1-outputs
       8b/-> *eax 0/r32/eax  # Operand-var
       eb/jump $get-stmt-operand-from-arg-location:end/disp8
     }
@@ -1189,7 +1245,7 @@ emit-subx-call:  # out : (address buffered-file), stmt : (address statement), va
     # - emit arguments
     # var curr/ecx : (list var) = stmt->inouts
     8b/-> *(ebp+0xc) 1/r32/ecx
-    8b/-> *(ecx+4) 1/r32/ecx  # Stmt-inouts
+    8b/-> *(ecx+8) 1/r32/ecx  # Stmt1-inouts
     {
       # if (curr == null) break
       81 7/subop/compare %ecx 0/imm32
@@ -1350,7 +1406,7 @@ mu-stmt-matches-function?:  # stmt : (address statement), function : (address op
     # return primitive->name == stmt->operation
     8b/-> *(ebp+8) 1/r32/ecx
     8b/-> *(ebp+0xc) 0/r32/eax
-    (string-equal? *ecx *eax)  # => eax
+    (string-equal? *(ecx+4) *eax)  # Stmt1-operation, Primitive-name => eax
 $mu-stmt-matches-function?:end:
     # . restore registers
     59/pop-to-ecx
@@ -1381,7 +1437,7 @@ mu-stmt-matches-primitive?:  # stmt : (address statement), primitive : (address
     {
 $mu-stmt-matches-primitive?:check-name:
       # if (primitive->name != stmt->operation) return false
-      (string-equal? *ecx *edx)  # => eax
+      (string-equal? *(ecx+4) *edx)  # Stmt1-operation, Primitive-name => eax
       3d/compare-eax-and 0/imm32
       75/jump-if-not-equal break/disp8
       b8/copy-to-eax 0/imm32
@@ -1389,7 +1445,7 @@ $mu-stmt-matches-primitive?:check-name:
     }
 $mu-stmt-matches-primitive?:check-inouts:
     # curr = stmt->inouts
-    8b/-> *(ecx+4) 6/r32/esi  # Stmt-inouts
+    8b/-> *(ecx+8) 6/r32/esi  # Stmt1-inouts
     # curr2 = primitive->inouts
     8b/-> *(edx+4) 7/r32/edi  # Primitive-inouts
     {
@@ -1434,7 +1490,7 @@ $mu-stmt-matches-primitive?:check-outputs:
     # edx = primitive
     8b/-> *(ebp+0xc) 2/r32/edx
     # curr = stmt->outputs
-    8b/-> *(ecx+8) 6/r32/esi  # Stmt-outputs
+    8b/-> *(ecx+0xc) 6/r32/esi  # Stmt1-outputs
     # curr2 = primitive->outputs
     8b/-> *(edx+8) 7/r32/edi  # Primitive-outputs
     {
@@ -1581,6 +1637,7 @@ test-emit-subx-statement-primitive:
     68/push 0/imm32/outputs
     53/push-ebx/operands
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
 #? $aa-stmt-in-esi:
     # primitives/ebx : primitive
@@ -1655,6 +1712,7 @@ test-emit-subx-statement-primitive-register:
     53/push-ebx/outputs
     68/push 0/imm32/inouts
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # formal-var/ebx : var in any register
     68/push Any-register/imm32
@@ -1741,6 +1799,7 @@ test-emit-subx-statement-select-primitive:
     57/push-edi/outputs
     68/push 0/imm32/inouts
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # formal-var/ebx : var in any register
     68/push Any-register/imm32
@@ -1837,6 +1896,7 @@ test-emit-subx-statement-select-primitive-2:
     68/push 0/imm32/outputs
     57/push-edi/inouts
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # formal-var/ebx : var in any register
     68/push Any-register/imm32
@@ -1927,6 +1987,7 @@ test-increment-register:
     57/push-edi/outputs
     68/push 0/imm32/inouts
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # convert
     (emit-subx-statement _test-output-buffered-file %esi %edx Primitives 0)
@@ -1986,6 +2047,7 @@ test-increment-var:
     68/push 0/imm32/outputs
     57/push-edi/inouts
     68/push "increment"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # convert
     (emit-subx-statement _test-output-buffered-file %esi %edx Primitives 0)
@@ -2041,6 +2103,7 @@ test-add-reg-to-reg:
     57/push-edi/outputs
     56/push-esi/inouts
     68/push "add"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # convert
     (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0)
@@ -2096,6 +2159,7 @@ test-add-literal-to-reg:
     57/push-edi/outputs
     56/push-esi/inouts
     68/push "add"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # convert
     (emit-subx-statement _test-output-buffered-file %esi 0 Primitives 0)
@@ -2160,6 +2224,7 @@ test-emit-subx-statement-function-call:
     68/push 0/imm32/outputs
     56/push-esi/inouts
     68/push "f"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # functions/ebx : function
     68/push 0/imm32/next
@@ -2218,6 +2283,7 @@ test-emit-subx-statement-function-call-with-literal-arg:
     68/push 0/imm32/outputs
     56/push-esi/inouts
     68/push "f"/imm32/operation
+    68/push 1/imm32
     89/<- %esi 4/r32/esp
     # functions/ebx : function
     68/push 0/imm32/next