From 2da72fe1c235c2b631d1651c5a11376bc7b83551 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 22 Nov 2006 16:01:45 +0000 Subject: [PATCH] A couple more x86 spec rules: COPY-CondNZ and SUBL-CondNS. git-svn-id: svn://svn.valgrind.org/vex/trunk@1681 --- VEX/priv/guest-x86/ghelpers.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/VEX/priv/guest-x86/ghelpers.c b/VEX/priv/guest-x86/ghelpers.c index 5ad6210aed..04a626d69e 100644 --- a/VEX/priv/guest-x86/ghelpers.c +++ b/VEX/priv/guest-x86/ghelpers.c @@ -885,6 +885,16 @@ IRExpr* guest_x86_spechelper ( HChar* function_name, mkU32(0))); } + if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondNS)) { + /* long sub/cmp, then S + --> test !(dst-src test 0 <=s (dst-src) */ + return unop(Iop_1Uto32, + binop(Iop_CmpLE32S, + mkU32(0), + binop(Iop_Sub32, cc_dep1, cc_dep2))); + } + /*---------------- SUBW ----------------*/ if (isU32(cc_op, X86G_CC_OP_SUBW) && isU32(cond, X86CondZ)) { @@ -1124,8 +1134,8 @@ IRExpr* guest_x86_spechelper ( HChar* function_name, ); } - if (isU32(cc_op, X86G_CC_OP_COPY) && - (isU32(cond, X86CondB) || isU32(cond, X86CondNB))) { + if (isU32(cc_op, X86G_CC_OP_COPY) + && (isU32(cond, X86CondB) || isU32(cond, X86CondNB))) { /* COPY, then B --> extract C from dep1, and test (C == 1). */ /* COPY, then NB --> extract C from dep1, and test (C == 0). */ UInt nnn = isU32(cond, X86CondB) ? 1 : 0; @@ -1144,19 +1154,22 @@ IRExpr* guest_x86_spechelper ( HChar* function_name, ); } - if (isU32(cc_op, X86G_CC_OP_COPY) && isU32(cond, X86CondZ)) { + if (isU32(cc_op, X86G_CC_OP_COPY) + && (isU32(cond, X86CondZ) || isU32(cond, X86CondNZ))) { /* COPY, then Z --> extract Z from dep1, and test (Z == 1). */ + /* COPY, then NZ --> extract Z from dep1, and test (Z == 0). */ + UInt nnn = isU32(cond, X86CondZ) ? 1 : 0; return unop( Iop_1Uto32, binop( - Iop_CmpNE32, + Iop_CmpEQ32, binop( Iop_And32, binop(Iop_Shr32, cc_dep1, mkU8(X86G_CC_SHIFT_Z)), mkU32(1) ), - mkU32(0) + mkU32(nnn) ) ); } -- 2.47.3