From: Florian Krohm Date: Tue, 8 Sep 2015 06:25:02 +0000 (+0000) Subject: Improve the spechelper for S390_CC_OP_TEST_UNDER_MASK_16. X-Git-Tag: svn/VALGRIND_3_11_0^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=abd9337e2fd33b256fdf67234fae2a2f5cd3ce7f;p=thirdparty%2Fvalgrind.git Improve the spechelper for S390_CC_OP_TEST_UNDER_MASK_16. Fixes BZ #352284. git-svn-id: svn://svn.valgrind.org/vex/trunk@3186 --- diff --git a/VEX/priv/guest_s390_helpers.c b/VEX/priv/guest_s390_helpers.c index 45082c8b4b..f484f8ed05 100644 --- a/VEX/priv/guest_s390_helpers.c +++ b/VEX/priv/guest_s390_helpers.c @@ -2151,6 +2151,8 @@ guest_s390x_spechelper(const HChar *function_name, IRExpr **args, return mkU32(0); } + if (cond == 15) return mkU32(1); + if (cond == 8) { return unop(Iop_1Uto32, binop(Iop_CmpEQ64, binop(Iop_And64, cc_dep1, cc_dep2), @@ -2227,6 +2229,17 @@ guest_s390x_spechelper(const HChar *function_name, IRExpr **args, binop(Iop_And64, cc_dep1, mkU64(msb)), mkU64(0))); } + if (cond == 13) { /* cc == 0 || cc == 1 || cc == 3 */ + IRExpr *c01, *c3; + + c01 = binop(Iop_CmpEQ64, binop(Iop_And64, cc_dep1, mkU64(msb)), + mkU64(0)); + c3 = binop(Iop_CmpEQ64, binop(Iop_And64, cc_dep1, cc_dep2), + mkU64(mask16)); + return binop(Iop_Or32, unop(Iop_1Uto32, c01), + unop(Iop_1Uto32, c3)); + } + // fixs390: handle cond = 5,6,9,10 (the missing cases) // vex_printf("TUM mask = 0x%llx\n", mask16); goto missed; } @@ -2365,7 +2378,7 @@ guest_s390x_spechelper(const HChar *function_name, IRExpr **args, goto missed; } - /* --------- Specialising "s390_calculate_cond" --------- */ + /* --------- Specialising "s390_calculate_cc" --------- */ if (vex_streq(function_name, "s390_calculate_cc")) { IRExpr *cc_op_expr, *cc_dep1;