]> git.mdlowis.com Git - proto/obnc.git/commitdiff
fixed up code generation for comparison operators (integer only right now)
authorMichael D. Lowis <mike.lowis@gentex.com>
Tue, 8 Mar 2022 19:24:44 +0000 (14:24 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Tue, 8 Mar 2022 19:24:44 +0000 (14:24 -0500)
cerise/backend/ssa/codegen.c
cerise/src/grammar.c
cerise/tests/Module.m

index da2486d29234739bd25830f5e6d0b8610ca9c974..539942c4d2905af140611a5127d4377e6dd1ccb0 100644 (file)
@@ -195,7 +195,7 @@ static void print_const(Type* type, SsaValue* val)
 char* binop_name(SsaNode* node)
 {
     char* name = NULL;
-    if (node->ret_type->form == FORM_INT)
+    if (node->arg_type->form == FORM_INT)
     {
         switch(node->code)
         {
@@ -204,9 +204,16 @@ char* binop_name(SsaNode* node)
             case '*':  name = "mul"; break;
             case '/':  name = "sdiv"; break;
             case '%':  name = "srem"; break;
+
+            case EQ:   name = "icmp eq"; break;
+            case NEQ:  name = "icmp ne"; break;
+            case '<':  name = "icmp slt"; break;
+            case '>':  name = "icmp sgt"; break;
+            case LTEQ: name = "icmp sle"; break;
+            case GTEQ: name = "icmp sge"; break;
         }
     }
-    else if (node->ret_type->form == FORM_REAL)
+    else if (node->arg_type->form == FORM_REAL)
     {
         switch(node->code)
         {
@@ -215,33 +222,13 @@ char* binop_name(SsaNode* node)
             case '*':  name = "fmul"; break;
             case '/':  name = "fdiv"; break;
             case '%':  name = "frem"; break;
-        }
-    }
-    else if (node->ret_type->form == FORM_BOOL)
-    {
-        if (node->arg_type->form == FORM_INT)
-        {
-            switch(node->code)
-            {
-                case EQ:   name = "icmp eq"; break;
-                case NEQ:  name = "icmp ne"; break;
-                case '<':  name = "icmp slt"; break;
-                case '>':  name = "icmp sgt"; break;
-                case LTEQ: name = "icmp sle"; break;
-                case GTEQ: name = "icmp sge"; break;
-            }
-        }
-        else if (node->arg_type->form == FORM_REAL)
-        {
-            switch(node->code)
-            {
-                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;
-            }
+
+            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
@@ -312,7 +299,7 @@ void print_op(Parser* p, SsaNode* expr)
             printf("    ");
             print_ident(p, &(expr->dest));
             printf(" = %s ", binop_name(expr));
-            emit_type(expr->ret_type);
+            emit_type(expr->arg_type);
             printf(" ");
             print_ident(p, &(expr->left.var));
             printf(", ");
@@ -324,7 +311,7 @@ void print_op(Parser* p, SsaNode* expr)
             printf("    ");
             print_ident(p, &(expr->dest));
             printf(" = %s ", binop_name(expr));
-            emit_type(expr->ret_type);
+            emit_type(expr->arg_type);
             printf(" ");
             print_const(expr->arg_type, &(expr->left));
             printf(", ");
@@ -336,7 +323,7 @@ void print_op(Parser* p, SsaNode* expr)
             printf("    ");
             print_ident(p, &(expr->dest));
             printf(" = %s ", binop_name(expr));
-            emit_type(expr->ret_type);
+            emit_type(expr->arg_type);
             printf(" ");
             print_ident(p, &(expr->left.var));
             printf(", ");
index 34998a3a7c9008cfcf4e29df52f960b08a20c46f..46d520ae64dd7bb9f327843ee251e3bcc7c2e1d5 100644 (file)
@@ -648,6 +648,14 @@ static void module(Parser* p)
         proc_decl(p);
     }
 
+    /* now let's define the module init function */
+    Symbol* sym = symbol_new(p, 0, p->name,  SYM_PROC, 0);
+    Type* proctype = symbol_newtype(p);
+    proctype->form = FORM_PROC;
+    proctype->base = &VoidType;
+    sym->type = proctype;
+    codegen_symbol(p, sym);
+
     if (accept(p, BEGIN))
     {
         SsaBlock* block = ssa_block(p);
@@ -664,10 +672,11 @@ static void module(Parser* p)
         ssa_join(p);
 
         /* debug dump the result */
-        printf("define void @initialize()\n");
         codegen_block(p, block);
-
-//        ssa_print_asm(p, block);
+    }
+    else
+    {
+        printf("{\n    ret void\n}\n");
     }
 
     if (!matches(p, END_FILE))
index 46e2024358fc0b2dad5aa0bc7abcdf98e0c8c01f..67a6d146a761c8f76be6109dbae31c51134636ce 100644 (file)
@@ -71,8 +71,8 @@ var
 #end
 
 begin
-#  # Global variables
-#  i = 42;
+  # Global variables
+  i = 42;
 #  b = i;
 
 #  # Arithmetic ops
@@ -97,10 +97,10 @@ begin
 #  c = b % b;
 
 #  # Comparison ops
-  a = b == 1;
-  a = 1 == b;
+#  a = b == 1;
+#  a = 1 == b;
 #  a = b == b;
-
+#
 #  a = b != 1;
 #  a = 1 != b;
 #  a = b != b;