From f0adafb23ea83cdd93e897f12255dcb1deca5705 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 8 Mar 2022 14:24:44 -0500 Subject: [PATCH] fixed up code generation for comparison operators (integer only right now) --- cerise/backend/ssa/codegen.c | 51 ++++++++++++++---------------------- cerise/src/grammar.c | 15 ++++++++--- cerise/tests/Module.m | 10 +++---- 3 files changed, 36 insertions(+), 40 deletions(-) diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index da2486d..539942c 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -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(", "); diff --git a/cerise/src/grammar.c b/cerise/src/grammar.c index 34998a3..46d520a 100644 --- a/cerise/src/grammar.c +++ b/cerise/src/grammar.c @@ -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)) diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index 46e2024..67a6d14 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -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; -- 2.49.0