| Index: src/ppc/macro-assembler-ppc.cc
|
| diff --git a/src/ppc/macro-assembler-ppc.cc b/src/ppc/macro-assembler-ppc.cc
|
| index 1598f8fee763d28659dc734deb0571360607754d..4ee6323e6616d2384f9c065020c56fe71b23f96c 100644
|
| --- a/src/ppc/macro-assembler-ppc.cc
|
| +++ b/src/ppc/macro-assembler-ppc.cc
|
| @@ -224,30 +224,59 @@ void MacroAssembler::Move(DoubleRegister dst, DoubleRegister src) {
|
| }
|
|
|
|
|
| -void MacroAssembler::MultiPush(RegList regs) {
|
| +void MacroAssembler::MultiPush(RegList regs, Register location) {
|
| int16_t num_to_push = NumberOfBitsSet(regs);
|
| int16_t stack_offset = num_to_push * kPointerSize;
|
|
|
| - subi(sp, sp, Operand(stack_offset));
|
| - for (int16_t i = kNumRegisters - 1; i >= 0; i--) {
|
| + subi(location, location, Operand(stack_offset));
|
| + for (int16_t i = Register::kNumRegisters - 1; i >= 0; i--) {
|
| if ((regs & (1 << i)) != 0) {
|
| stack_offset -= kPointerSize;
|
| - StoreP(ToRegister(i), MemOperand(sp, stack_offset));
|
| + StoreP(ToRegister(i), MemOperand(location, stack_offset));
|
| }
|
| }
|
| }
|
|
|
|
|
| -void MacroAssembler::MultiPop(RegList regs) {
|
| +void MacroAssembler::MultiPop(RegList regs, Register location) {
|
| int16_t stack_offset = 0;
|
|
|
| - for (int16_t i = 0; i < kNumRegisters; i++) {
|
| + for (int16_t i = 0; i < Register::kNumRegisters; i++) {
|
| if ((regs & (1 << i)) != 0) {
|
| - LoadP(ToRegister(i), MemOperand(sp, stack_offset));
|
| + LoadP(ToRegister(i), MemOperand(location, stack_offset));
|
| stack_offset += kPointerSize;
|
| }
|
| }
|
| - addi(sp, sp, Operand(stack_offset));
|
| + addi(location, location, Operand(stack_offset));
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPushDoubles(RegList dregs, Register location) {
|
| + int16_t num_to_push = NumberOfBitsSet(dregs);
|
| + int16_t stack_offset = num_to_push * kDoubleSize;
|
| +
|
| + subi(location, location, Operand(stack_offset));
|
| + for (int16_t i = DoubleRegister::kNumRegisters - 1; i >= 0; i--) {
|
| + if ((dregs & (1 << i)) != 0) {
|
| + DoubleRegister dreg = DoubleRegister::from_code(i);
|
| + stack_offset -= kDoubleSize;
|
| + stfd(dreg, MemOperand(location, stack_offset));
|
| + }
|
| + }
|
| +}
|
| +
|
| +
|
| +void MacroAssembler::MultiPopDoubles(RegList dregs, Register location) {
|
| + int16_t stack_offset = 0;
|
| +
|
| + for (int16_t i = 0; i < DoubleRegister::kNumRegisters; i++) {
|
| + if ((dregs & (1 << i)) != 0) {
|
| + DoubleRegister dreg = DoubleRegister::from_code(i);
|
| + lfd(dreg, MemOperand(location, stack_offset));
|
| + stack_offset += kDoubleSize;
|
| + }
|
| + }
|
| + addi(location, location, Operand(stack_offset));
|
| }
|
|
|
|
|
| @@ -825,7 +854,7 @@ void MacroAssembler::EnterExitFrame(bool save_doubles, int stack_space) {
|
|
|
| // Optionally save all volatile double registers.
|
| if (save_doubles) {
|
| - SaveFPRegs(sp, 0, DoubleRegister::kNumVolatileRegisters);
|
| + MultiPushDoubles(kCallerSavedDoubles);
|
| // Note that d0 will be accessible at
|
| // fp - ExitFrameConstants::kFrameSize -
|
| // kNumVolatileRegisters * kDoubleSize,
|
| @@ -891,7 +920,7 @@ void MacroAssembler::LeaveExitFrame(bool save_doubles, Register argument_count,
|
| const int offset =
|
| (ExitFrameConstants::kFrameSize + kNumRegs * kDoubleSize);
|
| addi(r6, fp, Operand(-offset));
|
| - RestoreFPRegs(r6, 0, kNumRegs);
|
| + MultiPopDoubles(kCallerSavedDoubles, r6);
|
| }
|
|
|
| // Clear top frame.
|
| @@ -2955,28 +2984,6 @@ void MacroAssembler::InitializeFieldsWithFiller(Register start_offset,
|
| }
|
|
|
|
|
| -void MacroAssembler::SaveFPRegs(Register location, int first, int count) {
|
| - DCHECK(count > 0);
|
| - int cur = first;
|
| - subi(location, location, Operand(count * kDoubleSize));
|
| - for (int i = 0; i < count; i++) {
|
| - DoubleRegister reg = DoubleRegister::from_code(cur++);
|
| - stfd(reg, MemOperand(location, i * kDoubleSize));
|
| - }
|
| -}
|
| -
|
| -
|
| -void MacroAssembler::RestoreFPRegs(Register location, int first, int count) {
|
| - DCHECK(count > 0);
|
| - int cur = first + count - 1;
|
| - for (int i = count - 1; i >= 0; i--) {
|
| - DoubleRegister reg = DoubleRegister::from_code(cur--);
|
| - lfd(reg, MemOperand(location, i * kDoubleSize));
|
| - }
|
| - addi(location, location, Operand(count * kDoubleSize));
|
| -}
|
| -
|
| -
|
| void MacroAssembler::JumpIfBothInstanceTypesAreNotSequentialOneByte(
|
| Register first, Register second, Register scratch1, Register scratch2,
|
| Label* failure) {
|
|
|