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)
{
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)
{
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
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(", ");
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(", ");
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(", ");
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);
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))