void ppIRTemp ( IRTemp tmp )
{
- vex_printf( "t%d", tmp);
+ if (tmp == INVALID_IRTEMP)
+ vex_printf("INVALID_IRTEMP");
+ else
+ vex_printf( "t%d", tmp);
}
{
switch (e->tag) {
case Iex_Get:
- vex_printf( "GET(%d,%d)", e->Iex.Get.offset, e->Iex.Get.size);
+ vex_printf( "GET(%d,", e->Iex.Get.offset);
+ ppIRType(e->Iex.Get.ty);
+ vex_printf(")");
break;
case Iex_Tmp:
ppIRTemp(e->Iex.Tmp.tmp);
{
switch (s->tag) {
case Ist_Put:
- vex_printf( "PUT(%d,%d) = ", s->Ist.Put.offset, s->Ist.Put.size);
+ vex_printf( "PUT(%d) = ", s->Ist.Put.offset);
ppIRExpr(s->Ist.Put.expr);
break;
case Ist_Tmp:
/* Constructors -- IRExpr */
-IRExpr* IRExpr_Get ( Int off, Int sz ) {
+IRExpr* IRExpr_Get ( Int off, IRType ty ) {
IRExpr* e = LibVEX_Alloc(sizeof(IRExpr));
e->tag = Iex_Get;
e->Iex.Get.offset = off;
- e->Iex.Get.size = sz;
+ e->Iex.Get.ty = ty;
return e;
}
IRExpr* IRExpr_Tmp ( IRTemp tmp ) {
/* Constructors -- IRStmt */
-IRStmt* IRStmt_Put ( Int off, Int sz, IRExpr* value ) {
+IRStmt* IRStmt_Put ( Int off, IRExpr* value ) {
IRStmt* s = LibVEX_Alloc(sizeof(IRStmt));
s->tag = Ist_Put;
s->link = NULL;
s->Ist.Put.offset = off;
- s->Ist.Put.size = sz;
s->Ist.Put.expr = value;
return s;
}
IRType typeOfIRExpr ( IRTypeEnv* tyenv, IRExpr* e )
{
switch (e->tag) {
+ case Iex_Get:
+ return e->Iex.Get.ty;
case Iex_Tmp:
return lookupIRTypeEnv(tyenv, e->Iex.Tmp.tmp);
case Iex_Const:
IRBB* irbb;
HInstrArray* vcode;
HInstrArray* rcode;
+ Int i;
vassert(vex_initdone);
LibVEX_Clear(False);
/* Turn it into virtual-registerised code. */
vcode = iselBB ( irbb );
+ vex_printf("\n-------- Virtual registerised code --------\n");
+ for (i = 0; i < vcode->arr_used; i++) {
+ ppInstr(vcode->arr[i]);
+ vex_printf("\n");
+ }
+ vex_printf("\n");
+
/* Register allocate. */
rcode = doRegisterAllocation ( vcode, available_real_regs,
n_available_real_regs,
genSpill, genReload,
ppInstr, ppReg );
+ vex_printf("\n-------- Post-regalloc code --------\n");
+ for (i = 0; i < rcode->arr_used; i++) {
+ ppInstr(rcode->arr[i]);
+ vex_printf("\n");
+ }
+ vex_printf("\n");
+
/* Assemble, etc. */
LibVEX_Clear(True);
/* ------------------ Temporaries ------------------ */
-typedef Int IRTemp;
+typedef UInt IRTemp;
extern void ppIRTemp ( IRTemp );
+#define INVALID_IRTEMP ((IRTemp)0xFFFFFFFF)
+
/* ------------------ Binary and unary ops ------------------ */
IRExprTag tag;
union {
struct {
- Int offset;
- Int size;
+ Int offset;
+ IRType ty;
} Get;
struct {
IRTemp tmp;
}
IRExpr;
-extern IRExpr* IRExpr_Get ( Int off, Int sz );
+extern IRExpr* IRExpr_Get ( Int off, IRType ty );
extern IRExpr* IRExpr_Tmp ( IRTemp tmp );
extern IRExpr* IRExpr_Binop ( IROp op, IRExpr* arg1, IRExpr* arg2 );
extern IRExpr* IRExpr_Unop ( IROp op, IRExpr* arg );
union {
struct {
Int offset;
- Int size;
IRExpr* expr;
} Put;
struct {
}
IRStmt;
-extern IRStmt* IRStmt_Put ( Int off, Int sz, IRExpr* value );
+extern IRStmt* IRStmt_Put ( Int off, IRExpr* value );
extern IRStmt* IRStmt_Tmp ( IRTemp tmp, IRExpr* expr );
extern IRStmt* IRStmt_STle ( IRExpr* addr, IRExpr* value );
assert(linebuf[0] == '.');
/* second line is: . byte byte byte etc */
//printf("%s", linebuf);
- printf("Basic Block %d, Start %x, nbytes %d\n",
+ printf("\n\n============ Basic Block %d, "
+ "Start %x, nbytes %d ============\n\n",
bb_number, orig_addr, orig_nbytes);
assert(orig_nbytes >= 1 && orig_nbytes <= N_ORIGBUF);
for (i = 0; i < orig_nbytes; i++) {
printf("\nAfter\n");
for (i = 0; i < rcode->arr_used; i++) {
- ppX86Instr(stdout, rcode->arr[i]);
- printf("\n");
+ ppX86Instr(stdout, rcode->arr[i]);
+ printf("\n");
}
printf("\n");
}