8344304: [s390x] ubsan: negation of -2147483648 cannot be represented in type 'int'

Reviewed-by: lucy, dlong
This commit is contained in:
Amit Kumar 2024-12-04 03:44:41 +00:00
parent 7ec36bb783
commit 43b337eb43
3 changed files with 41 additions and 4 deletions

View File

@ -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();
}

View File

@ -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:

View File

@ -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);