Chromium Code Reviews| 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); |