|
From: <sv...@va...> - 2011-03-24 09:01:59
|
Author: sewardj
Date: 2011-03-24 09:01:50 +0000 (Thu, 24 Mar 2011)
New Revision: 2115
Log:
s390x: MHY is not universally available. Fixes #268930.
(Florian Krohm, br...@ac...)
Modified:
trunk/priv/host_s390_defs.c
Modified: trunk/priv/host_s390_defs.c
===================================================================
--- trunk/priv/host_s390_defs.c 2011-03-24 08:57:29 UTC (rev 2114)
+++ trunk/priv/host_s390_defs.c 2011-03-24 09:01:50 UTC (rev 2115)
@@ -3338,7 +3338,7 @@
/*--- 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 @@
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 @@
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 */
|