Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(62)

Side by Side Diff: src/compiler/x64/code-generator-x64.cc

Issue 1455833004: [turbofan]: Implement tail calls with more callee than caller parameters (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove stray change Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/code-generator.h" 5 #include "src/compiler/code-generator.h"
6 6
7 #include "src/compiler/code-generator-impl.h" 7 #include "src/compiler/code-generator-impl.h"
8 #include "src/compiler/gap-resolver.h" 8 #include "src/compiler/gap-resolver.h"
9 #include "src/compiler/node-matchers.h" 9 #include "src/compiler/node-matchers.h"
10 #include "src/compiler/osr.h" 10 #include "src/compiler/osr.h"
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Register); \ 568 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Register); \
569 } else { \ 569 } else { \
570 Immediate value = i.InputImmediate(4); \ 570 Immediate value = i.InputImmediate(4); \
571 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Immediate); \ 571 ASSEMBLE_CHECKED_STORE_INTEGER_IMPL(asm_instr, Immediate); \
572 } \ 572 } \
573 } while (false) 573 } while (false)
574 574
575 575
576 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) { 576 void CodeGenerator::AssembleDeconstructActivationRecord(int stack_param_delta) {
577 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor(); 577 CallDescriptor* descriptor = linkage()->GetIncomingDescriptor();
578 int stack_slots = frame()->GetSpillSlotCount(); 578 int spill_slots = frame()->GetSpillSlotCount();
579 if (descriptor->IsJSFunctionCall() || stack_slots > 0) { 579 bool has_frame = descriptor->IsJSFunctionCall() || spill_slots > 0;
580 __ movq(rsp, rbp); 580 if (has_frame) {
581 if (stack_param_delta != 0) {
582 int total_discarded_slots = frame()->GetTotalFrameSlotCount();
583 // Leave the PC and saved frame pointer on the stack.
584 total_discarded_slots -=
585 StandardFrameConstants::kFixedFrameSizeFromFp / kPointerSize;
586 // Discard only slots that won't be used by new parameters.
587 total_discarded_slots -= stack_param_delta;
588 if (total_discarded_slots > 0) {
589 __ addq(rsp, Immediate(total_discarded_slots * kPointerSize));
590 }
591 } else {
592 __ movq(rsp, rbp);
593 }
581 __ popq(rbp); 594 __ popq(rbp);
582 } 595 }
583 if (stack_param_delta < 0) { 596 }
584 int offset = -(stack_param_delta + 1) * kPointerSize; 597
585 __ popq(Operand(rsp, offset)); 598
586 if (offset != 0) { 599 void CodeGenerator::AssemblePrepareTailCall(int stack_param_delta) {
587 __ addq(rsp, Immediate(offset)); 600 if (stack_param_delta > 0) {
601 int total_discarded_slots = frame()->GetTotalFrameSlotCount();
602 // Leave the PC and saved frame pointer on the stack.
603 total_discarded_slots -=
604 StandardFrameConstants::kFixedFrameSizeFromFp / kPointerSize;
605 // Discard only slots that won't be used by new parameters.
606 total_discarded_slots -= stack_param_delta;
607 if (total_discarded_slots < 0) {
608 __ subq(rsp, Immediate(-total_discarded_slots * kPointerSize));
588 } 609 }
589 } 610 }
590 } 611 }
591 612
592 613
593 // Assembles an instruction after register allocation, producing machine code. 614 // Assembles an instruction after register allocation, producing machine code.
594 void CodeGenerator::AssembleArchInstruction(Instruction* instr) { 615 void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
595 X64OperandConverter i(this, instr); 616 X64OperandConverter i(this, instr);
596 617
597 switch (ArchOpcodeField::decode(instr->opcode())) { 618 switch (ArchOpcodeField::decode(instr->opcode())) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 case kArchLazyBailout: { 669 case kArchLazyBailout: {
649 EnsureSpaceForLazyDeopt(); 670 EnsureSpaceForLazyDeopt();
650 RecordCallPosition(instr); 671 RecordCallPosition(instr);
651 break; 672 break;
652 } 673 }
653 case kArchPrepareCallCFunction: { 674 case kArchPrepareCallCFunction: {
654 int const num_parameters = MiscField::decode(instr->opcode()); 675 int const num_parameters = MiscField::decode(instr->opcode());
655 __ PrepareCallCFunction(num_parameters); 676 __ PrepareCallCFunction(num_parameters);
656 break; 677 break;
657 } 678 }
679 case kArchPrepareTailCall:
680 AssemblePrepareTailCall(i.InputInt32(instr->InputCount() - 1));
681 break;
658 case kArchCallCFunction: { 682 case kArchCallCFunction: {
659 int const num_parameters = MiscField::decode(instr->opcode()); 683 int const num_parameters = MiscField::decode(instr->opcode());
660 if (HasImmediateInput(instr, 0)) { 684 if (HasImmediateInput(instr, 0)) {
661 ExternalReference ref = i.InputExternalReference(0); 685 ExternalReference ref = i.InputExternalReference(0);
662 __ CallCFunction(ref, num_parameters); 686 __ CallCFunction(ref, num_parameters);
663 } else { 687 } else {
664 Register func = i.InputRegister(0); 688 Register func = i.InputRegister(0);
665 __ CallCFunction(func, num_parameters); 689 __ CallCFunction(func, num_parameters);
666 } 690 }
667 break; 691 break;
(...skipping 1272 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 1964 int padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
1941 __ Nop(padding_size); 1965 __ Nop(padding_size);
1942 } 1966 }
1943 } 1967 }
1944 1968
1945 #undef __ 1969 #undef __
1946 1970
1947 } // namespace compiler 1971 } // namespace compiler
1948 } // namespace internal 1972 } // namespace internal
1949 } // namespace v8 1973 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698