return name;
}
+void print_operand(Parser* p, SsaNode* expr, int is_const, SsaValue* value)
+{
+ if (is_const)
+ {
+ print_const(expr->arg_type, value);
+ }
+ else
+ {
+ printf(" ");
+ print_ident(p, &(value->var));
+ }
+}
+
void print_op(Parser* p, SsaNode* expr)
{
switch(expr->mode)
{
printf(" store ");
emit_type(expr->arg_type);
- printf(" ");
- print_ident(p, &(expr->left.var));
+ print_operand(p, expr, expr->lconst, &(expr->left));
printf(", ");
emit_type(expr->ret_type);
printf("* ");
printf(" = %s ", binop_name(expr));
emit_type(expr->arg_type);
printf(" ");
- print_ident(p, &(expr->left.var));
- printf(", ");
- print_ident(p, &(expr->right.var));
- printf("\n");
- break;
-
- case MODE_BINOP_LC:
- printf(" ");
- print_ident(p, &(expr->dest));
- printf(" = %s ", binop_name(expr));
- emit_type(expr->arg_type);
- printf(" ");
- print_const(expr->arg_type, &(expr->left));
- printf(", ");
- print_ident(p, &(expr->right.var));
- printf("\n");
- break;
-
- case MODE_BINOP_RC:
- printf(" ");
- print_ident(p, &(expr->dest));
- printf(" = %s ", binop_name(expr));
- emit_type(expr->arg_type);
- printf(" ");
- print_ident(p, &(expr->left.var));
+ print_operand(p, expr, expr->lconst, &(expr->left));
printf(", ");
- print_const(expr->arg_type, &(expr->right));
+ print_operand(p, expr, expr->rconst, &(expr->right));
printf("\n");
break;
case MODE_VAR:
case MODE_CONST:
default:
- printf("OP ????\n");
assert(!"not implemented");
break;
}
node->ret_type = dest->ret_type;
node->arg_type = dest->ret_type;
node->dest = dest->left.var;
- node->left.var = value->dest;
+
+ if (value->mode == MODE_CONST)
+ {
+ node->lconst = 1;
+ node->left = value->left;
+ }
+ else
+ {
+ node->left.var = value->dest;
+ }
+
node->dest.symver = phi_add(p, node->dest);
ssa_block_add(p->curr_block, node);
node->loaded = 1;
{
left = load(p, left);
right = load(p, right);
+ node = ssa_node(op, MODE_BINOP);
if (left->mode == MODE_CONST)
{
- node = ssa_node(op, MODE_BINOP_LC);
+ node->lconst = 1;
node->left = left->left;
node->right.var = right->dest;
}
else if (right->mode == MODE_CONST)
{
- node = ssa_node(op, MODE_BINOP_RC);
+ node->rconst = 1;
node->left.var = left->dest;
node->right = right->left;
}
else
{
- node = ssa_node(op, MODE_BINOP);
node->left.var = left->dest;
node->right.var = right->dest;
}