]> git.mdlowis.com Git - proto/obnc.git/commitdiff
started properly implementing array indexing. hit some setbacks and need to rework...
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 20 Sep 2022 15:50:44 +0000 (11:50 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 20 Sep 2022 15:50:44 +0000 (11:50 -0400)
cerise/backend/ssa/codegen.c
cerise/src/bitset.c
cerise/src/ssa.c
cerise/tests/Module.m

index 031561f0ea0fce49fbf6e6f03f548350ca899565..508f5316afe5ed4c9d8c99fa65b71f0fad2a4f1b 100644 (file)
@@ -215,6 +215,8 @@ char* binop_name(SsaNode* node)
             case '>':  name = "icmp sgt"; break;
             case LTEQ: name = "icmp sle"; break;
             case GTEQ: name = "icmp sge"; break;
+
+            default:   assert(!"unknown"); break;
         }
     }
     else if (node->arg_type->form == FORM_REAL)
@@ -233,6 +235,8 @@ char* binop_name(SsaNode* node)
             case '>':  name = "fcmp ogt"; break;
             case LTEQ: name = "fcmp ole"; break;
             case GTEQ: name = "fcmp oge"; break;
+
+            default:   assert(!"unknown"); break;
         }
     }
     else
@@ -252,8 +256,15 @@ void print_operand(Parser* p, SsaNode* expr, int is_const, SsaValue* value)
     }
     else
     {
+        Symbol* s = symbol_getbyid(p, value->var.symid);
+        if (s->type && s->type->form == FORM_ARRAY)
+        {
+            printf("*");
+        }
+
         printf(" ");
         print_ident(p, &(value->var));
+
     }
 }
 
@@ -285,6 +296,24 @@ void print_op(Parser* p, SsaNode* expr)
                 print_ident(p, &(expr->dest));
                 puts("");
             }
