|
From: <sv...@va...> - 2015-09-08 06:25:09
|
Author: florian
Date: Tue Sep 8 07:25:02 2015
New Revision: 3186
Log:
Improve the spechelper for S390_CC_OP_TEST_UNDER_MASK_16.
Fixes BZ #352284.
Modified:
trunk/priv/guest_s390_helpers.c
Modified: trunk/priv/guest_s390_helpers.c
==============================================================================
--- trunk/priv/guest_s390_helpers.c (original)
+++ trunk/priv/guest_s390_helpers.c Tue Sep 8 07:25:02 2015
@@ -2151,6 +2151,8 @@
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 @@
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 @@
goto missed;
}
- /* --------- Specialising "s390_calculate_cond" --------- */
+ /* --------- Specialising "s390_calculate_cc" --------- */
if (vex_streq(function_name, "s390_calculate_cc")) {
IRExpr *cc_op_expr, *cc_dep1;
|