]> git.mdlowis.com Git - proto/obnc.git/commitdiff
checkpoint commit
authormike lowis <mike@mdlowis.com>
Mon, 3 May 2021 03:20:43 +0000 (23:20 -0400)
committermike lowis <mike@mdlowis.com>
Mon, 3 May 2021 03:20:43 +0000 (23:20 -0400)
cerise/examples/operators.c
cerise/examples/x86_64_ops.s [new file with mode: 0644]
cerise/oberon0/OSP.Mod
cerise/src/grammar.c
cerise/tests/Module.m

index c9cdbf65e7df2ab00befc38896cb6f87a9439b7e..e1371c8c8704eaa3804bad91e8440e50ad32ad46 100644 (file)
@@ -1,5 +1,3 @@
-long A, B;
-
 void pos(void)  { A = +A;  }
 void neg(void)  { A = -A; }
 
@@ -27,3 +25,31 @@ void bor(void)  { A = A | B; }
 void bnot(void) { A = ~A;    }
 void bxor(void) { A = A ^ B; }
 
+long A, B;
+
+long addi(void)  { return A + B; }
+//long addii(void) { return A + 3; }
+
+long subi(void)  { return A - B; }
+//long subii(void) { return A - 3; }
+
+long muli(void)  { return A * B; }
+//long mulii(void) { return A * 3; }
+
+long divi(void)  { return A / B; }
+//long divii(void) { return A / 3; }
+
+long modi(void)  { return A % B; }
+//long modii(void) { return A % 3; }
+
+void pop(void)   { asm("pop %rax");  }
+void push(void)  { asm("push %rax"); }
+
+// call
+// ret
+
+long ldi(void) { return 42; }
+long ldm(void) { return A;  }
+void sti(void) { A = 42;    }
+void stm(void) { A = B;     }
+
diff --git a/cerise/examples/x86_64_ops.s b/cerise/examples/x86_64_ops.s
new file mode 100644 (file)
index 0000000..9757677
--- /dev/null
@@ -0,0 +1,125 @@
+pop:
+        pop %rax
+push:
+        push %rax
+
+ldi:
+        movl    $42, %eax
+ldm:
+        movq    A(%rip), %rax
+sti:
+        movq    $42, A(%rip)
+stm:
+        movq    %rax, A(%rip)
+
+neg:
+        negq    A(%rip)
+        negq    %rax
+add:
+        addq    A(%rip), %rax
+        addq    $42, %rax
+sub:
+        subq    B(%rip), %rax
+        subq    $42, %rax
+mul:
+        imulq   B(%rip), %rax
+        imulq   $42, %rax
+div:
+        cqto    # FIRST
+        idivq   B(%rip)
+        idivq   %rax
+mod:
+        cqto    # FIRST
+        idivq   B(%rip)
+        idivq   %rax
+        movq    %rdx, %rax # LAST
+
+eq:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        sete    %al
+        movzbl  %al, %eax
+neq:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        setne   %al
+        movzbl  %al, %eax
+lt:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        setl    %al
+        movzbl  %al, %eax
+lte:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        setle   %al
+        movzbl  %al, %eax
+gt:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        setg    %al
+        movzbl  %al, %eax
+gte:
+        movq    B(%rip), %rax
+        cmpq    %rax, A(%rip)
+        setge   %al
+        movzbl  %al, %eax
+eqi:
+        xorl    %eax, %eax
+        cmpq    $4, A(%rip)
+        sete    %al
+neqi:
+        xorl    %eax, %eax
+        cmpq    $4, A(%rip)
+        setne   %al
+lti:
+        xorl    %eax, %eax
+        cmpq    $3, A(%rip)
+        setle   %al
+ltei:
+        xorl    %eax, %eax
+        cmpq    $4, A(%rip)
+        setle   %al
+gti:
+        xorl    %eax, %eax
+        cmpq    $4, A(%rip)
+        setg    %al
+gtei:
+        xorl    %eax, %eax
+        cmpq    $3, A(%rip)
+        setg    %al
+
+shr:
+        movq    B(%rip), %rcx
+        sarq    %cl, A(%rip)
+        ret
+shl:
+        movq    B(%rip), %rcx
+        salq    %cl, A(%rip)
+        ret
+band:
+        movq    B(%rip), %rax
+        andq    %rax, A(%rip)
+        ret
+bor:
+        movq    B(%rip), %rax
+        orq     %rax, A(%rip)
+        ret
+bnot:
+        notq    A(%rip)
+        ret
+bxor:
+        movq    B(%rip), %rax
+        xorq    %rax, A(%rip)
+        ret
+
+shri:
+        sarq    $4, A(%rip)
+shli:
+        salq    $4, A(%rip)
+bandi:
+        andq    $4, A(%rip)
+bori:
+        orq     $4, A(%rip)
+bxori:
+        xorq    $4, A(%rip)
index 4185e42c19d4bb1ab4d4ac7e03477db73db536a0..2997d6afc9f5af0f4335af9f5f9b36ac73c7d1cf 100644 (file)
@@ -61,7 +61,8 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
   END OpenScope;\r
 \r
   PROCEDURE CloseScope;\r
