mips: Fixing some HReg <--> UInt mixups spotted by Florian.
git-svn-id: svn://svn.valgrind.org/vex/trunk@2670 8f6e269a-dfd6-0310-a8e1-e2731360e62c
diff --git a/priv/host_mips_defs.c b/priv/host_mips_defs.c
index e0e490b..2e144c2 100644
--- a/priv/host_mips_defs.c
+++ b/priv/host_mips_defs.c
@@ -863,7 +863,10 @@
ret = MIPSAMode_IR(am->Mam.IR.index + 4, am->Mam.IR.base);
break;
case Mam_RR:
- ret = MIPSAMode_RR(am->Mam.RR.index + 1, am->Mam.RR.base);
+ ret = MIPSAMode_RR(mkHReg(hregNumber(am->Mam.RR.index) + 1,
+ hregClass(am->Mam.RR.index),
+ hregIsVirtual(am->Mam.RR.index)),
+ am->Mam.RR.base);
break;
default:
vpanic("dopyMIPSAMode");
@@ -880,7 +883,10 @@
ret = MIPSAMode_IR(am->Mam.IR.index + 4, am->Mam.IR.base);
break;
case Mam_RR:
- ret = MIPSAMode_RR(am->Mam.RR.index + 1, am->Mam.RR.base);
+ ret = MIPSAMode_RR(mkHReg(hregNumber(am->Mam.RR.index) + 1,
+ hregClass(am->Mam.RR.index),
+ hregIsVirtual(am->Mam.RR.index)),
+ am->Mam.RR.base);
break;
default:
vpanic("dopyMIPSAMode");
@@ -2175,7 +2181,8 @@
return False;
if (i->Min.Alu.srcR->tag != Mrh_Reg)
return False;
- if (i->Min.Alu.srcR->Mrh.Reg.reg != i->Min.Alu.srcL)
+ if (hregNumber(i->Min.Alu.srcR->Mrh.Reg.reg)
+ != hregNumber(i->Min.Alu.srcL))
return False;
*src = i->Min.Alu.srcL;
*dst = i->Min.Alu.dst;
@@ -3127,7 +3134,7 @@
/* blez r_src, delta/4-1 */
vassert(cond == MIPScc_EQ);
ptmp = mkFormI(ptmp, 6, r_src, 0, delta / 4 - 1);
- ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
+ mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
}
goto done;
}
@@ -3189,7 +3196,7 @@
nop*/
ptmp = mkFormI(ptmp, 35, 10, 9, 316);
ptmp = mkFormI(ptmp, 4, 0, 9, (delta));
- ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
+ mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
}
goto done;
}
@@ -3238,7 +3245,7 @@
nop*/
ptmp = mkFormI(ptmp, 35, 10, 9, 316);
ptmp = mkFormI(ptmp, 4, 0, 9, (delta));
- ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
+ mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
}
goto done;
}
@@ -3308,7 +3315,7 @@
nop*/
ptmp = mkFormI(ptmp, 35, 10, 9, 316);
ptmp = mkFormI(ptmp, 4, 0, 9, (delta));
- ptmp = mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
+ mkFormR(ptmp, 0, 0, 0, 0, 0, 0);
}
goto done;
}
diff --git a/priv/host_mips_isel.c b/priv/host_mips_isel.c
index 6cc7dc6..9d56cd7 100644
--- a/priv/host_mips_isel.c
+++ b/priv/host_mips_isel.c
@@ -371,7 +371,7 @@
Int n_args, i, argreg;
UInt argiregs;
ULong target;
- HReg src = 0;
+ HReg src = INVALID_HREG;
/* MIPS O32 calling convention: up to four registers ($a0 ... $a3)
are allowed to be used for passing integer arguments. They correspond
@@ -570,7 +570,7 @@
return toBool(hregClass(am->Mam.RR.base) == HRcGPR(mode64) &&
hregIsVirtual(am->Mam.RR.base) &&
hregClass(am->Mam.RR.index) == HRcGPR(mode64) &&
- hregIsVirtual(am->Mam.IR.index));
+ hregIsVirtual(am->Mam.RR.index));
default:
vpanic("sane_AMode: unknown mips amode tag");
}
@@ -1206,25 +1206,25 @@
MIPSRH_Imm(False, 0xFF)));
return r_dst;
}
-
- case Iop_16Uto32:
+
+ case Iop_1Uto32:
case Iop_8Uto32:
- case Iop_1Uto32: {
+ case Iop_16Uto32: {
HReg r_dst = newVRegI(env);
HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
UShort amt;
switch (op_unop) {
case Iop_1Uto32:
- case Iop_1Uto8:
amt = 31;
break;
-
+ case Iop_8Uto32:
+ amt = 24;
+ break;
case Iop_16Uto32:
amt = 16;
break;
-
default:
- amt = 24;
+ vassert(0);
break;
}
@@ -1241,8 +1241,7 @@
vassert(mode64);
HReg r_dst = newVRegI(env);
HReg r_src = iselWordExpr_R(env, e->Iex.Unop.arg);
- UShort mask = toUShort(op_unop == Iop_16Uto64 ? 0xFFFF :
- op_unop == Iop_16Uto32 ? 0xFFFF : 0xFF);
+ UShort mask = toUShort(op_unop == Iop_16Uto64 ? 0xFFFF : 0xFF);
addInstr(env, MIPSInstr_Alu(Malu_AND, r_dst, r_src,
MIPSRH_Imm(False, mask)));
return r_dst;