|
From: <sv...@va...> - 2005-05-03 09:09:31
|
Author: sewardj
Date: 2005-05-03 10:09:27 +0100 (Tue, 03 May 2005)
New Revision: 1158
Modified:
trunk/priv/host-x86/isel.c
Log:
Generate better code for CmpNEZ64(Or64(x,y)), a common idiom resulting
from memchecking of FP code.
Modified: trunk/priv/host-x86/isel.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/priv/host-x86/isel.c 2005-05-03 09:08:23 UTC (rev 1157)
+++ trunk/priv/host-x86/isel.c 2005-05-03 09:09:27 UTC (rev 1158)
@@ -1560,7 +1560,7 @@
if (matchIRExpr(&mi, p_CmpNEZ32_And32, e)) {
HReg r0 =3D iselIntExpr_R(env, mi.bindee[0]);
X86RMI* rmi1 =3D iselIntExpr_RMI(env, mi.bindee[1]);
- HReg tmp =3D newVRegI(env);
+ HReg tmp =3D newVRegI(env);
addInstr(env, mk_iMOVsd_RR(r0, tmp));
addInstr(env, X86Instr_Alu32R(Xalu_AND,rmi1,tmp));
return Xcc_NZ;
@@ -1575,12 +1575,13 @@
if (matchIRExpr(&mi, p_CmpNEZ32_Or32, e)) {
HReg r0 =3D iselIntExpr_R(env, mi.bindee[0]);
X86RMI* rmi1 =3D iselIntExpr_RMI(env, mi.bindee[1]);
- HReg tmp =3D newVRegI(env);
+ HReg tmp =3D newVRegI(env);
addInstr(env, mk_iMOVsd_RR(r0, tmp));
addInstr(env, X86Instr_Alu32R(Xalu_OR,rmi1,tmp));
return Xcc_NZ;
}
}
+
/* CmpNEZ32(x) */
if (e->tag =3D=3D Iex_Unop=20
&& e->Iex.Unop.op =3D=3D Iop_CmpNEZ32) {
@@ -1603,6 +1604,24 @@
}
}
=20
+ /* CmpNEZ64(Or64(x,y)) */
+ {
+ DECLARE_PATTERN(p_CmpNEZ64_Or64);
+ DEFINE_PATTERN(p_CmpNEZ64_Or64,
+ unop(Iop_CmpNEZ64, binop(Iop_Or64, bind(0), bind(1)=
)));
+ if (matchIRExpr(&mi, p_CmpNEZ64_Or64, e)) {
+ HReg hi1, lo1, hi2, lo2;
+ HReg tmp =3D newVRegI(env);
+ iselInt64Expr( &hi1, &lo1, env, mi.bindee[0] );
+ addInstr(env, mk_iMOVsd_RR(hi1, tmp));
+ addInstr(env, X86Instr_Alu32R(Xalu_OR,X86RMI_Reg(lo1),tmp));
+ iselInt64Expr( &hi2, &lo2, env, mi.bindee[1] );
+ addInstr(env, X86Instr_Alu32R(Xalu_OR,X86RMI_Reg(hi2),tmp));
+ addInstr(env, X86Instr_Alu32R(Xalu_OR,X86RMI_Reg(lo2),tmp));
+ return Xcc_NZ;
+ }
+ }
+
/* CmpNEZ64(x) */
if (e->tag =3D=3D Iex_Unop=20
&& e->Iex.Unop.op =3D=3D Iop_CmpNEZ64) {
|