From 2fa5d80aab0fe7beb645c022de212276958c6625 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 28 Feb 2022 23:08:53 -0500 Subject: [PATCH] added binop scaffolding --- cerise/backend/ssa/codegen.c | 75 +++++++++++++++++++++++++++++++++++- cerise/inc/cerise.h | 2 + cerise/tests/Module.m | 42 ++++++++++---------- 3 files changed, 97 insertions(+), 22 deletions(-) diff --git a/cerise/backend/ssa/codegen.c b/cerise/backend/ssa/codegen.c index 058f56f..b891aef 100644 --- a/cerise/backend/ssa/codegen.c +++ b/cerise/backend/ssa/codegen.c @@ -171,6 +171,78 @@ static void print_ident(Parser* p, SsaVar* var) printf("%c%s.%lu", scope, name, var->symver); } +static void print_const(Type* type, SsaValue* val) +{ + emit_type(type); + if (type->form == FORM_INT) + { + printf(" %d", val->val.i); + } + else if (type->form == FORM_REAL) + { + printf(" %f", val->val.f); + } + else + { + assert(!"not implemented"); + } +} + +char* BinOpNames[NUM_TOKENS] = { + ['+'] = "add", + ['-'] = "sub", + ['*'] = "mul", + ['/'] = "div", + ['%'] = "rem", + +}; + +char* binop_name(SsaNode* node) +{ + char* name = NULL; + if (node->type->form == FORM_INT) + { + switch(node->code) + { + case '+': name = "add"; break; + case '-': name = "sub"; break; + case '*': name = "mul"; break; + case '/': name = "div"; break; + case '%': name = "rem"; break; + + case EQ: name = "icmp eq"; break; + case NEQ: name = "icmp ne"; break; + case LT: name = "icmp slt"; break; + case GT: name = "icmp sgt"; break; + case LTEQ: name = "icmp sle"; break; + case GTEQ: name = "icmp sge"; break; + } + } + else if (node->type->form == FORM_REAL) + { + switch(node->code) + { + case '+': name = "fadd"; break; + case '-': name = "fsub"; break; + case '*': name = "fmul"; break; + case '/': name = "fdiv"; break; + case '%': name = "frem"; 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 + { + assert(!"not implemented"); + } +} + + //static void print_dest(Parser* p, SsaNode* node) //{ // if (node->mode != MODE_CONTROL) @@ -305,11 +377,12 @@ void print_op(Parser* p, SsaNode* expr) case MODE_BINOP_RC: printf(" "); print_ident(p, &(expr->dest)); - printf(" = add "); + printf(" = %s ", BinOpNames[expr->code]); emit_type(expr->type); printf(" "); print_ident(p, &(expr->left.var)); printf(", "); + print_const(expr->type, &(expr->right)); printf("\n"); break; diff --git a/cerise/inc/cerise.h b/cerise/inc/cerise.h index f5f6a52..a3d83c6 100644 --- a/cerise/inc/cerise.h +++ b/cerise/inc/cerise.h @@ -56,6 +56,8 @@ typedef enum { WHILE, COUNT, CALL, + + NUM_TOKENS, ERROR = -2, END_FILE = -1 } TokType; diff --git a/cerise/tests/Module.m b/cerise/tests/Module.m index cd8ab33..f224888 100644 --- a/cerise/tests/Module.m +++ b/cerise/tests/Module.m @@ -55,20 +55,20 @@ var # return z1; #end -procedure Bar*(a : Int) : Int -begin - a = 42; - return a; -end - -procedure Baz*(a : Int) -begin - if (1 > 2) then - 42; - else - 24; - end -end +#procedure Bar*(a : Int) : Int +#begin +# a = 42; +# return a; +#end +# +#procedure Baz*(a : Int) +#begin +# if (1 > 2) then +# 42; +# else +# 24; +# end +#end begin # i = 42; @@ -112,19 +112,19 @@ begin # b = -b; # # # Arithmetic ops - c = b + 1; +# c = b + 1; # c = b - 1; # c = b * 1; # c = b / 1; # c = b % 1; # # # Comparison ops -# c = b == 1; -# c = b != 1; -# c = b < 1; -# c = b > 1; -# c = b <= 1; -# c = b >= 1; + c = b == 1; + c = b != 1; + c = b < 1; + c = b > 1; + c = b <= 1; + c = b >= 1; # # # Register ops # c = 1 + b; -- 2.49.0