Index: src/compiler/mips/instruction-selector-mips.cc |
diff --git a/src/compiler/mips/instruction-selector-mips.cc b/src/compiler/mips/instruction-selector-mips.cc |
index afa56da5a7424a0b366233aaac5def84087a9e4a..0d2d96794db1ebacdb581e750d05267bd42bc7dc 100644 |
--- a/src/compiler/mips/instruction-selector-mips.cc |
+++ b/src/compiler/mips/instruction-selector-mips.cc |
@@ -446,15 +446,17 @@ void InstructionSelector::VisitCall(Node* node) { |
// Compute InstructionOperands for inputs and outputs. |
InitializeCallBuffer(node, &buffer, true, false); |
- |
- // TODO(dcarney): might be possible to use claim/poke instead |
- // Push any stack arguments. |
+ // Possibly align stack here for functions. |
+ int push_count = buffer.pushed_nodes.size(); |
+ if (push_count > 0) { |
+ Emit(kMipsStackClaim | MiscField::encode(push_count), NULL); |
+ } |
+ int slot = buffer.pushed_nodes.size() - 1; |
for (NodeVectorRIter input = buffer.pushed_nodes.rbegin(); |
input != buffer.pushed_nodes.rend(); input++) { |
- // TODO(plind): inefficient for MIPS, use MultiPush here. |
- // - Also need to align the stack. See arm64. |
- // - Maybe combine with arg slot stuff in DirectCEntry stub. |
- Emit(kMipsPush, NULL, g.UseRegister(*input)); |
+ Emit(kMipsStoreToStackSlot | MiscField::encode(slot), NULL, |
+ g.UseRegister(*input)); |
+ slot--; |
} |
// Select the appropriate opcode based on the call type. |