From a7f2b8d981282d375164004ce75c263909efe7d2 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 20 Sep 2022 11:50:44 -0400 Subject: [PATCH] started properly implementing array indexing. hit some setbacks and need to rework the ssa data structures --- cerise/backend/ssa/codegen.c | 29 ++++ cerise/src/bitset.c | 4 +- cerise/src/ssa.c | 36 +++-- cerise/tests/Module.m | 283 ++++++++++++++++++----------------- 4 files changed, 195 insertions(+), 157 deletions(-) diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index 031561f..508f531 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -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"); diff --git a/cerise/src/bitset.c b/cerise/src/bitset.c index 0303a6b..ad1dca5 100644 --- a/cerise/src/bitset.c +++ b/cerise/src/bitset.c @@ -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; } diff --git a/cerise/src/ssa.c b/cerise/src/ssa.c index c2d4434..87b68f4 100644 --- a/cerise/src/ssa.c +++ b/cerise/src/ssa.c @@ -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; } diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index 7a2a731..3f9054d 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -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 -- 2.49.0