Index: src/x64/macro-assembler-x64.cc |
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc |
index b851fec68429b7cf63c50f12a2f794ba42769bc0..d82b8ecf381f9f52fe0941467a036b64c2d20013 100644 |
--- a/src/x64/macro-assembler-x64.cc |
+++ b/src/x64/macro-assembler-x64.cc |
@@ -2641,20 +2641,27 @@ void MacroAssembler::LoadContext(Register dst, int context_chain_length) { |
} |
} |
+ |
int MacroAssembler::ArgumentStackSlotsForCFunctionCall(int num_arguments) { |
// On Windows stack slots are reserved by the caller for all arguments |
- // including the ones passed in registers. On Linux 6 arguments are passed in |
- // registers and the caller does not reserve stack slots for them. |
+ // including the ones passed in registers, and space is alwaysallocated for |
Rico
2010/05/28 08:20:02
always->allocated -> always allocated
|
+ // the four register arguments even if the function takes fewer than four |
+ // arguments. |
+ // On Linux the first six arguments are passed in registers and the caller |
+ // does not reserve stack slots for them. |
ASSERT(num_arguments >= 0); |
#ifdef _WIN64 |
- static const int kArgumentsWithoutStackSlot = 0; |
+ static const int kMinimumStackSlots = 4; |
+ if (num_arguments < kMinimumStackSlots) return kMinimumStackSlots; |
+ return num_arguments; |
#else |
- static const int kArgumentsWithoutStackSlot = 6; |
+ static const int kRegisterPassedArguments = 6; |
+ if (num_arguments < kRegisterPassedArguments) return 0; |
+ return num_arguments - kRegisterPassedArguments; |
#endif |
- return num_arguments > kArgumentsWithoutStackSlot ? |
- num_arguments - kArgumentsWithoutStackSlot : 0; |
} |
+ |
void MacroAssembler::PrepareCallCFunction(int num_arguments) { |
int frame_alignment = OS::ActivationFrameAlignment(); |
ASSERT(frame_alignment != 0); |