From: Julian Seward Date: Fri, 4 Mar 2005 13:51:28 +0000 (+0000) Subject: A couple more flags-specialisation cases, derived from profiling FP X-Git-Tag: svn/VALGRIND_3_0_1^2~330 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=447411a551399e8a6e2d045e427f23bb48c28f9b;p=thirdparty%2Fvalgrind.git A couple more flags-specialisation cases, derived from profiling FP code. git-svn-id: svn://svn.valgrind.org/vex/trunk@1004 --- diff --git a/VEX/priv/guest-x86/ghelpers.c b/VEX/priv/guest-x86/ghelpers.c index c3ba8ea7e2..d4c3d96192 100644 --- a/VEX/priv/guest-x86/ghelpers.c +++ b/VEX/priv/guest-x86/ghelpers.c @@ -814,6 +814,14 @@ IRExpr* guest_x86_spechelper ( HChar* function_name, binop(Iop_CmpLT32U, cc_dep1, cc_dep2)); } + if (isU32(cc_op, X86G_CC_OP_SUBL) && isU32(cond, X86CondS)) { + /* long sub/cmp, then S --> test (dst-src extract C dep1, and test (C == 1). */ + 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; return unop( Iop_1Uto32, binop( - Iop_CmpNE32, + Iop_CmpEQ32, binop( Iop_And32, binop(Iop_Shr32, cc_dep1, mkU8(X86G_CC_SHIFT_C)), mkU32(1) ), + mkU32(nnn) + ) + ); + } + + if (isU32(cc_op, X86G_CC_OP_COPY) && isU32(cond, X86CondZ)) { + /* COPY, then Z --> extract Z from dep1, and test (Z == 1). */ + return + unop( + Iop_1Uto32, + binop( + Iop_CmpNE32, + binop( + Iop_And32, + binop(Iop_Shr32, cc_dep1, mkU8(X86G_CC_SHIFT_Z)), + mkU32(1) + ), mkU32(0) ) );