|
From: <sv...@va...> - 2005-04-27 11:53:00
|
Author: sewardj
Date: 2005-04-27 12:52:40 +0100 (Wed, 27 Apr 2005)
New Revision: 1148
Modified:
trunk/priv/guest-amd64/ghelpers.c
Log:
* Use new 64-to/from-{16,8,1} conversion primops
* disable "Z after SUBW" specialisation which apparently causes
xedit to fail for unknown reasons
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 2005-04-27 11:50:56 UTC (rev 1147)
+++ trunk/priv/guest-amd64/ghelpers.c 2005-04-27 11:52:40 UTC (rev 1148)
@@ -900,22 +900,20 @@
if (isU64(cc_op, AMD64G_CC_OP_SUBL) && isU64(cond, AMD64CondL)) {
/* long sub/cmp, then L (signed less than)=20
--> test dst <s src */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
+ return unop(Iop_1Uto64,
binop(Iop_CmpLT64S,=20
binop(Iop_Shl64,cc_dep1,mkU8(32)),
- binop(Iop_Shl64,cc_dep2,mkU8(32)))));
+ binop(Iop_Shl64,cc_dep2,mkU8(32))));
=20
}
=20
if (isU64(cc_op, AMD64G_CC_OP_SUBL) && isU64(cond, AMD64CondLE)) {
/* long sub/cmp, then L (signed less than or equal)=20
--> test dst <s src */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
+ return unop(Iop_1Uto64,
binop(Iop_CmpLE64S,=20
binop(Iop_Shl64,cc_dep1,mkU8(32)),
- binop(Iop_Shl64,cc_dep2,mkU8(32)))));
+ binop(Iop_Shl64,cc_dep2,mkU8(32))));
=20
}
=20
@@ -936,24 +934,23 @@
=20
/*---------------- SUBW ----------------*/
=20
- if (isU64(cc_op, AMD64G_CC_OP_SUBW) && isU64(cond, AMD64CondZ)) {
- /* word sub/cmp, then Z --> test dst=3D=3Dsrc */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
- binop(Iop_CmpEQ16,=20
- unop(Iop_32to16,unop(Iop_64to32,cc_dep1)),
- unop(Iop_32to16,unop(Iop_64to32,cc_dep2)))));
- }
+ // CAUSES xedit not to work
+ // if (isU64(cc_op, AMD64G_CC_OP_SUBW) && isU64(cond, AMD64Co=
ndZ)) {
+ // /* word sub/cmp, then Z --> test dst=3D=3Dsrc */
+ // return unop(Iop_1Uto64,
+ // binop(Iop_CmpEQ16,=20
+ // unop(Iop_64to16,cc_dep1),
+ // unop(Iop_64to16,cc_dep2)));
+ // }
=20
/*---------------- SUBB ----------------*/
=20
if (isU64(cc_op, AMD64G_CC_OP_SUBB) && isU64(cond, AMD64CondZ)) {
/* byte sub/cmp, then Z --> test dst=3D=3Dsrc */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
+ return unop(Iop_1Uto64,
binop(Iop_CmpEQ8,=20
- unop(Iop_32to8,unop(Iop_64to32,cc_dep1)),
- unop(Iop_32to8,unop(Iop_64to32,cc_dep2)))));
+ unop(Iop_64to8,cc_dep1),
+ unop(Iop_64to8,cc_dep2)));
}
=20
// if (isU64(cc_op, AMD64G_CC_OP_SUBB) && isU64(cond, AMD64CondNZ))=
{
@@ -979,10 +976,10 @@
=20
if (isU64(cc_op, AMD64G_CC_OP_LOGICL) && isU64(cond, AMD64CondZ)) =
{
/* long and/or/xor, then Z --> test dst=3D=3D0 */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,binop(Iop_CmpEQ64,=20
- binop(Iop_Shl64,cc_dep1,mkU8(32)),=
=20
- mkU64(0))));
+ return unop(Iop_1Uto64,
+ binop(Iop_CmpEQ64,=20
+ binop(Iop_Shl64,cc_dep1,mkU8(32)),=20
+ mkU64(0)));
}
=20
//.. if (isU32(cc_op, AMD64G_CC_OP_LOGICL) && isU32(cond, X86CondS=
)) {
@@ -997,10 +994,10 @@
OF is zero, so this reduces to SZ | ZF -- which will be 1 if=
f
the result is <=3Dsigned 0. Hence ...
*/
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,binop(Iop_CmpLE64S,=20
- binop(Iop_Shl64,cc_dep1,mkU8(32)),=
=20
- mkU64(0))));
+ return unop(Iop_1Uto64,
+ binop(Iop_CmpLE64S,=20
+ binop(Iop_Shl64,cc_dep1,mkU8(32)),=20
+ mkU64(0)));
}
=20
//.. if (isU32(cc_op, AMD64G_CC_OP_LOGICL) && isU32(cond, X86CondB=
E)) {
@@ -1112,19 +1109,17 @@
=20
if (isU64(cc_op, AMD64G_CC_OP_SUBL)) {
/* C after sub denotes unsigned less than */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
+ return unop(Iop_1Uto64,
binop(Iop_CmpLT64U,=20
binop(Iop_Shl64,cc_dep1,mkU8(32)),=20
- binop(Iop_Shl64,cc_dep2,mkU8(32)))));
+ binop(Iop_Shl64,cc_dep2,mkU8(32))));
}
if (isU64(cc_op, AMD64G_CC_OP_SUBB)) {
/* C after sub denotes unsigned less than */
- return unop(Iop_32Uto64,
- unop(Iop_1Uto32,
+ return unop(Iop_1Uto64,
binop(Iop_CmpLT64U,=20
binop(Iop_And64,cc_dep1,mkU64(0xFF)),
- binop(Iop_And64,cc_dep2,mkU64(0xFF)))));
+ binop(Iop_And64,cc_dep2,mkU64(0xFF))));
}
if (isU64(cc_op, AMD64G_CC_OP_LOGICQ)
|| isU64(cc_op, AMD64G_CC_OP_LOGICL)
|