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)
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;