Commit 00b4515c authored by Junliang Yan's avatar Junliang Yan Committed by V8 LUCI CQ

s390: fix offset overflow on atomic op

Change-Id: If8017e175fe4568ba10889dbb3b88cce897ec57e
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2972736
Auto-Submit: Junliang Yan <junyan@redhat.com>
Reviewed-by: 's avatarMilad Fa <mfarazma@redhat.com>
Commit-Queue: Junliang Yan <junyan@redhat.com>
Cr-Commit-Position: refs/heads/master@{#75305}
parent 39a1ae9a
...@@ -451,6 +451,14 @@ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr, ...@@ -451,6 +451,14 @@ void LiftoffAssembler::AtomicLoad(LiftoffRegister dst, Register src_addr,
void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg, void LiftoffAssembler::AtomicStore(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, LiftoffRegister src, uintptr_t offset_imm, LiftoffRegister src,
StoreType type, LiftoffRegList pinned) { StoreType type, LiftoffRegList pinned) {
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -515,6 +523,14 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg, ...@@ -515,6 +523,14 @@ void LiftoffAssembler::AtomicAdd(Register dst_addr, Register offset_reg,
value, result, tmp1)) value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -599,6 +615,14 @@ void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg, ...@@ -599,6 +615,14 @@ void LiftoffAssembler::AtomicSub(Register dst_addr, Register offset_reg,
value, result, tmp1)) value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -683,6 +707,14 @@ void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg, ...@@ -683,6 +707,14 @@ void LiftoffAssembler::AtomicAnd(Register dst_addr, Register offset_reg,
value, result, tmp1)) value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -767,6 +799,14 @@ void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg, ...@@ -767,6 +799,14 @@ void LiftoffAssembler::AtomicOr(Register dst_addr, Register offset_reg,
value, result, tmp1)) value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -851,6 +891,14 @@ void LiftoffAssembler::AtomicXor(Register dst_addr, Register offset_reg, ...@@ -851,6 +891,14 @@ void LiftoffAssembler::AtomicXor(Register dst_addr, Register offset_reg,
value, result, tmp1)) value, result, tmp1))
.gp(); .gp();
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -927,6 +975,14 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg, ...@@ -927,6 +975,14 @@ void LiftoffAssembler::AtomicExchange(Register dst_addr, Register offset_reg,
uintptr_t offset_imm, uintptr_t offset_imm,
LiftoffRegister value, LiftoffRegister value,
LiftoffRegister result, StoreType type) { LiftoffRegister result, StoreType type) {
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
...@@ -995,6 +1051,14 @@ void LiftoffAssembler::AtomicCompareExchange( ...@@ -995,6 +1051,14 @@ void LiftoffAssembler::AtomicCompareExchange(
Register dst_addr, Register offset_reg, uintptr_t offset_imm, Register dst_addr, Register offset_reg, uintptr_t offset_imm,
LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result, LiftoffRegister expected, LiftoffRegister new_value, LiftoffRegister result,
StoreType type) { StoreType type) {
if (!is_int20(offset_imm)) {
mov(ip, Operand(offset_imm));
if (offset_reg != no_reg) {
AddS64(ip, offset_reg);
}
offset_reg = ip;
offset_imm = 0;
}
lay(ip, lay(ip,
MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm)); MemOperand(dst_addr, offset_reg == no_reg ? r0 : offset_reg, offset_imm));
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment