| Index: src/compiler/ppc/code-generator-ppc.cc
|
| diff --git a/src/compiler/ppc/code-generator-ppc.cc b/src/compiler/ppc/code-generator-ppc.cc
|
| index 3d91e68a83d790198d8bb5817e23e8826060002b..4e9f99fb9c3f5a51299c9a21a3f64abdfaa732ea 100644
|
| --- a/src/compiler/ppc/code-generator-ppc.cc
|
| +++ b/src/compiler/ppc/code-generator-ppc.cc
|
| @@ -1296,27 +1296,34 @@ void CodeGenerator::AssemblePrologue() {
|
| int stack_slots = frame()->GetSpillSlotCount();
|
| if (descriptor->kind() == CallDescriptor::kCallAddress) {
|
| __ function_descriptor();
|
| - int register_save_area_size = 0;
|
| - RegList frame_saves = fp.bit();
|
| + RegList frame_saves = 0;
|
| __ mflr(r0);
|
| if (FLAG_enable_embedded_constant_pool) {
|
| __ Push(r0, fp, kConstantPoolRegister);
|
| // Adjust FP to point to saved FP.
|
| __ subi(fp, sp, Operand(StandardFrameConstants::kConstantPoolOffset));
|
| - register_save_area_size += kPointerSize;
|
| frame_saves |= kConstantPoolRegister.bit();
|
| } else {
|
| __ Push(r0, fp);
|
| __ mr(fp, sp);
|
| }
|
| +
|
| // Save callee-saved registers.
|
| const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves;
|
| - for (int i = Register::kNumRegisters - 1; i >= 0; i--) {
|
| - if (!((1 << i) & saves)) continue;
|
| - register_save_area_size += kPointerSize;
|
| - }
|
| - frame()->SetRegisterSaveAreaSize(register_save_area_size);
|
| __ MultiPush(saves);
|
| + // register save area does not include the fp.
|
| + DCHECK(kNumCalleeSaved - 1 ==
|
| + base::bits::CountPopulation32(saves | frame_saves));
|
| + int register_save_area_size = (kNumCalleeSaved - 1) * kPointerSize;
|
| +
|
| + // Save callee-saved Double registers.
|
| + const RegList double_saves = descriptor->CalleeSavedFPRegisters();
|
| + __ MultiPushDoubles(double_saves);
|
| + DCHECK(kNumCalleeSavedDoubles ==
|
| + base::bits::CountPopulation32(double_saves));
|
| + register_save_area_size += kNumCalleeSavedDoubles * kDoubleSize;
|
| +
|
| + frame()->SetRegisterSaveAreaSize(register_save_area_size);
|
| } else if (descriptor->IsJSFunctionCall()) {
|
| CompilationInfo* info = this->info();
|
| __ Prologue(info->IsCodePreAgingActive());
|
| @@ -1359,15 +1366,17 @@ void CodeGenerator::AssembleReturn() {
|
| if (stack_slots > 0) {
|
| __ Add(sp, sp, stack_slots * kPointerSize, r0);
|
| }
|
| + // Restore double registers.
|
| + const RegList double_saves = descriptor->CalleeSavedFPRegisters();
|
| + __ MultiPopDoubles(double_saves);
|
| +
|
| // Restore registers.
|
| - RegList frame_saves = fp.bit();
|
| + RegList frame_saves = 0;
|
| if (FLAG_enable_embedded_constant_pool) {
|
| frame_saves |= kConstantPoolRegister.bit();
|
| }
|
| const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves;
|
| - if (saves != 0) {
|
| - __ MultiPop(saves);
|
| - }
|
| + __ MultiPop(saves);
|
| }
|
| __ LeaveFrame(StackFrame::MANUAL);
|
| __ Ret();
|
|
|