diff --git a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp index dee64d3db26..bb0494dc478 100644 --- a/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/c1_LIRAssembler_s390.cpp @@ -1532,8 +1532,12 @@ void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr // cpu register - constant jint c = right->as_constant_ptr()->as_jint(); switch (code) { - case lir_add: __ z_agfi(lreg, c); break; - case lir_sub: __ z_agfi(lreg, -c); break; // note: -min_jint == min_jint + case lir_add: + __ add2reg_32(lreg, c); + break; + case lir_sub: + __ add2reg_32(lreg, java_negate(c)); + break; case lir_mul: __ z_msfi(lreg, c); break; default: ShouldNotReachHere(); } diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp index aacfb894c72..c297c66b02b 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp @@ -657,7 +657,7 @@ void MacroAssembler::add2reg(Register r1, int64_t imm, Register r2) { z_aghik(r1, r2, imm); return; } - z_lgr(r1, r2); + lgr_if_needed(r1, r2); z_aghi(r1, imm); return; } @@ -681,6 +681,37 @@ void MacroAssembler::add2reg(Register r1, int64_t imm, Register r2) { z_agfi(r1, imm); } +void MacroAssembler::add2reg_32(Register r1, int64_t imm, Register r2) { + assert(Immediate::is_simm32(imm), "probably an implicit conversion went wrong"); + + if (r2 == noreg) { r2 = r1; } + + // Handle special case imm == 0. + if (imm == 0) { + lr_if_needed(r1, r2); + // Nothing else to do. + return; + } + + if (Immediate::is_simm16(imm)) { + if (r1 == r2){ + z_ahi(r1, imm); + return; + } + if (VM_Version::has_DistinctOpnds()) { + z_ahik(r1, r2, imm); + return; + } + lr_if_needed(r1, r2); + z_ahi(r1, imm); + return; + } + + // imm is simm32 + lr_if_needed(r1, r2); + z_afi(r1, imm); +} + // Generic operation r := b + x + d // // Addition of several operands with address generation semantics - sort of: diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.hpp b/src/hotspot/cpu/s390/macroAssembler_s390.hpp index 91703fac994..15968812818 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.hpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.hpp @@ -156,7 +156,9 @@ class MacroAssembler: public Assembler { unsigned int mul_reg64_const16(Register rval, Register work, int cval); // Generic operation r1 := r2 + imm. - void add2reg(Register r1, int64_t imm, Register r2 = noreg); + void add2reg (Register r1, int64_t imm, Register r2 = noreg); + void add2reg_32(Register r1, int64_t imm, Register r2 = noreg); + // Generic operation r := b + x + d. void add2reg_with_index(Register r, int64_t d, Register x, Register b = noreg);