Index: src/compiler/ppc/instruction-selector-ppc.cc |
diff --git a/src/compiler/ppc/instruction-selector-ppc.cc b/src/compiler/ppc/instruction-selector-ppc.cc |
index a0bfb24cc62f1acd01e563230e62dc1b5038f349..58e4cd98ac03cd62f84b590367c4e0a20a1eb739 100644 |
--- a/src/compiler/ppc/instruction-selector-ppc.cc |
+++ b/src/compiler/ppc/instruction-selector-ppc.cc |
@@ -1481,23 +1481,10 @@ void InstructionSelector::VisitFloat64LessThanOrEqual(Node* node) { |
} |
-void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
+void InstructionSelector::EmitPrepareArguments(NodeVector* arguments, |
+ const CallDescriptor* descriptor, |
+ Node* node) { |
PPCOperandGenerator g(this); |
- const CallDescriptor* descriptor = OpParameter<const CallDescriptor*>(node); |
- |
- FrameStateDescriptor* frame_state_descriptor = nullptr; |
- if (descriptor->NeedsFrameState()) { |
- frame_state_descriptor = |
- GetFrameStateDescriptor(node->InputAt(descriptor->InputCount())); |
- } |
- |
- CallBuffer buffer(zone(), descriptor, frame_state_descriptor); |
- |
- // Compute InstructionOperands for inputs and outputs. |
- // TODO(turbofan): on PPC it's probably better to use the code object in a |
- // register if there are multiple uses of it. Improve constant pool and the |
- // heuristics in the register allocator for where to emit constants. |
- InitializeCallBuffer(node, &buffer, true, true); |
// Prepare for C function call. |
if (descriptor->IsCFunctionCall()) { |
@@ -1507,7 +1494,7 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
// Poke any stack arguments. |
int slot = kStackFrameExtraParamSlot; |
- for (Node* node : buffer.pushed_nodes) { |
+ for (Node* node : (*arguments)) { |
Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(node), |
g.TempImmediate(slot)); |
++slot; |
@@ -1516,7 +1503,7 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
// Push any stack arguments. |
int num_slots = static_cast<int>(descriptor->StackParameterCount()); |
int slot = 0; |
- for (Node* input : buffer.pushed_nodes) { |
+ for (Node* input : (*arguments)) { |
if (slot == 0) { |
DCHECK(input); |
Emit(kPPC_PushFrame, g.NoOutput(), g.UseRegister(input), |
@@ -1531,43 +1518,6 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) { |
++slot; |
} |
} |
- |
- // Pass label of exception handler block. |
- CallDescriptor::Flags flags = descriptor->flags(); |
- if (handler) { |
- DCHECK_EQ(IrOpcode::kIfException, handler->front()->opcode()); |
- IfExceptionHint hint = OpParameter<IfExceptionHint>(handler->front()); |
- if (hint == IfExceptionHint::kLocallyCaught) { |
- flags |= CallDescriptor::kHasLocalCatchHandler; |
- } |
- flags |= CallDescriptor::kHasExceptionHandler; |
- buffer.instruction_args.push_back(g.Label(handler)); |
- } |
- |
- // Select the appropriate opcode based on the call type. |
- InstructionCode opcode = kArchNop; |
- switch (descriptor->kind()) { |
- case CallDescriptor::kCallAddress: |
- opcode = |
- kArchCallCFunction | |
- MiscField::encode(static_cast<int>(descriptor->CParameterCount())); |
- break; |
- case CallDescriptor::kCallCodeObject: |
- opcode = kArchCallCodeObject | MiscField::encode(flags); |
- break; |
- case CallDescriptor::kCallJSFunction: |
- opcode = kArchCallJSFunction | MiscField::encode(flags); |
- break; |
- case CallDescriptor::kLazyBailout: |
- opcode = kArchLazyBailout | MiscField::encode(flags); |
- break; |
- } |
- |
- // Emit the call instruction. |
- size_t const output_count = buffer.outputs.size(); |
- auto* outputs = output_count ? &buffer.outputs.front() : nullptr; |
- Emit(opcode, output_count, outputs, buffer.instruction_args.size(), |
- &buffer.instruction_args.front())->MarkAsCall(); |
} |