]> git.mdlowis.com Git - proto/obnc.git/commitdiff
added binop scaffolding
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 1 Mar 2022 04:08:53 +0000 (23:08 -0500)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 1 Mar 2022 04:08:53 +0000 (23:08 -0500)
cerise/backend/ssa/codegen.c
cerise/inc/cerise.h
cerise/tests/Module.m

index 058f56f642242e104877fdd0b0f3075f9fe2d7a3..b891aefe502eba16dbc1d2fe0d702bf963b32632 100644 (file)
@@ -171,6 +171,78 @@ static void print_ident(Parser* p, SsaVar* var)
     printf("%c%s.%lu", scope, name, var->symver);
 }
 
+static void print_const(Type* type, SsaValue* val)
+{
+    emit_type(type);
+    if (type->form == FORM_INT)
+    {
+        printf(" %d", val->val.i);
+    }
+    else if (type->form == FORM_REAL)
+    {
+        printf(" %f", val->val.f);
+    }
+    else
+    {
+        assert(!"not implemented");
+    }
+}
+
+char* BinOpNames[NUM_TOKENS] = {
+    ['+'] = "add",
+    ['-'] = "sub",
+    ['*'] = "mul",
+    ['/'] = "div",
+    ['%'] = "rem",
+
+};
+
+char* binop_name(SsaNode* node)
+{
+    char* name = NULL;
+    if (node->type->form == FORM_INT)
+    {
+        switch(node->code)
+        {
+            case '+': name = "add"; break;
+            case '-': name = "sub"; break;
+            case '*': name = "mul"; break;
+            case '/': name = "div"; break;
+            case '%': name = "rem"; break;
+
+            case EQ:   name = "icmp eq"; break;
+            case NEQ:  name = "icmp ne"; break;
+            case LT:   name = "icmp slt"; break;
+            case GT:   name = "icmp sgt"; break;
+            case LTEQ: name = "icmp sle"; break;
+            case GTEQ: name = "icmp sge"; break;
+        }
+    }
+    else if (node->type->form == FORM_REAL)
+    {
+        switch(node->code)
+        {
+            case '+': name = "fadd"; break;
+            case '-': name = "fsub"; break;
+            case '*': name = "fmul"; break;
+            case '/': name = "fdiv"; break;
+            case '%': name = "frem"; break;
+
+            case EQ:   name = "fcmp eq"; break;
+            case NEQ:  name = "fcmp ne"; break;
+            case '<':  name = "fcmp slt"; break;
+            case '>':  name = "fcmp sgt"; break;
+            case LTEQ: name = "fcmp sle"; break;
+            case GTEQ: name = "fcmp sge"; break;
+        }
+    }
+    else
+    {
+        assert(!"not implemented");
+    }
+}
+
+
 //static void print_dest(Parser* p, SsaNode* node)
 //{
 //    if (node->mode != MODE_CONTROL)
@@ -305,11 +377,12 @@ void print_op(Parser* p, SsaNode* expr)
         case MODE_BINOP_RC:
             printf("    ");
             print_ident(p, &(expr->dest));
-            printf(" = add ");
+            printf(" = %s ", BinOpNames[expr->code]);
             emit_type(expr->type);
             printf(" ");
             print_ident(p, &(expr->left.var));
             printf(", ");
+            print_const(expr->type, &(expr->right));
             printf("\n");
             break;
 
index f5f6a52f02c5bbbf9388ddcde1c3feebdbc059f3..a3d83c61efac50c64cf8823add7f8810eb35d8e6 100644 (file)
@@ -56,6 +56,8 @@ typedef enum {
     WHILE,
     COUNT,
     CALL,
+
+    NUM_TOKENS,
     ERROR = -2,
     END_FILE = -1
 } TokType;
index cd8ab33198cc1f99ecdc8434949a436e0e4ff81a..f224888a7ae107727f6763753829d23f5eb9c301 100644 (file)
@@ -55,20 +55,20 @@ var
 #  return z1;
 #end
 
-procedure Bar*(a : Int) : Int
-begin
-    a = 42;
-    return a;
-end
-
-procedure Baz*(a : Int)
-begin
-    if (1 > 2) then
-        42;
-    else
-        24;
-    end
-end
+#procedure Bar*(a : Int) : Int
+#begin
+#    a = 42;
+#    return a;
+#end
+#
+#procedure Baz*(a : Int)
+#begin
+#    if (1 > 2) then
+#        42;
+#    else
+#        24;
+#    end
+#end
 
 begin
 #  i = 42;
@@ -112,19 +112,19 @@ begin
 #  b = -b;
 #
 #  # Arithmetic ops
-  c = b + 1;
+#  c = b + 1;
 #  c = b - 1;
 #  c = b * 1;
 #  c = b / 1;
 #  c = b % 1;
 #
 #  # Comparison ops
-#  c = b == 1;
-#  c = b != 1;
-#  c = b < 1;
-#  c = b > 1;
-#  c = b <= 1;
-#  c = b >= 1;
+  c = b == 1;
+  c = b != 1;
+  c = b < 1;
+  c = b > 1;
+  c = b <= 1;
+  c = b >= 1;
 #
 #  # Register ops
 #  c = 1 + b;