From: Florian Krohm Date: Wed, 25 Jul 2012 00:52:21 +0000 (+0000) Subject: Change IR generation for SRST, CLST, and CLCLE to not generate cc=3. X-Git-Tag: svn/VALGRIND_3_8_1^2~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1c7ff778b0cc8f8d9ea229d764b1df3eda38fa20;p=thirdparty%2Fvalgrind.git Change IR generation for SRST, CLST, and CLCLE to not generate cc=3. Two reasons: (1) Consistency in implementation (we don't generate cc=3 for "translate", "convert to unicode" and possibly other insns) (2) There is nothing to be gained. A program that does not handle cc=3 correctly (by looping back to the insn that generated it) may exhibit unpredictable behaviours. And there is no way for us to match that (as we cannot know when hardware decides to interrupt the insn). So why add complexity for that. git-svn-id: svn://svn.valgrind.org/vex/trunk@2446 --- diff --git a/VEX/priv/guest_s390_toIR.c b/VEX/priv/guest_s390_toIR.c index c2c986ed1d..c63aebef40 100644 --- a/VEX/priv/guest_s390_toIR.c +++ b/VEX/priv/guest_s390_toIR.c @@ -8693,16 +8693,6 @@ s390_irgen_CLCLE(UChar r1, UChar r3, IRTemp pad2) mkite(binop(Iop_CmpEQ64, mkexpr(len3), mkU64(0)), mkU64(0), binop(Iop_Sub64, mkexpr(len3), mkU64(1)))); - /* The architecture requires that we exit with CC3 after a machine specific - amount of bytes. We do that if len1+len3 % 4096 == 0 */ - s390_cc_set(3); - if_condition_goto(binop(Iop_CmpEQ64, - binop(Iop_And64, - binop(Iop_Add64, mkexpr(len1), mkexpr(len3)), - mkU64(0xfff)), - mkU64(0)), - guest_IA_next_instr); - always_goto_and_chase(guest_IA_curr_instr); return "clcle"; @@ -9021,13 +9011,8 @@ s390_irgen_SRST(UChar r1, UChar r2) put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1))); put_gpr_dw0(r1, mkexpr(next)); put_gpr_dw0(r2, binop(Iop_Add64, mkexpr(address), mkU64(1))); - stmt(IRStmt_Exit(binop(Iop_CmpNE64, mkexpr(counter), mkU64(255)), - Ijk_Boring, IRConst_U64(guest_IA_curr_instr), - S390X_GUEST_OFFSET(guest_IA))); - // >= 256 bytes done CC=3 - s390_cc_set(3); - put_counter_dw0(mkU64(0)); - dummy_put_IA(); + + always_goto_and_chase(guest_IA_curr_instr); return "srst"; } @@ -9089,13 +9074,8 @@ s390_irgen_CLST(UChar r1, UChar r2) put_counter_dw0(binop(Iop_Add64, mkexpr(counter), mkU64(1))); put_gpr_dw0(r1, binop(Iop_Add64, get_gpr_dw0(r1), mkU64(1))); put_gpr_dw0(r2, binop(Iop_Add64, get_gpr_dw0(r2), mkU64(1))); - stmt(IRStmt_Exit(binop(Iop_CmpNE64, mkexpr(counter), mkU64(255)), - Ijk_Boring, IRConst_U64(guest_IA_curr_instr), - S390X_GUEST_OFFSET(guest_IA))); - // >= 256 bytes done CC=3 - s390_cc_set(3); - put_counter_dw0(mkU64(0)); - dummy_put_IA(); + + always_goto_and_chase(guest_IA_curr_instr); return "clst"; }