-  BEGIN topScope := topScope.dsc\r
+  BEGIN\r
+    topScope := topScope.dsc\r
   END CloseScope;\r
 \r
   (* -------------------- Parser ---------------------*)\r
@@ -79,7 +80,8 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
         END ;\r
         Check(OSS.rbrak, "no ]")\r
 \r
-      ELSE (*period*) OSS.Get(sym);\r
+      ELSE (*period*)\r
+        OSS.Get(sym);\r
         IF sym = OSS.ident THEN\r
           IF x.type.form = OSG.Record THEN\r
             FindField(obj, x.type.dsc); OSS.Get(sym);\r
@@ -100,7 +102,8 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
 \r
   PROCEDURE Parameter(par: OSG.Object);\r
     VAR x: OSG.Item; varpar: BOOLEAN;\r
-  BEGIN expression(x);\r
+  BEGIN\r
+    expression(x);\r
     IF par # NIL THEN\r
       varpar := par.class = OSG.Par;\r
       IF CompTypes(par.type, x.type) THEN\r
@@ -119,17 +122,24 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
     VAR n: INTEGER; par: OSG.Object;\r
   BEGIN par := obj.dsc; n := 0;\r
     IF sym # OSS.rparen THEN\r
-      Parameter(par); n := 1;\r
+      Parameter(par);\r
+      n := 1;\r
       WHILE sym <= OSS.comma DO\r
         Check(sym, "comma?");\r
-        IF par # NIL THEN par := par.next END ;\r
-        INC(n); Parameter(par)\r
+        IF par # NIL THEN\r
+          par := par.next\r
+        END ;\r
+        INC(n);\r
+        Parameter(par)\r
       END ;\r
       Check(OSS.rparen, ") missing")\r
-    ELSE OSS.Get(sym);\r
+    ELSE\r
+      OSS.Get(sym);\r
     END ;\r
-    IF n < obj.nofpar THEN OSS.Mark("too few params")\r
-    ELSIF n > obj.nofpar THEN OSS.Mark("too many params")\r
+    IF n < obj.nofpar THEN\r
+      OSS.Mark("too few params")\r
+    ELSIF n > obj.nofpar THEN\r
+      OSS.Mark("too many params")\r
     END\r
   END ParamList;\r
 \r
@@ -145,7 +155,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
       IF sym = OSS.rparen THEN OSS.Get(sym) ELSE OSS.Mark("rparen expected") END\r
     ELSE OSS.Mark("param missing"); OSG.MakeConstItem(x, OSG.intType, 0)\r
     END\r
-  END StandFunc;\r
+  END StandF\unc;\r
 \r
   PROCEDURE factor(VAR x: OSG.Item);\r
     VAR obj: OSG.Object;\r
@@ -154,6 +164,7 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
         OSS.Mark("expression expected");\r
         REPEAT OSS.Get(sym) UNTIL (sym >= OSS.int) & (sym <= OSS.ident)\r
     END ;\r
+\r
     IF sym = OSS.ident THEN\r
       find(obj);\r
       OSS.Get(sym);\r
@@ -167,27 +178,36 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
         OSG.MakeItem(x, obj, level);\r
         selector(x)\r
       END\r
+\r
     ELSIF sym = OSS.int THEN\r
         OSG.MakeConstItem(x, OSG.intType, OSS.val);\r
         OSS.Get(sym)\r
+\r
     ELSIF sym = OSS.char THEN\r
         OSG.MakeConstItem(x, OSG.intType, OSS.val);\r
         OSS.Get(sym)\r
+\r
     ELSIF sym = OSS.lparen THEN\r
       OSS.Get(sym);\r
-      IF sym # OSS.rparen THEN expression(x) END ;\r
+      IF sym # OSS.rparen THEN\r
+        expression(x)\r
+      END ;\r
       Check(OSS.rparen, "no )")\r
