break;
case kPPC_PushFrame: {
int num_slots = i.InputInt32(1);
- __ StorePU(i.InputRegister(0), MemOperand(sp, -num_slots * kPointerSize));
+ if (instr->InputAt(0)->IsDoubleRegister()) {
+ __ stfdu(i.InputDoubleRegister(0),
+ MemOperand(sp, -num_slots * kPointerSize));
+ } else {
+ __ StorePU(i.InputRegister(0),
+ MemOperand(sp, -num_slots * kPointerSize));
+ }
break;
}
case kPPC_StoreToStackSlot: {
__ StubPrologue();
frame()->SetRegisterSaveAreaSize(
StandardFrameConstants::kFixedFrameSizeFromFp);
+ } else {
+ frame()->SetPCOnStack(false);
}
if (info()->is_osr()) {
const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves;
__ MultiPop(saves);
}
+ __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
} else if (descriptor->IsJSFunctionCall() || needs_frame_) {
// Canonicalize JSFunction return sites for now.
if (return_label_.is_bound()) {
return;
} else {
__ bind(&return_label_);
+ __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
}
+ } else {
+ __ Drop(pop_count);
}
- __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
__ Ret();
}
int num_slots = static_cast<int>(descriptor->StackParameterCount());
int slot = 0;
for (Node* input : buffer.pushed_nodes) {
- // Skip any alignment holes in pushed nodes.
- if (input == nullptr) continue;
if (slot == 0) {
+ DCHECK(input);
Emit(kPPC_PushFrame, g.NoOutput(), g.UseRegister(input),
g.TempImmediate(num_slots));
} else {
- Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
- g.TempImmediate(slot));
+ // Skip any alignment holes in pushed nodes.
+ if (input) {
+ Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
+ g.TempImmediate(slot));
+ }
}
++slot;
}
InitializeCallBuffer(node, &buffer, true, false);
// Push any stack arguments.
- for (Node* input : base::Reversed(buffer.pushed_nodes)) {
- if (input == nullptr) continue;
- Emit(kPPC_Push, g.NoOutput(), g.UseRegister(input));
+ int num_slots = static_cast<int>(descriptor->StackParameterCount());
+ int slot = 0;
+ for (Node* input : buffer.pushed_nodes) {
+ if (slot == 0) {
+ Emit(kPPC_PushFrame, g.NoOutput(), g.UseRegister(input),
+ g.TempImmediate(num_slots));
+ } else {
+ Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
+ g.TempImmediate(slot));
+ }
+ ++slot;
}
// Select the appropriate opcode based on the call type.