mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-03 15:08:24 +00:00
8344304: [s390x] ubsan: negation of -2147483648 cannot be represented in type 'int'
Reviewed-by: lucy, dlong
This commit is contained in:
parent
7ec36bb783
commit
43b337eb43
@ -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();
|
||||
}
|
||||
|
||||
@ -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:
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user