/*--- 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)
{
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)
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 */