{
node = ssa_node(IDENT, MODE_VAR);
node->type = sym->type;
+ node->loaded = 1;
+ node->dest.symid = index;
+ node->dest.symver = sym->version;
node->left.var.symid = index;
node->left.var.symver = sym->version;
}
SsaNode* ssa_store(Parser* p, SsaNode* dest, SsaNode* value)
{
- assert("!stores are not implemented");
load(p, value);
- load(p, dest);
+// load(p, dest);
SsaNode* node = ssa_node('=', MODE_VAR);
node->type = dest->type;
node->dest = dest->left.var;
+ node->left.var = value->dest;
+
+ Symbol* sym = symbol_getbyid(p, node->dest.symid);
+ sym->version++;
+ node->dest.symver = sym->version;
+
ssa_block_add(p->curr_block, node);
node->loaded = 1;
return node;
SsaNode* ssa_fieldref(Parser* p, SsaNode* record, char* fname)
{
(void)p, (void)record, (void)fname;
- assert("!record field references unimplemented");
+ assert(!"record field references unimplemented");
return NULL;
}
void ssa_call_add(SsaBlock* call, SsaNode* arg);
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
static SsaNode* binop(Parser* p, int op, SsaNode* left, SsaNode* right)
{
SsaNode* node = NULL;
// if (!node->loaded && (node->mode != MODE_CONST) && (node->mode != MODE_VAR))
if (!node->loaded)
{
-// if (node->dest.symid == 0)
-// {
-// node->dest.symver++;
-// }
+ if (node->dest.symid == 0)
+ {
+ Symbol* sym = symbol_getbyid(p, 0);
+ sym->version++;
+ node->dest.symver = sym->version;
+ }
ssa_block_add(p->curr_block, node);
node->loaded = 1;
}
return node;
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-//static void print_indent(int indent, char* str)
-//{
-// /* print the indent */
-// for (int i = 0; i < indent; i++)
-// {
-// printf(" ");
-// }
-// if (str)
-// {
-// printf("%s", str);
-// }
-//}
-//
-//static void print_opcode(SsaNode* node)
-//{
-// int op = node->code;
-// if (op < 256)
-// {
-// printf(" %c ", op);
-// }
-// else if (op == RETURN)
-// {
-// printf(" return ");
-// }
-// else if (op == IF)
-// {
-// printf("if ");
-// }
-// else
-// {
-// printf("(%d\n", op);
-// }
-//}
-//
-//static void print(Parser* p, AstNode* node, int indent)
-//{
-// assert(node);
-// print_indent(indent, NULL);
-//
-// /* now print the data */
-// switch(node->hdr.code)
-// {
-// case BOOL:
-// printf("B:%lld", ((AstValue*)node)->val.i);
-// break;
-//
-// case INT:
-// printf("I:%lld", ((AstValue*)node)->val.i);
-// break;
-//
-// case REAL:
-// printf("R:%f", ((AstValue*)node)->val.f);
-// break;
-//
-// case IDENT:
-// {
-// Symbol* s = symbol_getbyid(p, ((AstValue*)node)->val.i);
-// printf("%s.%lld", s->name, ((AstValue*)node)->tag);
-// }
-// break;
-//
-// case '.':
-// printf("(field-ref\n");
-// print(p, node->links[0], indent+1);
-// print(p, node->links[1], indent+1);
-// print_indent(indent, ")");
-// break;
-//
-// case '[':
-// printf("(array-index\n");
-// print(p, node->links[0], indent+1);
-// print(p, node->links[1], indent+1);
-// print_indent(indent, ")");
-// break;
-//
-// case BEGIN:
-// printf("(begin\n");
-// for (AstNode* curr = node->links[0]; curr; curr = curr->hdr.next)
-// {
-// print(p, curr, indent+1);
-// }
-// print_indent(indent, ")");
-// break;
-//
-// case CALL:
-// printf("(call\n");
-// print(p, node->links[0], indent+1);
-// for (AstNode* curr = node->links[1]; curr; curr = curr->hdr.next)
-// {
-// print(p, curr, indent+1);
-// }
-// print_indent(indent, ")");
-// break;
-//
-// case IF:
-// printf("(if\n");
-// print(p, node->links[0], indent+1);
-// print(p, node->links[1], indent+1);
-// if (node->links[2])
-// {
-// print(p, node->links[2], indent+1);
-// }
-// print_indent(indent, ")");
-// break;
-//
-// default:
-// if (node->links[1])
-// {
-// print_opcode(node);
-// print(p, node->links[0], indent+1);
-// print(p, node->links[1], indent+1);
-// print_indent(indent, ")");
-// }
-// else
-// {
-// print_opcode(node);
-// print(p, node->links[0], indent+1);
-// print_indent(indent, ")");
-// }
-// break;
-// }
-// puts("");
-//}
-//
-//void ast_print(Parser* p, AstNode* node)
-//{
-// print(p, node, 0);
-//}
-
-
static void print_ident(Parser* p, SsaVar* var)
{
Symbol* s = symbol_getbyid(p, var->symid);
printf(" = ");
}
+static void print_opcode(SsaNode* node)
+{
+ int op = node->code;
+ if (op < 256)
+ {
+ printf(" %c ", op);
+ }
+ else if (op == RETURN)
+ {
+ printf(" return ");
+ }
+ else if (op == IF)
+ {
+ printf("if ");
+ }
+ else if (op == EQ)
+ {
+ printf("==");
+ }
+ else if (op == NEQ)
+ {
+ printf("!=");
+ }
+ else if (op == LTEQ)
+ {
+ printf("<=");
+ }
+ else if (op == GTEQ)
+ {
+ printf(">=");
+ }
+ else
+ {
+ printf("%d\n", op);
+ }
+}
+
void ssa_print(Parser* p, SsaNode* expr)
{
(void)p;
}
else if (expr->mode == MODE_UNOP)
{
- printf("unary op");
+ print_opcode(expr);
+ print_ident(p, &(expr->left.var));
}
else if (expr->mode == MODE_BINOP)
{
- printf("binary op");
+ print_ident(p, &(expr->left.var));
+ print_opcode(expr);
+ print_ident(p, &(expr->right.var));
}
else
{