|
From: <sv...@va...> - 2006-12-28 04:40:17
|
Author: sewardj
Date: 2006-12-28 04:40:12 +0000 (Thu, 28 Dec 2006)
New Revision: 1713
Log:
Tidy up and finalise x86/amd64 flag spec rules for 3.2.2.
x86 COPY-CondP/NP needs re-verification.
Modified:
trunk/priv/guest-amd64/ghelpers.c
trunk/priv/guest-x86/ghelpers.c
Modified: trunk/priv/guest-amd64/ghelpers.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/guest-amd64/ghelpers.c 2006-12-28 02:03:07 UTC (rev 1712)
+++ trunk/priv/guest-amd64/ghelpers.c 2006-12-28 04:40:12 UTC (rev 1713)
@@ -904,7 +904,6 @@
return unop(Iop_1Uto64,
binop(Iop_CmpEQ64,cc_dep1,cc_dep2));
}
-
if (isU64(cc_op, AMD64G_CC_OP_SUBQ) && isU64(cond, AMD64CondNZ)) {
/* long long sub/cmp, then NZ --> test dst!=3Dsrc */
return unop(Iop_1Uto64,
@@ -924,7 +923,6 @@
return unop(Iop_1Uto64,
binop(Iop_CmpLT64U, cc_dep1, cc_dep2));
}
-
if (isU64(cc_op, AMD64G_CC_OP_SUBQ) && isU64(cond, AMD64CondNB)) {
/* long long sub/cmp, then NB (unsigned greater than or equal)
--> test src <=3Du dst */
@@ -949,7 +947,6 @@
binop(Iop_Shl64,cc_dep1,mkU8(32)),
binop(Iop_Shl64,cc_dep2,mkU8(32))));
}
-
if (isU64(cc_op, AMD64G_CC_OP_SUBL) && isU64(cond, AMD64CondNZ)) {
/* long sub/cmp, then NZ --> test dst!=3Dsrc */
return unop(Iop_1Uto64,
@@ -985,7 +982,6 @@
binop(Iop_Shl64,cc_dep1,mkU8(32)),
binop(Iop_Shl64,cc_dep2,mkU8(32))));
}
-
if (isU64(cc_op, AMD64G_CC_OP_SUBL) && isU64(cond, AMD64CondNBE)) =
{
/* long sub/cmp, then NBE (unsigned greater than)
--> test src <u dst */
@@ -1025,7 +1021,6 @@
unop(Iop_64to8,cc_dep1),
unop(Iop_64to8,cc_dep2)));
}
-
if (isU64(cc_op, AMD64G_CC_OP_SUBB) && isU64(cond, AMD64CondNZ)) {
/* byte sub/cmp, then NZ --> test dst!=3Dsrc */
return unop(Iop_1Uto64,
Modified: trunk/priv/guest-x86/ghelpers.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/guest-x86/ghelpers.c 2006-12-28 02:03:07 UTC (rev 1712)
+++ trunk/priv/guest-x86/ghelpers.c 2006-12-28 04:40:12 UTC (rev 1713)
@@ -832,7 +832,6 @@
return unop(Iop_1Uto32,
binop(Iop_CmpEQ32, cc_dep1, cc_dep2));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNZ)) {
/* long sub/cmp, then NZ --> test dst!=3Dsrc */
return unop(Iop_1Uto32,
@@ -845,7 +844,6 @@
return unop(Iop_1Uto32,
binop(Iop_CmpLT32S, cc_dep1, cc_dep2));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNL)) {
/* long sub/cmp, then NL (signed greater than or equal)=20
--> test !(dst <s src) */
@@ -861,9 +859,8 @@
return unop(Iop_1Uto32,
binop(Iop_CmpLE32S, cc_dep1, cc_dep2));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNLE)) {
- /* long sub/cmp, then LE (signed not less than or equal)
+ /* long sub/cmp, then NLE (signed not less than or equal)
--> test dst >s src=20
--> test !(dst <=3Ds src) */
return binop(Iop_Xor32,
@@ -878,7 +875,6 @@
return unop(Iop_1Uto32,
binop(Iop_CmpLE32U, cc_dep1, cc_dep2));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNBE)) {
/* long sub/cmp, then BE (unsigned greater than)
--> test !(dst <=3Du src) */
@@ -894,7 +890,6 @@
return unop(Iop_1Uto32,
binop(Iop_CmpLT32U, cc_dep1, cc_dep2));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNB)) {
/* long sub/cmp, then NB (unsigned greater than or equal)
--> test !(dst <u src) */
@@ -911,7 +906,6 @@
binop(Iop_Sub32, cc_dep1, cc_dep2),
mkU32(0)));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNS)) {
/* long sub/cmp, then NS (not negative) --> test !(dst-src <s 0=
) */
return binop(Iop_Xor32,
@@ -941,7 +935,6 @@
unop(Iop_32to8,cc_dep1),=20
unop(Iop_32to8,cc_dep2)));
}
-
if (isU32(cc_op, X86G_CC_OP_SUBB) && isU32(cond, X86CondNZ)) {
/* byte sub/cmp, then NZ --> test dst!=3Dsrc */
return unop(Iop_1Uto32,
@@ -981,7 +974,6 @@
/* long and/or/xor, then Z --> test dst=3D=3D0 */
return unop(Iop_1Uto32,binop(Iop_CmpEQ32, cc_dep1, mkU32(0)));
}
-
if (isU32(cc_op, X86G_CC_OP_LOGICL) && isU32(cond, X86CondNZ)) {
/* long and/or/xor, then NZ --> test dst!=3D0 */
return unop(Iop_1Uto32,binop(Iop_CmpNE32, cc_dep1, mkU32(0)));
@@ -1039,17 +1031,6 @@
binop(Iop_Shr32,cc_dep1,mkU8(15)),
mkU32(1));
}
- //Probably correct, but no test case for it yet found
- //if (isU32(cc_op, X86G_CC_OP_LOGICW) && isU32(cond, X86CondNS)) {
- // /* see comment below for (LOGICB, CondNS) */
- // /* word and/or/xor, then S --> (UInt) ~ result[15] */
- // vassert(0+0);
- // return binop(Iop_Xor32,
- // binop(Iop_And32,
- // binop(Iop_Shr32,cc_dep1,mkU8(15)),
- // mkU32(1)),
- // mkU32(1));
- //}
=20
/*---------------- LOGICB ----------------*/
=20
@@ -1059,7 +1040,6 @@
binop(Iop_CmpEQ32, binop(Iop_And32,cc_dep1,mkU32(25=
5)),=20
mkU32(0)));
}
-
if (isU32(cc_op, X86G_CC_OP_LOGICB) && isU32(cond, X86CondNZ)) {
/* byte and/or/xor, then Z --> test dst!=3D0 */
/* b9ac9: 84 c0 test %al,%al
@@ -1137,10 +1117,10 @@
=20
if (isU32(cc_op, X86G_CC_OP_COPY) &&=20
(isU32(cond, X86CondBE) || isU32(cond, X86CondNBE))) {
- /* COPY, then BE --> extract C and Z from dep1, and test (C
- or Z =3D=3D 1). */
- /* COPY, then NBE --> extract C and Z from dep1, and test (C
- or Z =3D=3D 0). */
+ /* COPY, then BE --> extract C and Z from dep1, and test=20
+ (C or Z) =3D=3D 1. */
+ /* COPY, then NBE --> extract C and Z from dep1, and test
+ (C or Z) =3D=3D 0. */
UInt nnn =3D isU32(cond, X86CondBE) ? 1 : 0;
return
unop(
@@ -1201,19 +1181,22 @@
);
}
=20
- if (isU32(cc_op, X86G_CC_OP_COPY) && isU32(cond, X86CondP)) {
+ if (isU32(cc_op, X86G_CC_OP_COPY)=20
+ && (isU32(cond, X86CondP) || isU32(cond, X86CondNP))) {
/* COPY, then P --> extract P from dep1, and test (P =3D=3D 1).=
*/
+ /* COPY, then NP --> extract P from dep1, and test (P =3D=3D 0)=
. */
+ UInt nnn =3D isU32(cond, X86CondP) ? 1 : 0;
return
unop(
Iop_1Uto32,
binop(
- Iop_CmpNE32,
+ Iop_CmpEQ32,
binop(
Iop_And32,
binop(Iop_Shr32, cc_dep1, mkU8(X86G_CC_SHIFT_P)),
mkU32(1)
),
- mkU32(0)
+ mkU32(nnn)
)
);
}
|