From: Julian Seward Date: Thu, 24 Mar 2011 09:01:50 +0000 (+0000) Subject: s390x: MHY is not universally available. Fixes #268930. X-Git-Tag: svn/VALGRIND_3_7_0^2~109 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e8a3a4e546cfc28772e85d437d5ed67b81ce5651;p=thirdparty%2Fvalgrind.git s390x: MHY is not universally available. Fixes #268930. (Florian Krohm, britzel@acm.org) git-svn-id: svn://svn.valgrind.org/vex/trunk@2115 --- diff --git a/VEX/priv/host_s390_defs.c b/VEX/priv/host_s390_defs.c index b0504dec62..c429c06f22 100644 --- a/VEX/priv/host_s390_defs.c +++ b/VEX/priv/host_s390_defs.c @@ -3338,7 +3338,7 @@ s390_emit_load_32imm(UChar *p, UChar reg, UInt val) /*--- Wrapper functions ---*/ /*------------------------------------------------------------*/ -/* r1[32:63],r1+1[32:63] = r1+1[32:63] * memory[op2addr][32:63] */ +/* r1[32:63],r1+1[32:63] = r1+1[32:63] * memory[op2addr][0:31] */ static UChar * s390_emit_MFYw(UChar *p, UChar r1, UChar x, UChar b, UShort dl, UChar dh) { @@ -3351,6 +3351,19 @@ s390_emit_MFYw(UChar *p, UChar r1, UChar x, UChar b, UShort dl, UChar dh) return s390_emit_MR(p, r1, R0); } +/* r1[32:63] = r1[32:63] * memory[op2addr][0:15] */ +static UChar * +s390_emit_MHYw(UChar *p, UChar r1, UChar x, UChar b, UShort dl, UChar dh) +{ + if (s390_host_has_gie) { + return s390_emit_MHY(p, r1, x, b, dl, dh); + } + + /* Load from memory into R0, then MULTIPLY with R1 */ + p = s390_emit_LHY(p, R0, x, b, dl, dh); + return s390_emit_MSR(p, r1, R0); +} + /* r1[32:63] = r1[32:63] * i2 */ static UChar * s390_emit_MSFIw(UChar *p, UChar r1, UInt i2) @@ -5023,7 +5036,7 @@ s390_insn_alu_emit(UChar *buf, const s390_insn *insn) return s390_emit_SHY(buf, dst, x, b, DISP20(d)); case S390_ALU_MUL: - return s390_emit_MHY(buf, dst, x, b, DISP20(d)); + return s390_emit_MHYw(buf, dst, x, b, DISP20(d)); /* For bitwise operations: Move two bytes from memory into scratch register r0; then perform operation */