Now tracking constant values for most operations.

This will make it easier to enable memory access optimizations and hacks.
Not all operations are updating the constant registers, only those that
are likely to participate in constant value building. Constant values are
cleared on every basic block, though this may be too zealous it prevents
weird fall-through cases.
This commit is contained in:
Ben Vanik
2013-05-30 22:50:32 -07:00
parent 7990146001
commit 78086684c6
5 changed files with 281 additions and 5 deletions

View File

@@ -45,6 +45,8 @@ XEEMITTER(addx, 0x7C000214, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -70,6 +72,17 @@ XEEMITTER(addi, 0x38000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
}
e.update_gpr_value(i.D.RT, v);
if (i.D.RA) {
uint64_t value;
if (e.get_constant_gpr_value(i.D.RA, &value)) {
e.set_constant_gpr_value(i.D.RT, value + XEEXTS16(i.D.DS));
} else {
e.clear_constant_gpr_value(i.D.RT);
}
} else {
e.set_constant_gpr_value(i.D.RT, XEEXTS16(i.D.DS));
}
return 0;
}
@@ -85,6 +98,13 @@ XEEMITTER(addic, 0x30000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_gpr_value(i.D.RT, v);
e.update_xer_with_carry(cc);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RA, &value)) {
e.set_constant_gpr_value(i.D.RT, value + XEEXTS16(i.D.DS));
} else {
e.clear_constant_gpr_value(i.D.RT);
}
return 0;
}
@@ -99,6 +119,14 @@ XEEMITTER(addicx, 0x34000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_gpr_value(i.D.RT, v);
e.update_cr_with_cond(0, v);
e.update_xer_with_carry(cc);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RA, &value)) {
e.set_constant_gpr_value(i.D.RT, value + XEEXTS16(i.D.DS));
} else {
e.clear_constant_gpr_value(i.D.RT);
}
return 0;
}
@@ -114,6 +142,17 @@ XEEMITTER(addis, 0x3C000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
}
e.update_gpr_value(i.D.RT, v);
if (i.D.RA) {
uint64_t value;
if (e.get_constant_gpr_value(i.D.RA, &value)) {
e.set_constant_gpr_value(i.D.RT, value + (XEEXTS16(i.D.DS) << 16));
} else {
e.clear_constant_gpr_value(i.D.RT);
}
} else {
e.set_constant_gpr_value(i.D.RT, XEEXTS16(i.D.DS) << 16);
}
return 0;
}
@@ -153,6 +192,8 @@ XEEMITTER(addzex, 0x7C000194, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -221,6 +262,8 @@ XEEMITTER(divwx, 0x7C0003D6, XO )(X64Emitter& e, X86Compiler& c, InstrDat
b.CreateBr(after_bb);
#endif
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -282,6 +325,8 @@ XEEMITTER(divwux, 0x7C000396, XO )(X64Emitter& e, X86Compiler& c, InstrDat
b.CreateBr(after_bb);
#endif
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -324,6 +369,8 @@ XEEMITTER(mulli, 0x1C000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
c.mul(v_hi, v_lo, e.gpr_value(i.D.RA));
e.update_gpr_value(i.D.RT, v_lo);
e.clear_constant_gpr_value(i.D.RT);
return 0;
}
@@ -348,6 +395,8 @@ XEEMITTER(mullwx, 0x7C0001D6, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v_0);
}
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -374,8 +423,6 @@ XEEMITTER(negx, 0x7C0000D0, XO )(X64Emitter& e, X86Compiler& c, InstrDat
// // With cr0 update.
// e.update_cr_with_cond(0, v0, e.get_int64(0), true);
//}
return 0;
} else {
// No OE bit setting.
GpVar v(c.newGpVar());
@@ -387,9 +434,16 @@ XEEMITTER(negx, 0x7C0000D0, XO )(X64Emitter& e, X86Compiler& c, InstrDat
// With cr0 update.
e.update_cr_with_cond(0, v);
}
return 0;
}
uint64_t value;
if (e.get_constant_gpr_value(i.XO.RA, &value)) {
e.set_constant_gpr_value(i.XO.RT, ~value + 1);
} else {
e.clear_constant_gpr_value(i.XO.RT);
}
return 0;
}
XEEMITTER(subfx, 0x7C000050, XO )(X64Emitter& e, X86Compiler& c, InstrData& i) {
@@ -414,6 +468,8 @@ XEEMITTER(subfx, 0x7C000050, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -431,6 +487,8 @@ XEEMITTER(subfcx, 0x7C000010, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_gpr_value(i.XO.RT, v);
e.update_xer_with_carry(cc);
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -448,6 +506,13 @@ XEEMITTER(subficx, 0x20000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_gpr_value(i.D.RT, v);
e.update_xer_with_carry(cc);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RA, &value)) {
e.set_constant_gpr_value(i.D.RT, ~value + XEEXTS16(i.D.DS) + 1);
} else {
e.clear_constant_gpr_value(i.D.RT);
}
return 0;
}
@@ -488,6 +553,8 @@ XEEMITTER(subfex, 0x7C000110, XO )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.XO.RT);
return 0;
}
@@ -642,6 +709,8 @@ XEEMITTER(andx, 0x7C000038, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -659,6 +728,8 @@ XEEMITTER(andcx, 0x7C000078, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -673,6 +744,13 @@ XEEMITTER(andix, 0x70000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
// With cr0 update.
e.update_cr_with_cond(0, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value & i.D.DS);
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 0;
}
@@ -687,6 +765,13 @@ XEEMITTER(andisx, 0x74000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
// With cr0 update.
e.update_cr_with_cond(0, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value & (i.D.DS << 16));
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 1;
}
@@ -709,6 +794,8 @@ XEEMITTER(cntlzdx, 0x7C000074, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -731,6 +818,8 @@ XEEMITTER(cntlzwx, 0x7C000034, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -752,6 +841,8 @@ XEEMITTER(eqvx, 0x7C000238, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -773,6 +864,8 @@ XEEMITTER(extsbx, 0x7C000774, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -805,6 +898,8 @@ XEEMITTER(norx, 0x7C0000F8, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -825,6 +920,8 @@ XEEMITTER(orx, 0x7C000378, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -841,6 +938,13 @@ XEEMITTER(ori, 0x60000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
c.or_(v, imm(i.D.DS));
e.update_gpr_value(i.D.RA, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value | i.D.DS);
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 0;
}
@@ -852,6 +956,13 @@ XEEMITTER(oris, 0x64000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
c.or_(v, imm(i.D.DS << 16));
e.update_gpr_value(i.D.RA, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value | (i.D.DS << 16));
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 0;
}
@@ -868,6 +979,8 @@ XEEMITTER(xorx, 0x7C000278, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -879,6 +992,13 @@ XEEMITTER(xori, 0x68000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
c.xor_(v, imm(i.D.DS));
e.update_gpr_value(i.D.RA, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value ^ i.D.DS);
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 0;
}
@@ -890,6 +1010,13 @@ XEEMITTER(xoris, 0x6C000000, D )(X64Emitter& e, X86Compiler& c, InstrDat
c.xor_(v, imm(i.D.DS << 16));
e.update_gpr_value(i.D.RA, v);
uint64_t value;
if (e.get_constant_gpr_value(i.D.RT, &value)) {
e.set_constant_gpr_value(i.D.RA, value ^ (i.D.DS << 16));
} else {
e.clear_constant_gpr_value(i.D.RA);
}
return 0;
}
@@ -939,6 +1066,8 @@ XEEMITTER(rldiclx, 0x78000000, MD )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.MD.RA);
return 0;
}
@@ -970,6 +1099,8 @@ XEEMITTER(rldicrx, 0x78000004, MD )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.MD.RA);
return 0;
}
@@ -1006,6 +1137,8 @@ XEEMITTER(rlwimix, 0x50000000, M )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.M.RA);
return 0;
}
@@ -1033,6 +1166,8 @@ XEEMITTER(rlwinmx, 0x54000000, M )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.M.RA);
return 0;
}
@@ -1066,6 +1201,8 @@ XEEMITTER(sldx, 0x7C000036, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -1092,6 +1229,8 @@ XEEMITTER(slwx, 0x7C000030, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -1153,6 +1292,8 @@ XEEMITTER(srawix, 0x7C000670, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -1178,6 +1319,8 @@ XEEMITTER(srdx, 0x7C000436, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}
@@ -1204,6 +1347,8 @@ XEEMITTER(srwx, 0x7C000430, X )(X64Emitter& e, X86Compiler& c, InstrDat
e.update_cr_with_cond(0, v);
}
e.clear_constant_gpr_value(i.X.RA);
return 0;
}