| Index: src/crankshaft/arm64/lithium-arm64.cc
|
| diff --git a/src/crankshaft/arm64/lithium-arm64.cc b/src/crankshaft/arm64/lithium-arm64.cc
|
| index c12fab833ae7e8f9a3cb640a35a128d74b9c479a..8a9ce4266dd3872cfe82f590ec4889f50c59818e 100644
|
| --- a/src/crankshaft/arm64/lithium-arm64.cc
|
| +++ b/src/crankshaft/arm64/lithium-arm64.cc
|
| @@ -963,6 +963,9 @@ LInstruction* LChunkBuilder::DoBranch(HBranch* instr) {
|
| LInstruction* LChunkBuilder::DoCallWithDescriptor(
|
| HCallWithDescriptor* instr) {
|
| CallInterfaceDescriptor descriptor = instr->descriptor();
|
| + DCHECK_EQ(descriptor.GetParameterCount() +
|
| + LCallWithDescriptor::kImplicitRegisterParameterCount,
|
| + instr->OperandCount());
|
|
|
| LOperand* target = UseRegisterOrConstantAtStart(instr->target());
|
| ZoneList<LOperand*> ops(instr->OperandCount(), zone());
|
| @@ -971,15 +974,30 @@ LInstruction* LChunkBuilder::DoCallWithDescriptor(
|
| // Context
|
| LOperand* op = UseFixed(instr->OperandAt(1), cp);
|
| ops.Add(op, zone());
|
| - // Other register parameters
|
| - for (int i = LCallWithDescriptor::kImplicitRegisterParameterCount;
|
| - i < instr->OperandCount(); i++) {
|
| - op =
|
| - UseFixed(instr->OperandAt(i),
|
| - descriptor.GetRegisterParameter(
|
| - i - LCallWithDescriptor::kImplicitRegisterParameterCount));
|
| + // Load register parameters.
|
| + int i = 0;
|
| + for (; i < descriptor.GetRegisterParameterCount(); i++) {
|
| + op = UseFixed(instr->OperandAt(
|
| + i + LCallWithDescriptor::kImplicitRegisterParameterCount),
|
| + descriptor.GetRegisterParameter(i));
|
| ops.Add(op, zone());
|
| }
|
| + // Push stack parameters.
|
| + if (i < descriptor.GetParameterCount()) {
|
| + int argc = descriptor.GetParameterCount() - i;
|
| + AddInstruction(new (zone()) LPreparePushArguments(argc), instr);
|
| + LPushArguments* push_args = new (zone()) LPushArguments(zone());
|
| + for (; i < descriptor.GetParameterCount(); i++) {
|
| + if (push_args->ShouldSplitPush()) {
|
| + AddInstruction(push_args, instr);
|
| + push_args = new (zone()) LPushArguments(zone());
|
| + }
|
| + op = UseRegisterAtStart(instr->OperandAt(
|
| + i + LCallWithDescriptor::kImplicitRegisterParameterCount));
|
| + push_args->AddArgument(op);
|
| + }
|
| + AddInstruction(push_args, instr);
|
| + }
|
|
|
| LCallWithDescriptor* result = new(zone()) LCallWithDescriptor(descriptor,
|
| ops,
|
|
|