Commit 9f214787 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: Handle large offsets in LoadPU/StorePU.

TEST=mjsunit/array-constructor
R=joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, bjaideep@ca.ibm.com
BUG=

Review-Url: https://codereview.chromium.org/1947233002
Cr-Commit-Position: refs/heads/master@{#36043}
parent 0a8cd4dc
...@@ -1325,7 +1325,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1325,7 +1325,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
MemOperand(sp, -num_slots * kPointerSize)); MemOperand(sp, -num_slots * kPointerSize));
} else { } else {
__ StorePU(i.InputRegister(0), __ StorePU(i.InputRegister(0),
MemOperand(sp, -num_slots * kPointerSize)); MemOperand(sp, -num_slots * kPointerSize), r0);
} }
break; break;
} }
...@@ -1334,7 +1334,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction( ...@@ -1334,7 +1334,7 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
if (instr->InputAt(0)->IsDoubleRegister()) { if (instr->InputAt(0)->IsDoubleRegister()) {
__ stfd(i.InputDoubleRegister(0), MemOperand(sp, slot * kPointerSize)); __ stfd(i.InputDoubleRegister(0), MemOperand(sp, slot * kPointerSize));
} else { } else {
__ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize)); __ StoreP(i.InputRegister(0), MemOperand(sp, slot * kPointerSize), r0);
} }
break; break;
} }
......
...@@ -4208,11 +4208,7 @@ void MacroAssembler::LoadP(Register dst, const MemOperand& mem, ...@@ -4208,11 +4208,7 @@ void MacroAssembler::LoadP(Register dst, const MemOperand& mem,
/* cannot use d-form */ /* cannot use d-form */
DCHECK(!scratch.is(no_reg)); DCHECK(!scratch.is(no_reg));
mov(scratch, Operand(offset)); mov(scratch, Operand(offset));
#if V8_TARGET_ARCH_PPC64 LoadPX(dst, MemOperand(mem.ra(), scratch));
ldx(dst, MemOperand(mem.ra(), scratch));
#else
lwzx(dst, MemOperand(mem.ra(), scratch));
#endif
} else { } else {
#if V8_TARGET_ARCH_PPC64 #if V8_TARGET_ARCH_PPC64
int misaligned = (offset & 3); int misaligned = (offset & 3);
...@@ -4231,9 +4227,7 @@ void MacroAssembler::LoadP(Register dst, const MemOperand& mem, ...@@ -4231,9 +4227,7 @@ void MacroAssembler::LoadP(Register dst, const MemOperand& mem,
} }
} }
void MacroAssembler::LoadPU(Register dst, const MemOperand& mem,
// Store a "pointer" sized value to the memory location
void MacroAssembler::StoreP(Register src, const MemOperand& mem,
Register scratch) { Register scratch) {
int offset = mem.offset(); int offset = mem.offset();
...@@ -4241,11 +4235,26 @@ void MacroAssembler::StoreP(Register src, const MemOperand& mem, ...@@ -4241,11 +4235,26 @@ void MacroAssembler::StoreP(Register src, const MemOperand& mem,
/* cannot use d-form */ /* cannot use d-form */
DCHECK(!scratch.is(no_reg)); DCHECK(!scratch.is(no_reg));
mov(scratch, Operand(offset)); mov(scratch, Operand(offset));
LoadPUX(dst, MemOperand(mem.ra(), scratch));
} else {
#if V8_TARGET_ARCH_PPC64 #if V8_TARGET_ARCH_PPC64
stdx(src, MemOperand(mem.ra(), scratch)); ldu(dst, mem);
#else #else
stwx(src, MemOperand(mem.ra(), scratch)); lwzu(dst, mem);
#endif #endif
}
}
// Store a "pointer" sized value to the memory location
void MacroAssembler::StoreP(Register src, const MemOperand& mem,
Register scratch) {
int offset = mem.offset();
if (!is_int16(offset)) {
/* cannot use d-form */
DCHECK(!scratch.is(no_reg));
mov(scratch, Operand(offset));
StorePX(src, MemOperand(mem.ra(), scratch));
} else { } else {
#if V8_TARGET_ARCH_PPC64 #if V8_TARGET_ARCH_PPC64
int misaligned = (offset & 3); int misaligned = (offset & 3);
...@@ -4269,6 +4278,24 @@ void MacroAssembler::StoreP(Register src, const MemOperand& mem, ...@@ -4269,6 +4278,24 @@ void MacroAssembler::StoreP(Register src, const MemOperand& mem,
} }
} }
void MacroAssembler::StorePU(Register src, const MemOperand& mem,
Register scratch) {
int offset = mem.offset();
if (!is_int16(offset)) {
/* cannot use d-form */
DCHECK(!scratch.is(no_reg));
mov(scratch, Operand(offset));
StorePUX(src, MemOperand(mem.ra(), scratch));
} else {
#if V8_TARGET_ARCH_PPC64
stdu(src, mem);
#else
stwu(src, mem);
#endif
}
}
void MacroAssembler::LoadWordArith(Register dst, const MemOperand& mem, void MacroAssembler::LoadWordArith(Register dst, const MemOperand& mem,
Register scratch) { Register scratch) {
int offset = mem.offset(); int offset = mem.offset();
......
...@@ -73,10 +73,8 @@ bool AreAliased(Register reg1, Register reg2, Register reg3 = no_reg, ...@@ -73,10 +73,8 @@ bool AreAliased(Register reg1, Register reg2, Register reg3 = no_reg,
// These exist to provide portability between 32 and 64bit // These exist to provide portability between 32 and 64bit
#if V8_TARGET_ARCH_PPC64 #if V8_TARGET_ARCH_PPC64
#define LoadPU ldu
#define LoadPX ldx #define LoadPX ldx
#define LoadPUX ldux #define LoadPUX ldux
#define StorePU stdu
#define StorePX stdx #define StorePX stdx
#define StorePUX stdux #define StorePUX stdux
#define ShiftLeftImm sldi #define ShiftLeftImm sldi
...@@ -90,10 +88,8 @@ bool AreAliased(Register reg1, Register reg2, Register reg3 = no_reg, ...@@ -90,10 +88,8 @@ bool AreAliased(Register reg1, Register reg2, Register reg3 = no_reg,
#define Mul mulld #define Mul mulld
#define Div divd #define Div divd
#else #else
#define LoadPU lwzu
#define LoadPX lwzx #define LoadPX lwzx
#define LoadPUX lwzux #define LoadPUX lwzux
#define StorePU stwu
#define StorePX stwx #define StorePX stwx
#define StorePUX stwux #define StorePUX stwux
#define ShiftLeftImm slwi #define ShiftLeftImm slwi
...@@ -573,7 +569,9 @@ class MacroAssembler : public Assembler { ...@@ -573,7 +569,9 @@ class MacroAssembler : public Assembler {
// These exist to provide portability between 32 and 64bit // These exist to provide portability between 32 and 64bit
void LoadP(Register dst, const MemOperand& mem, Register scratch = no_reg); void LoadP(Register dst, const MemOperand& mem, Register scratch = no_reg);
void LoadPU(Register dst, const MemOperand& mem, Register scratch = no_reg);
void StoreP(Register src, const MemOperand& mem, Register scratch = no_reg); void StoreP(Register src, const MemOperand& mem, Register scratch = no_reg);
void StorePU(Register src, const MemOperand& mem, Register scratch = no_reg);
// --------------------------------------------------------------------------- // ---------------------------------------------------------------------------
// JavaScript invokes // JavaScript invokes
......
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