+            else if (expr->code == '[')
+            {
+                printf("    ");
+                print_ident(p, &(expr->dest));
+                printf(" = getelementptr ");
+                emit_type(expr->arg_type);
+                printf(", ");
+                emit_type(expr->arg_type);
+                printf("* ");
+                print_ident(p, &(expr->left.var));
+                printf(", ");
+                emit_type(expr->arg_type->base);
+                printf(" 0, ");
+                emit_type(expr->arg_type->base);
+                printf(" ");
+                print_operand(p, expr, expr->rconst, &(expr->right));
+                puts("");
+            }
             else
             {
                 assert(!"not implemented");
index 0303a6b33377031382a9e9b637cbd89c5f2bc5a8..ad1dca538e18245f66aabcd1582b3f3fd198e288 100644 (file)
@@ -21,7 +21,7 @@ void bitset_add(Bitset* set, size_t val)
     {
         size_t cell_index = (val / CELL_BITS);
         size_t bit_index  = val - (cell_index * CELL_BITS);
-        set->bits[cell_index] |= (1 << bit_index);
+        set->bits[cell_index] |= ((size_t)1 << bit_index);
     }
     else
     {
@@ -36,7 +36,7 @@ bool bitset_has(Bitset* set, size_t val)
     {
         size_t cell_index = (val / CELL_BITS);
         size_t bit_index  = val - (cell_index * CELL_BITS);
-        ret = ((set->bits[cell_index] & (1 << bit_index)) != 0);
+        ret = ((set->bits[cell_index] & ((size_t)1 << bit_index)) != 0);
     }
     return ret;
 }
index c2d4434577687aad4ebbe998085f510aef717030..87b68f4543a9acc085cf691216142ae1bc4a57fb 100644 (file)
@@ -220,10 +220,24 @@ SsaNode* ssa_fieldref(Parser* p, SsaNode* record, char* fname)
 
 SsaNode* ssa_index(Parser* p, SsaNode* array, SsaNode* index)
 {
-    load(p, array);
+//    load(p, array);
     load(p, index);
-    assert(!"array indexing unimplemented");
-    return NULL;
+    SsaNode* node = ssa_node('[', MODE_MEMORY);
+    node->ret_type = array->ret_type->base;
+    node->arg_type = array->ret_type;
+    node->left = array->left;
+
+//    if (index->mode == MODE_CONST)
+//    {
+//        node->rconst = 1;
+//        node->right = index->left;
+//    }
+//    else
+    {
+        node->right.var = index->dest;
+    }
+
+    return node;
 }
 
 SsaBlock* ssa_block(Parser* p)
@@ -511,15 +525,13 @@ static SsaNode* const_unop(int op, SsaNode* a)
 
 static SsaNode* load(Parser* p, SsaNode* node)
 {
-//    if (!node->loaded && (node->mode != MODE_CONST) && (node->mode != MODE_VAR))
-//    if (node->mode == MODE_VAR && node->dest.symid != 0)
-//    {
-//        Symbol* sym = symbol_getbyid(p, node->dest.symid);
-//        printf("load %s\n", sym->name);
-//    }
-//    else
     if (!node->loaded && (node->mode != MODE_CONST))
     {
+//        if (node->mode == MODE_MEMORY && node->code == '[')
+//        {
+////            puts ("array!");
+//        }
+//        else
         if (node->mode == MODE_VAR)
         {
             node->left.var = node->dest;
@@ -537,9 +549,5 @@ static SsaNode* load(Parser* p, SsaNode* node)
         ssa_block_add(p->curr_block, node);
         node->loaded = 1;
     }
-    else
-    {
-//        assert(!"die");
-    }
     return node;
 }
index 7a2a731572b3dd287c1719e624cd5dd5709b1418..3f9054d8e37ff8a5e7ab3c85f67d3aca844e58fc 100644 (file)
@@ -4,154 +4,155 @@ var
   vBool* : Bool
   vInt* : Int
   vReal : Real
+  vIntArray : array 42 of Int
 
-procedure TestReturnVoid()
-begin
-end
-
-procedure TestReturnIntLiteral() : Int
-begin
-    return 0;
-end
-
-procedure TestReturnRealLiteral() : Real
-begin
-    return 0.0;
-end
-
-procedure TestReturnBoolLiteral() : Bool
-begin
-    return false;
-end
-
-procedure TestStoreLiterals()
-begin
-    vBool = true;
-    vInt = 42;
-    vReal = 42.0;
-end
-
-procedure TestIntArithOps()
-begin
-    vInt = vInt + 1;
-    vInt = 1 + vInt;
-    vInt = vInt + vInt;
-
-    vInt = vInt - 1;
-    vInt = 1 - vInt;
-    vInt = vInt - vInt;
-
-    vInt = vInt * 1;
-    vInt = 1 * vInt;
-    vInt = vInt * vInt;
-
-    vInt = vInt / 1;
-    vInt = 1 / vInt;
-    vInt = vInt / vInt;
-
-    vInt = vInt % 1;
-    vInt = 1 % vInt;
-    vInt = vInt % vInt;
-end
-
-procedure TestIntCompOps()
-begin
-    vBool = vInt == 1;
-    vBool = 1 == vInt;
-    vBool = vInt == vInt;
-
-    vBool = vInt != 1;
-    vBool = 1 != vInt;
-    vBool = vInt != vInt;
-
-    vBool = vInt < 1;
-    vBool = 1 < vInt;
-    vBool = vInt < vInt;
-
-    vBool = vInt > 1;
-    vBool = 1 > vInt;
-    vBool = vInt > vInt;
-
-    vBool = vInt <= 1;
-    vBool = 1 <= vInt;
-    vBool = vInt <= vInt;
-
-    vBool = vInt >= 1;
-    vBool = 1 >= vInt;
-    vBool = vInt >= vInt;
-end
-
-procedure TestRealArithOps()
-begin
-    vReal = vReal + 1.0;
-    vReal = 1.0 + vReal;
-    vReal = vReal + vReal;
-
-    vReal = vReal - 1.0;
-    vReal = 1.0 - vReal;
-    vReal = vReal - vReal;
-
-    vReal = vReal * 1.0;
-    vReal = 1.0 * vReal;
-    vReal = vReal * vReal;
-
-    vReal = vReal / 1.0;
-    vReal = 1.0 / vReal;
-    vReal = vReal / vReal;
-
-    vReal = vReal % 1.0;
-    vReal = 1.0 % vReal;
-    vReal = vReal % vReal;
-end
-
-procedure TestRealCompOps()
-begin
-    vBool = vReal == 1.0;
-    vBool = 1.0 == vReal;
-    vBool = vReal == vReal;
-
-    vBool = vReal != 1.0;
-    vBool = 1.0 != vReal;
-    vBool = vReal != vReal;
-
-    vBool = vReal < 1.0;
-    vBool = 1.0 < vReal;
-    vBool = vReal < vReal;
-
-    vBool = vReal > 1.0;
-    vBool = 1.0 > vReal;
-    vBool = vReal > vReal;
-
-    vBool = vReal <= 1.0;
-    vBool = 1.0 <= vReal;
-    vBool = vReal <= vReal;
-
-    vBool = vReal >= 1.0;
-    vBool = 1.0 >= vReal;
-    vBool = vReal >= vReal;
-end
-
-procedure TestIfStatements()
-begin
-  if vInt == 1 then
-    vInt = 42;
-  end
-
-  if vInt == 1 then
-    vInt = 42;
-  else
-    vInt = 24;
-  end
-end
+#procedure TestReturnVoid()
+#begin
+#end
+#
+#procedure TestReturnIntLiteral() : Int
+#begin
+#    return 0;
+#end
+#
+#procedure TestReturnRealLiteral() : Real
+#begin
+#    return 0.0;
+#end
+#
+#procedure TestReturnBoolLiteral() : Bool
+#begin
+#    return false;
+#end
+#
+#procedure TestStoreLiterals()
+#begin
+#    vBool = true;
+#    vInt = 42;
+#    vReal = 42.0;
+#end
+#
+#procedure TestIntArithOps()
+#begin
+#    vInt = vInt + 1;
+#    vInt = 1 + vInt;
+#    vInt = vInt + vInt;
+#
+#    vInt = vInt - 1;
+#    vInt = 1 - vInt;
+#    vInt = vInt - vInt;
+#
+#    vInt = vInt * 1;
+#    vInt = 1 * vInt;
+#    vInt = vInt * vInt;
+#
+#    vInt = vInt / 1;
+#    vInt = 1 / vInt;
+#    vInt = vInt / vInt;
+#
+#    vInt = vInt % 1;
+#    vInt = 1 % vInt;
+#    vInt = vInt % vInt;
+#end
+#
+#procedure TestIntCompOps()
+#begin
+#    vBool = vInt == 1;
+#    vBool = 1 == vInt;
+#    vBool = vInt == vInt;
+#
+#    vBool = vInt != 1;
+#    vBool = 1 != vInt;
+#    vBool = vInt != vInt;
+#
+#    vBool = vInt < 1;
+#    vBool = 1 < vInt;
+#    vBool = vInt < vInt;
+#
+#    vBool = vInt > 1;
+#    vBool = 1 > vInt;
+#    vBool = vInt > vInt;
+#
+#    vBool = vInt <= 1;
+#    vBool = 1 <= vInt;
+#    vBool = vInt <= vInt;
+#
+#    vBool = vInt >= 1;
+#    vBool = 1 >= vInt;
+#    vBool = vInt >= vInt;
+#end
+#
+#procedure TestRealArithOps()
+#begin
+#    vReal = vReal + 1.0;
+#    vReal = 1.0 + vReal;
+#    vReal = vReal + vReal;
+#
+#    vReal = vReal - 1.0;
+#    vReal = 1.0 - vReal;
+#    vReal = vReal - vReal;
+#
+#    vReal = vReal * 1.0;
+#    vReal = 1.0 * vReal;
+#    vReal = vReal * vReal;
+#
+#    vReal = vReal / 1.0;
+#    vReal = 1.0 / vReal;
+#    vReal = vReal / vReal;
+#
+#    vReal = vReal % 1.0;
+#    vReal = 1.0 % vReal;
+#    vReal = vReal % vReal;
+#end
+#
+#procedure TestRealCompOps()
+#begin
+#    vBool = vReal == 1.0;
+#    vBool = 1.0 == vReal;
+#    vBool = vReal == vReal;
+#
+#    vBool = vReal != 1.0;
+#    vBool = 1.0 != vReal;
+#    vBool = vReal != vReal;
+#
+#    vBool = vReal < 1.0;
+#    vBool = 1.0 < vReal;
+#    vBool = vReal < vReal;
+#
+#    vBool = vReal > 1.0;
+#    vBool = 1.0 > vReal;
+#    vBool = vReal > vReal;
+#
+#    vBool = vReal <= 1.0;
+#    vBool = 1.0 <= vReal;
+#    vBool = vReal <= vReal;
+#
+#    vBool = vReal >= 1.0;
+#    vBool = 1.0 >= vReal;
+#    vBool = vReal >= vReal;
+#end
+#
+#procedure TestIfStatements()
+#begin
+#  if vInt == 1 then
+#    vInt = 42;
+#  end
+#
+#  if vInt == 1 then
+#    vInt = 42;
+#  else
+#    vInt = 24;
+#  end
+#end
 
 procedure TestArrayAccess()
 begin
     vIntArray[0] = vIntArray[1] + vIntArray[2];
 end
 
-procedure TestRecordAccess()
-begin
-end
+#procedure TestRecordAccess()
+#begin
+#end
 
 
 #import