+\r
     ELSIF sym = OSS.not THEN\r
         OSS.Get(sym);\r
         factor(x);\r
         CheckBool(x);\r
         OSG.Not(x)\r
+\r
     ELSIF sym = OSS.false THEN\r
         OSS.Get(sym);\r
         OSG.MakeConstItem(x, OSG.boolType, 0)\r
+\r
     ELSIF sym = OSS.true THEN\r
         OSS.Get(sym);\r
         OSG.MakeConstItem(x, OSG.boolType, 1)\r
+\r
     ELSE\r
         OSS.Mark("factor?");\r
         OSG.MakeItem(x, dummy, level)\r
@@ -591,7 +611,8 @@ MODULE OSP; (* NW 23.9.93 / 9,5.2017   OSPX*)
       END\r
     END FPSection;\r
 \r
-  BEGIN (* ProcedureDecl *) OSS.Get(sym);\r
+  BEGIN (* ProcedureDecl *)\r
+    OSS.Get(sym);\r
     IF sym = OSS.ident THEN\r
       procid := OSS.id; NewObj(proc, OSG.Proc); OSS.Get(sym); parblksize := marksize; nofpar := 0;\r
     (* Texts.Write(W, "%"); Texts.WriteInt(W, sym, 4); Texts.WriteLn(W); Texts.Append(Oberon.Log, W.buf); *)\r
index 5503ca313676e595e0a45e2d082d7388a3bdcc9a..1d02b99eac480aaa75a4fd0f770a1628e46db8a7 100644 (file)
@@ -61,17 +61,23 @@ static void init_item(Item* item, Symbol* sym)
  *****************************************************************************/
 static void expression(Parser* p, Item* item);
 
-//RULE(expr_list)
-//{
-//    while (1)
-//    {
-//        expression(p);
-//        if (!accept(p, ','))
-//        {
-//            break;
-//        }
-//    }
-//}
+RULE(expr_list)
+{
+    (void)item;
+    int nargs = 0;
+    Item arg = {0};
+    if (!matches(p, ')'))
+    {
+        expression(p, &arg);
+        nargs++;
+        while (!matches(p, ')'))
+        {
+            expect(p, ',');
+            expression(p, &arg);
+            nargs++;
+        }
+    }
+}
 
 RULE(qualident)
 {
@@ -103,9 +109,9 @@ RULE(qualident)
 RULE(designator)
 {
     qualident(p, item);
-//    /* selector */
-//    switch ((int)peek(p)->type)
-//    {
+    /* selector */
+    switch ((int)peek(p)->type)
+    {
 //        case '.':
 //            expect(p, IDENT);
 //            break;
@@ -123,7 +129,7 @@ RULE(designator)
 //            qualident(p);
 //            expect(p, ')');
 //            break;
-//    }
+    }
 }
 
 RULE(factor)
@@ -170,7 +176,14 @@ RULE(factor)
 
         case IDENT:
             designator(p, item);
-//            actual_params(p);
+            if (accept(p, '('))
+            {
+                //Item call = {0};
+                // check item is a procedure
+                expr_list(p, item);
+                //codegen_call(p, &call);
+                expect(p, ')');
+            }
             break;
     }
 }
index ca2764d76e30e4d1726e62703fea4fc3b4dc6621..00e319350204cef854bb99ee9d598f46666f9b1d 100644 (file)
@@ -55,30 +55,32 @@ begin
 #  c = b + b * b + b;
 #
 
-  # If statements
-  if 1 == 1 then
-    c = 1;
-  end
-
-  if 1 == 1 then
-    c = 1;
-  else
-    c = 1;
-  end
-
-  if 1 == 1 then
-    c = 1;
-  elsif 2 == 2 then
-    c = 1;
-  end
+#  # If statements
+#  if 1 == 1 then
+#    c = 1;
+#  end
+#
+#  if 1 == 1 then
+#    c = 1;
+#  else
+#    c = 1;
+#  end
+#
+#  if 1 == 1 then
+#    c = 1;
+#  elsif 2 == 2 then
+#    c = 1;
+#  end
+#
+#  if 1 == 1 then
+#    c = 1;
+#  elsif 2 == 2 then
+#    c = 2;
+#  elsif 2 == 2 then
+#    c = 2;
+#  else
+#    c = 3;
+#  end
 
-  if 1 == 1 then
-    c = 1;
-  elsif 2 == 2 then
-    c = 2;
-  elsif 2 == 2 then
-    c = 2;
-  else
-    c = 3;
-  end
+    c = c(1,2,3);
 end