case '>': name = "icmp sgt"; break;
case LTEQ: name = "icmp sle"; break;
case GTEQ: name = "icmp sge"; break;
+
+ default: assert(!"unknown"); break;
}
}
else if (node->arg_type->form == FORM_REAL)
case '>': name = "fcmp ogt"; break;
case LTEQ: name = "fcmp ole"; break;
case GTEQ: name = "fcmp oge"; break;
+
+ default: assert(!"unknown"); break;
}
}
else
}
else
{
+ Symbol* s = symbol_getbyid(p, value->var.symid);
+ if (s->type && s->type->form == FORM_ARRAY)
+ {
+ printf("*");
+ }
+
printf(" ");
print_ident(p, &(value->var));
+
}
}
print_ident(p, &(expr->dest));
puts("");
}
+ else if (expr->code == '[')
+ {
+ printf(" ");
+ print_ident(p, &(expr->dest));
+ printf(" = getelementptr ");
+ emit_type(expr->arg_type);
+ printf(", ");
+ emit_type(expr->arg_type);
+ printf("* ");
+ print_ident(p, &(expr->left.var));
+ printf(", ");
+ emit_type(expr->arg_type->base);
+ printf(" 0, ");
+ emit_type(expr->arg_type->base);
+ printf(" ");
+ print_operand(p, expr, expr->rconst, &(expr->right));
+ puts("");
+ }
else
{
assert(!"not implemented");
{
size_t cell_index = (val / CELL_BITS);
size_t bit_index = val - (cell_index * CELL_BITS);
- set->bits[cell_index] |= (1 << bit_index);
+ set->bits[cell_index] |= ((size_t)1 << bit_index);
}
else
{
{
size_t cell_index = (val / CELL_BITS);
size_t bit_index = val - (cell_index * CELL_BITS);
- ret = ((set->bits[cell_index] & (1 << bit_index)) != 0);
+ ret = ((set->bits[cell_index] & ((size_t)1 << bit_index)) != 0);
}
return ret;
}
SsaNode* ssa_index(Parser* p, SsaNode* array, SsaNode* index)
{
- load(p, array);
+// load(p, array);
load(p, index);
- assert(!"array indexing unimplemented");
- return NULL;
+ SsaNode* node = ssa_node('[', MODE_MEMORY);
+ node->ret_type = array->ret_type->base;
+ node->arg_type = array->ret_type;
+ node->left = array->left;
+
+// if (index->mode == MODE_CONST)
+// {
+// node->rconst = 1;
+// node->right = index->left;
+// }
+// else
+ {
+ node->right.var = index->dest;
+ }
+
+ return node;
}
SsaBlock* ssa_block(Parser* p)
static SsaNode* load(Parser* p, SsaNode* node)
{
-// if (!node->loaded && (node->mode != MODE_CONST) && (node->mode != MODE_VAR))
-// if (node->mode == MODE_VAR && node->dest.symid != 0)
-// {
-// Symbol* sym = symbol_getbyid(p, node->dest.symid);
-// printf("load %s\n", sym->name);
-// }
-// else
if (!node->loaded && (node->mode != MODE_CONST))
{
+// if (node->mode == MODE_MEMORY && node->code == '[')
+// {
+//// puts ("array!");
+// }
+// else
if (node->mode == MODE_VAR)
{
node->left.var = node->dest;
ssa_block_add(p->curr_block, node);
node->loaded = 1;
}
- else
- {
-// assert(!"die");
- }
return node;
}
vBool* : Bool
vInt* : Int
vReal : Real
+ vIntArray : array 42 of Int
-procedure TestReturnVoid()
-begin
-end
-
-procedure TestReturnIntLiteral() : Int
-begin
- return 0;
-end
-
-procedure TestReturnRealLiteral() : Real
-begin
- return 0.0;
-end
-
-procedure TestReturnBoolLiteral() : Bool
-begin
- return false;
-end
-
-procedure TestStoreLiterals()
-begin
- vBool = true;
- vInt = 42;
- vReal = 42.0;
-end
-
-procedure TestIntArithOps()
-begin
- vInt = vInt + 1;
- vInt = 1 + vInt;
- vInt = vInt + vInt;
-
- vInt = vInt - 1;
- vInt = 1 - vInt;
- vInt = vInt - vInt;
-
- vInt = vInt * 1;
- vInt = 1 * vInt;
- vInt = vInt * vInt;
-
- vInt = vInt / 1;
- vInt = 1 / vInt;
- vInt = vInt / vInt;
-
- vInt = vInt % 1;
- vInt = 1 % vInt;
- vInt = vInt % vInt;
-end
-
-procedure TestIntCompOps()
-begin
- vBool = vInt == 1;
- vBool = 1 == vInt;
- vBool = vInt == vInt;
-
- vBool = vInt != 1;
- vBool = 1 != vInt;
- vBool = vInt != vInt;
-
- vBool = vInt < 1;
- vBool = 1 < vInt;
- vBool = vInt < vInt;
-
- vBool = vInt > 1;
- vBool = 1 > vInt;
- vBool = vInt > vInt;
-
- vBool = vInt <= 1;
- vBool = 1 <= vInt;
- vBool = vInt <= vInt;
-
- vBool = vInt >= 1;
- vBool = 1 >= vInt;
- vBool = vInt >= vInt;
-end
-
-procedure TestRealArithOps()
-begin
- vReal = vReal + 1.0;
- vReal = 1.0 + vReal;
- vReal = vReal + vReal;
-
- vReal = vReal - 1.0;
- vReal = 1.0 - vReal;
- vReal = vReal - vReal;
-
- vReal = vReal * 1.0;
- vReal = 1.0 * vReal;
- vReal = vReal * vReal;
-
- vReal = vReal / 1.0;
- vReal = 1.0 / vReal;
- vReal = vReal / vReal;
-
- vReal = vReal % 1.0;
- vReal = 1.0 % vReal;
- vReal = vReal % vReal;
-end
-
-procedure TestRealCompOps()
-begin
- vBool = vReal == 1.0;
- vBool = 1.0 == vReal;
- vBool = vReal == vReal;
-
- vBool = vReal != 1.0;
- vBool = 1.0 != vReal;
- vBool = vReal != vReal;
-
- vBool = vReal < 1.0;
- vBool = 1.0 < vReal;
- vBool = vReal < vReal;
-
- vBool = vReal > 1.0;
- vBool = 1.0 > vReal;
- vBool = vReal > vReal;
-
- vBool = vReal <= 1.0;
- vBool = 1.0 <= vReal;
- vBool = vReal <= vReal;
-
- vBool = vReal >= 1.0;
- vBool = 1.0 >= vReal;
- vBool = vReal >= vReal;
-end
-
-procedure TestIfStatements()
-begin
- if vInt == 1 then
- vInt = 42;
- end
-
- if vInt == 1 then
- vInt = 42;
- else
- vInt = 24;
- end
-end
+#procedure TestReturnVoid()
+#begin
+#end
+#
+#procedure TestReturnIntLiteral() : Int
+#begin
+# return 0;
+#end
+#
+#procedure TestReturnRealLiteral() : Real
+#begin
+# return 0.0;
+#end
+#
+#procedure TestReturnBoolLiteral() : Bool
+#begin
+# return false;
+#end
+#
+#procedure TestStoreLiterals()
+#begin
+# vBool = true;
+# vInt = 42;
+# vReal = 42.0;
+#end
+#
+#procedure TestIntArithOps()
+#begin
+# vInt = vInt + 1;
+# vInt = 1 + vInt;
+# vInt = vInt + vInt;
+#
+# vInt = vInt - 1;
+# vInt = 1 - vInt;
+# vInt = vInt - vInt;
+#
+# vInt = vInt * 1;
+# vInt = 1 * vInt;
+# vInt = vInt * vInt;
+#
+# vInt = vInt / 1;
+# vInt = 1 / vInt;
+# vInt = vInt / vInt;
+#
+# vInt = vInt % 1;
+# vInt = 1 % vInt;
+# vInt = vInt % vInt;
+#end
+#
+#procedure TestIntCompOps()
+#begin
+# vBool = vInt == 1;
+# vBool = 1 == vInt;
+# vBool = vInt == vInt;
+#
+# vBool = vInt != 1;
+# vBool = 1 != vInt;
+# vBool = vInt != vInt;
+#
+# vBool = vInt < 1;
+# vBool = 1 < vInt;
+# vBool = vInt < vInt;
+#
+# vBool = vInt > 1;
+# vBool = 1 > vInt;
+# vBool = vInt > vInt;
+#
+# vBool = vInt <= 1;
+# vBool = 1 <= vInt;
+# vBool = vInt <= vInt;
+#
+# vBool = vInt >= 1;
+# vBool = 1 >= vInt;
+# vBool = vInt >= vInt;
+#end
+#
+#procedure TestRealArithOps()
+#begin
+# vReal = vReal + 1.0;
+# vReal = 1.0 + vReal;
+# vReal = vReal + vReal;
+#
+# vReal = vReal - 1.0;
+# vReal = 1.0 - vReal;
+# vReal = vReal - vReal;
+#
+# vReal = vReal * 1.0;
+# vReal = 1.0 * vReal;
+# vReal = vReal * vReal;
+#
+# vReal = vReal / 1.0;
+# vReal = 1.0 / vReal;
+# vReal = vReal / vReal;
+#
+# vReal = vReal % 1.0;
+# vReal = 1.0 % vReal;
+# vReal = vReal % vReal;
+#end
+#
+#procedure TestRealCompOps()
+#begin
+# vBool = vReal == 1.0;
+# vBool = 1.0 == vReal;
+# vBool = vReal == vReal;
+#
+# vBool = vReal != 1.0;
+# vBool = 1.0 != vReal;
+# vBool = vReal != vReal;
+#
+# vBool = vReal < 1.0;
+# vBool = 1.0 < vReal;
+# vBool = vReal < vReal;
+#
+# vBool = vReal > 1.0;
+# vBool = 1.0 > vReal;
+# vBool = vReal > vReal;
+#
+# vBool = vReal <= 1.0;
+# vBool = 1.0 <= vReal;
+# vBool = vReal <= vReal;
+#
+# vBool = vReal >= 1.0;
+# vBool = 1.0 >= vReal;
+# vBool = vReal >= vReal;
+#end
+#
+#procedure TestIfStatements()
+#begin
+# if vInt == 1 then
+# vInt = 42;
+# end
+#
+# if vInt == 1 then
+# vInt = 42;
+# else
+# vInt = 24;
+# end
+#end
procedure TestArrayAccess()
begin
vIntArray[0] = vIntArray[1] + vIntArray[2];
end
-procedure TestRecordAccess()
-begin
-end
+#procedure TestRecordAccess()
+#begin
+#end
#import