]> git.mdlowis.com Git - proto/obnc.git/commitdiff
checkpoint commit for coalescing constants into operations
authorMichael D. Lowis <mike.lowis@gentex.com>
Tue, 1 Mar 2022 02:08:13 +0000 (21:08 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Tue, 1 Mar 2022 02:08:13 +0000 (21:08 -0500)
cerise/backend/ssa/codegen.c
cerise/inc/cerise.h
cerise/src/grammar.c
cerise/src/ssa.c
cerise/tests/Module.m

index 50565057d4aa89a548f1112db64686d942e56bc3..058f56f642242e104877fdd0b0f3075f9fe2d7a3 100644 (file)
@@ -165,107 +165,168 @@ static void topsort(Bitset* set, SsaBlock** sorted, SsaBlock* block)
 static void print_ident(Parser* p, SsaVar* var)
 {
     Symbol* s = symbol_getbyid(p, var->symid);
-    printf("%s.%lu", s->name, var->symver);
+    char* name = (s->name[0] == '$' ? "" : s->name);
+    bool is_global = (s->global || s->class == SYM_PROC) && (s->class != SYM_TYPE);
+    char scope = (is_global ? '@' : '%');
+    printf("%c%s.%lu", scope, name, var->symver);
 }
 
-static void print_dest(Parser* p, SsaNode* node)
-{
-    if (node->mode != MODE_CONTROL)
-    {
-        print_ident(p, &(node->dest));
-        printf(" = ");
-    }
-}
-
-static void print_opcode(SsaNode* node)
-{
-    int op = node->code;
-    if (op < 256)
-    {
-        printf(" %c ", op);
-    }
-    else if (op == RETURN)
-    {
-        printf(" return ");
-    }
-    else if (op == IF)
-    {
-        printf("if ");
-    }
-    else if (op == EQ)
-    {
-        printf(" == ");
-    }
-    else if (op == NEQ)
-    {
-        printf(" != ");
-    }
-    else if (op == LTEQ)
-    {
-        printf(" <= ");
-    }
-    else if (op == GTEQ)
-    {
-        printf(" >= ");
-    }
-     else
-    {
-        printf("%d\n", op);
-    }
-}
+//static void print_dest(Parser* p, SsaNode* node)
+//{
+//    if (node->mode != MODE_CONTROL)
+//    {
+//        print_ident(p, &(node->dest));
+//        printf(" = ");
+//    }
+//}
+//
+//static void print_opcode(SsaNode* node)
+//{
+//    int op = node->code;
+//    if (op < 256)
+//    {
+//        printf(" %c ", op);
+//    }
+//    else if (op == RETURN)
+//    {
+//        printf(" return ");
+//    }
+//    else if (op == IF)
+//    {
+//        printf("if ");
+//    }
+//    else if (op == EQ)
+//    {
+//        printf(" == ");
+//    }
+//    else if (op == NEQ)
+//    {
+//        printf(" != ");
+//    }
+//    else if (op == LTEQ)
+//    {
+//        printf(" <= ");
+//    }
+//    else if (op == GTEQ)
+//    {
+//        printf(" >= ");
+//    }
+//     else
+//    {
+//        printf("%d\n", op);
+//    }
+//}
+//
+//void print_op(Parser* p, SsaNode* expr)
+//{
+//    (void)p;
+//    switch(expr->code)
+//    {
+//        case IDENT:
+//            print_ident(p, &(expr->left.var));
+//            break;
+//
+//        case BOOL:
+//            printf("load %%Bool, %d", ssa_asbool(expr));
+//            break;
+//
+//        case INT:
+//            printf("internal constant %%Int %lld", ssa_asint(expr));
+//            break;
+//
+//        case REAL:
+//            printf("load %%Real, %f", ssa_asreal(expr));
+//            break;
+//
+//        case IF:
+//            printf("if ");
+//            print_ident(p, &(expr->dest));
+//            printf(" then block%lu else block%lu", expr->left.block->id, expr->right.block->id);
+//            break;
+//
+//        case RETURN:
+//            printf("return ");
+//            print_ident(p, &(expr->dest));
+//            break;
+//
+//        default:
+//            if (expr->mode == MODE_VAR)
+//            {
+//                print_ident(p, &(expr->left.var));
+//            }
+//            else if (expr->mode == MODE_UNOP)
+//            {
+//                print_opcode(expr);
+//                print_ident(p, &(expr->left.var));
+//            }
+//            else if (expr->mode == MODE_BINOP)
+//            {
+//                print_ident(p, &(expr->left.var));
+//                print_opcode(expr);
+//                print_ident(p, &(expr->right.var));
+//            }
+//            else
+//            {
+//                printf("??? M:%d C:%d\n", expr->mode, expr->code);
+//            }
+//            break;
+//    }
+//}
+//
 
 void print_op(Parser* p, SsaNode* expr)
 {
-    (void)p;
-    switch(expr->code)
+    switch(expr->mode)
     {
-        case IDENT:
-            print_ident(p, &(expr->left.var));
+        case MODE_CONTROL:
+            break;
+
+        case MODE_UNOP:
+            printf("    ");
+            print_ident(p, &(expr->dest));
+            printf(" = \n");
             break;
 
-        case BOOL:
-            printf("(Bool)%d", ssa_asbool(expr));
+        case MODE_BINOP:
+            printf("    ");
+            print_ident(p, &(expr->dest));
+            printf(" = \n");
             break;
 
-        case INT:
-            printf("(Int)%lld", ssa_asint(expr));
+        case MODE_BINOP_LC:
+            printf("    %%");
+            print_ident(p, &(expr->dest));
+            printf(" = add ");
+            emit_type(expr->type);
+            print_ident(p, &(expr->dest));
+            printf("\n");
             break;
 
-        case REAL:
-            printf("(Real)%f", ssa_asreal(expr));
+        case MODE_BINOP_RC:
+            printf("    ");
+            print_ident(p, &(expr->dest));
+            printf(" = add ");
+            emit_type(expr->type);
+            printf(" ");
+            print_ident(p, &(expr->left.var));
+            printf(", ");
+            printf("\n");
             break;
 
-        case IF:
-            printf("if ");
+        case MODE_CONST:
+            printf("    ");
             print_ident(p, &(expr->dest));
-            printf(" then block%lu else block%lu", expr->left.block->id, expr->right.block->id);
+            printf(" = \n");
             break;
 
-        case RETURN:
-            printf("return ");
+        case MODE_VAR:
+            printf("    ");
             print_ident(p, &(expr->dest));
+            printf(" = \n");
             break;
 
         default:
-            if (expr->mode == MODE_VAR)
-            {
-                print_ident(p, &(expr->left.var));
-            }
-            else if (expr->mode == MODE_UNOP)
-            {
-                print_opcode(expr);
-                print_ident(p, &(expr->left.var));
-            }
-            else if (expr->mode == MODE_BINOP)
-            {
-                print_ident(p, &(expr->left.var));
-                print_opcode(expr);
-                print_ident(p, &(expr->right.var));
-            }
-            else
-            {
-                printf("??? M:%d C:%d\n", expr->mode, expr->code);
-            }
+            printf("OP ????\n");
             break;
     }
 }
@@ -282,7 +343,11 @@ void codegen_block(Parser* p, SsaBlock* block)
     printf("{\n");
     for (SsaBlock* curr = sorted; curr; curr = curr->next)
     {
-        printf("L%lu:\n", curr->id);
+        if (curr->phis || curr->head)
+        {
+            printf("L%lu:\n", curr->id);
+        }
+
         /* print the phis */
         for (SsaPhi* phi = curr->phis; phi; phi = phi->next)
         {
@@ -304,10 +369,7 @@ void codegen_block(Parser* p, SsaBlock* block)
         /* print the instructions */
         for (SsaNode* node = curr->head; node; node = node->next)
         {
-            printf("    ");
-            print_dest(p, node);
             print_op(p, node);
-            puts("");
         }
     }
     printf("}\n");
index 511d54985376665058c5ab18fe50241f72115056..f5f6a52f02c5bbbf9388ddcde1c3feebdbc059f3 100644 (file)
@@ -158,12 +158,13 @@ typedef struct SsaBlock {
 } SsaBlock;
 
 enum {
-    MODE_CONST   = 0,
-    MODE_VAR     = 1,
-    MODE_CONTROL = 2,
-    MODE_UNOP    = 3,
-    MODE_BINOP   = 4,
-//    MODE_BINIMM  = 5,
+    MODE_CONST    = 0,
+    MODE_VAR      = 1,
+    MODE_CONTROL  = 2,
+    MODE_UNOP     = 3,
+    MODE_BINOP    = 4,
+    MODE_BINOP_LC = 5,
+    MODE_BINOP_RC = 6,
 };
 
 typedef struct Symbol {
index 8ee12e485e44aa82747215399b0f42dfc3f35ff9..5709ce630be92e80b3f4b23733c72f8750117ddc 100644 (file)
@@ -663,6 +663,10 @@ 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);
     }
 
index ff85c45ca7f5a179231233e1477a9ddbf2e9dfed..93a3d5f49e9e6218ee2bb0cf6d6598184954929d 100644 (file)
@@ -263,14 +263,31 @@ static SsaNode* binop(Parser* p, int op, SsaNode* left, SsaNode* right)
     }
     else
     {
-        left = load(p, left);
-        right = load(p, right);
-        node = ssa_node(op, MODE_BINOP);
-        node->type = left->type;
-        node->left.var = left->dest;
-        node->right.var = right->dest;
+        if (left->mode == MODE_CONST)
+        {
+            right = load(p, right);
+            node = ssa_node(op, MODE_BINOP_LC);
+            node->left = left->left;
+            node->right.var = right->dest;
+        }
+        else if (right->mode == MODE_CONST)
+        {
+            left = load(p, left);
+            node = ssa_node(op, MODE_BINOP_RC);
+            node->left.var = left->dest;
+            node->right = right->left;
+        }
+        else
+        {
+            left = load(p, left);
+            right = load(p, right);
+            node = ssa_node(op, MODE_BINOP);
+            node->left.var = left->dest;
+            node->right.var = right->dest;
+        }
 
-        /* handle comparison operators */
+        /* set the result type appropriately */
+        node->type = left->type;
         switch (op)
         {
             case EQ:
index 61aa3c6d47868be26ccceec2110389077f884784..cd8ab33198cc1f99ecdc8434949a436e0e4ff81a 100644 (file)
@@ -71,18 +71,18 @@ begin
 end
 
 begin
-  i = 42;
-  b = i;
-  b = 1;
-  if c == b then
-    b = b - 1;
-    b = b - 1;
- else
-    b = b + 1;
-    b = b + 1;
- end
- b = 4;
- b = 5;
+#  i = 42;
+#  b = i;
+#  b = 1;
+#  if c == b then
+#    b = b - 1;
+#    b = b - 1;
+# else
+#    b = b + 1;
+#    b = b + 1;
+# end
+# b = 4;
+# b = 5;
 
 #  b = 42;
 #  b = -b;
@@ -106,13 +106,13 @@ begin
 #  a = A;
 #  b = 24;
 #  b = B;
-#
+
 #  # Unary ops
 #  b = +b;
 #  b = -b;
 #
 #  # Arithmetic ops
-#  c = b + 1;
+  c = b + 1;
 #  c = b - 1;
 #  c = b * 1;
 #  c = b / 1;