| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 512 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 523 int3(); | 523 int3(); |
| 524 } | 524 } |
| 525 | 525 |
| 526 | 526 |
| 527 void MacroAssembler::CallStub(CodeStub* stub, unsigned ast_id) { | 527 void MacroAssembler::CallStub(CodeStub* stub, unsigned ast_id) { |
| 528 ASSERT(AllowThisStubCall(stub)); // Calls are not allowed in some stubs | 528 ASSERT(AllowThisStubCall(stub)); // Calls are not allowed in some stubs |
| 529 Call(stub->GetCode(), RelocInfo::CODE_TARGET, ast_id); | 529 Call(stub->GetCode(), RelocInfo::CODE_TARGET, ast_id); |
| 530 } | 530 } |
| 531 | 531 |
| 532 | 532 |
| 533 MaybeObject* MacroAssembler::TryCallStub(CodeStub* stub) { | |
| 534 ASSERT(AllowThisStubCall(stub)); // Calls are not allowed in some stubs. | |
| 535 MaybeObject* result = stub->TryGetCode(); | |
| 536 if (!result->IsFailure()) { | |
| 537 call(Handle<Code>(Code::cast(result->ToObjectUnchecked())), | |
| 538 RelocInfo::CODE_TARGET); | |
| 539 } | |
| 540 return result; | |
| 541 } | |
| 542 | |
| 543 | |
| 544 void MacroAssembler::TailCallStub(CodeStub* stub) { | 533 void MacroAssembler::TailCallStub(CodeStub* stub) { |
| 545 ASSERT(allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe()); | 534 ASSERT(allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe()); |
| 546 Jump(stub->GetCode(), RelocInfo::CODE_TARGET); | 535 Jump(stub->GetCode(), RelocInfo::CODE_TARGET); |
| 547 } | 536 } |
| 548 | 537 |
| 549 | 538 |
| 550 MaybeObject* MacroAssembler::TryTailCallStub(CodeStub* stub) { | |
| 551 MaybeObject* result = stub->TryGetCode(); | |
| 552 if (!result->IsFailure()) { | |
| 553 jmp(Handle<Code>(Code::cast(result->ToObjectUnchecked())), | |
| 554 RelocInfo::CODE_TARGET); | |
| 555 } | |
| 556 return result; | |
| 557 } | |
| 558 | |
| 559 | |
| 560 void MacroAssembler::StubReturn(int argc) { | 539 void MacroAssembler::StubReturn(int argc) { |
| 561 ASSERT(argc >= 1 && generating_stub()); | 540 ASSERT(argc >= 1 && generating_stub()); |
| 562 ret((argc - 1) * kPointerSize); | 541 ret((argc - 1) * kPointerSize); |
| 563 } | 542 } |
| 564 | 543 |
| 565 | 544 |
| 566 bool MacroAssembler::AllowThisStubCall(CodeStub* stub) { | 545 bool MacroAssembler::AllowThisStubCall(CodeStub* stub) { |
| 567 if (!has_frame_ && stub->SometimesSetsUpAFrame()) return false; | 546 if (!has_frame_ && stub->SometimesSetsUpAFrame()) return false; |
| 568 return allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe(); | 547 return allow_stub_calls_ || stub->CompilingCallsToThisStubIsGCSafe(); |
| 569 } | 548 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 | 582 |
| 604 void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) { | 583 void MacroAssembler::CallRuntimeSaveDoubles(Runtime::FunctionId id) { |
| 605 const Runtime::Function* function = Runtime::FunctionForId(id); | 584 const Runtime::Function* function = Runtime::FunctionForId(id); |
| 606 Set(rax, function->nargs); | 585 Set(rax, function->nargs); |
| 607 LoadAddress(rbx, ExternalReference(function, isolate())); | 586 LoadAddress(rbx, ExternalReference(function, isolate())); |
| 608 CEntryStub ces(1, kSaveFPRegs); | 587 CEntryStub ces(1, kSaveFPRegs); |
| 609 CallStub(&ces); | 588 CallStub(&ces); |
| 610 } | 589 } |
| 611 | 590 |
| 612 | 591 |
| 613 MaybeObject* MacroAssembler::TryCallRuntime(Runtime::FunctionId id, | |
| 614 int num_arguments) { | |
| 615 return TryCallRuntime(Runtime::FunctionForId(id), num_arguments); | |
| 616 } | |
| 617 | |
| 618 | |
| 619 void MacroAssembler::CallRuntime(const Runtime::Function* f, | 592 void MacroAssembler::CallRuntime(const Runtime::Function* f, |
| 620 int num_arguments) { | 593 int num_arguments) { |
| 621 // If the expected number of arguments of the runtime function is | 594 // If the expected number of arguments of the runtime function is |
| 622 // constant, we check that the actual number of arguments match the | 595 // constant, we check that the actual number of arguments match the |
| 623 // expectation. | 596 // expectation. |
| 624 if (f->nargs >= 0 && f->nargs != num_arguments) { | 597 if (f->nargs >= 0 && f->nargs != num_arguments) { |
| 625 IllegalOperation(num_arguments); | 598 IllegalOperation(num_arguments); |
| 626 return; | 599 return; |
| 627 } | 600 } |
| 628 | 601 |
| 629 // TODO(1236192): Most runtime routines don't need the number of | 602 // TODO(1236192): Most runtime routines don't need the number of |
| 630 // arguments passed in because it is constant. At some point we | 603 // arguments passed in because it is constant. At some point we |
| 631 // should remove this need and make the runtime routine entry code | 604 // should remove this need and make the runtime routine entry code |
| 632 // smarter. | 605 // smarter. |
| 633 Set(rax, num_arguments); | 606 Set(rax, num_arguments); |
| 634 LoadAddress(rbx, ExternalReference(f, isolate())); | 607 LoadAddress(rbx, ExternalReference(f, isolate())); |
| 635 CEntryStub ces(f->result_size); | 608 CEntryStub ces(f->result_size); |
| 636 CallStub(&ces); | 609 CallStub(&ces); |
| 637 } | 610 } |
| 638 | 611 |
| 639 | 612 |
| 640 MaybeObject* MacroAssembler::TryCallRuntime(const Runtime::Function* f, | |
| 641 int num_arguments) { | |
| 642 if (f->nargs >= 0 && f->nargs != num_arguments) { | |
| 643 IllegalOperation(num_arguments); | |
| 644 // Since we did not call the stub, there was no allocation failure. | |
| 645 // Return some non-failure object. | |
| 646 return HEAP->undefined_value(); | |
| 647 } | |
| 648 | |
| 649 // TODO(1236192): Most runtime routines don't need the number of | |
| 650 // arguments passed in because it is constant. At some point we | |
| 651 // should remove this need and make the runtime routine entry code | |
| 652 // smarter. | |
| 653 Set(rax, num_arguments); | |
| 654 LoadAddress(rbx, ExternalReference(f, isolate())); | |
| 655 CEntryStub ces(f->result_size); | |
| 656 return TryCallStub(&ces); | |
| 657 } | |
| 658 | |
| 659 | |
| 660 void MacroAssembler::CallExternalReference(const ExternalReference& ext, | 613 void MacroAssembler::CallExternalReference(const ExternalReference& ext, |
| 661 int num_arguments) { | 614 int num_arguments) { |
| 662 Set(rax, num_arguments); | 615 Set(rax, num_arguments); |
| 663 LoadAddress(rbx, ext); | 616 LoadAddress(rbx, ext); |
| 664 | 617 |
| 665 CEntryStub stub(1); | 618 CEntryStub stub(1); |
| 666 CallStub(&stub); | 619 CallStub(&stub); |
| 667 } | 620 } |
| 668 | 621 |
| 669 | 622 |
| 670 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, | 623 void MacroAssembler::TailCallExternalReference(const ExternalReference& ext, |
| 671 int num_arguments, | 624 int num_arguments, |
| 672 int result_size) { | 625 int result_size) { |
| 673 // ----------- S t a t e ------------- | 626 // ----------- S t a t e ------------- |
| 674 // -- rsp[0] : return address | 627 // -- rsp[0] : return address |
| 675 // -- rsp[8] : argument num_arguments - 1 | 628 // -- rsp[8] : argument num_arguments - 1 |
| 676 // ... | 629 // ... |
| 677 // -- rsp[8 * num_arguments] : argument 0 (receiver) | 630 // -- rsp[8 * num_arguments] : argument 0 (receiver) |
| 678 // ----------------------------------- | 631 // ----------------------------------- |
| 679 | 632 |
| 680 // TODO(1236192): Most runtime routines don't need the number of | 633 // TODO(1236192): Most runtime routines don't need the number of |
| 681 // arguments passed in because it is constant. At some point we | 634 // arguments passed in because it is constant. At some point we |
| 682 // should remove this need and make the runtime routine entry code | 635 // should remove this need and make the runtime routine entry code |
| 683 // smarter. | 636 // smarter. |
| 684 Set(rax, num_arguments); | 637 Set(rax, num_arguments); |
| 685 JumpToExternalReference(ext, result_size); | 638 JumpToExternalReference(ext, result_size); |
| 686 } | 639 } |
| 687 | 640 |
| 688 | 641 |
| 689 MaybeObject* MacroAssembler::TryTailCallExternalReference( | |
| 690 const ExternalReference& ext, int num_arguments, int result_size) { | |
| 691 // ----------- S t a t e ------------- | |
| 692 // -- rsp[0] : return address | |
| 693 // -- rsp[8] : argument num_arguments - 1 | |
| 694 // ... | |
| 695 // -- rsp[8 * num_arguments] : argument 0 (receiver) | |
| 696 // ----------------------------------- | |
| 697 | |
| 698 // TODO(1236192): Most runtime routines don't need the number of | |
| 699 // arguments passed in because it is constant. At some point we | |
| 700 // should remove this need and make the runtime routine entry code | |
| 701 // smarter. | |
| 702 Set(rax, num_arguments); | |
| 703 return TryJumpToExternalReference(ext, result_size); | |
| 704 } | |
| 705 | |
| 706 | |
| 707 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, | 642 void MacroAssembler::TailCallRuntime(Runtime::FunctionId fid, |
| 708 int num_arguments, | 643 int num_arguments, |
| 709 int result_size) { | 644 int result_size) { |
| 710 TailCallExternalReference(ExternalReference(fid, isolate()), | 645 TailCallExternalReference(ExternalReference(fid, isolate()), |
| 711 num_arguments, | 646 num_arguments, |
| 712 result_size); | 647 result_size); |
| 713 } | 648 } |
| 714 | 649 |
| 715 | 650 |
| 716 MaybeObject* MacroAssembler::TryTailCallRuntime(Runtime::FunctionId fid, | |
| 717 int num_arguments, | |
| 718 int result_size) { | |
| 719 return TryTailCallExternalReference(ExternalReference(fid, isolate()), | |
| 720 num_arguments, | |
| 721 result_size); | |
| 722 } | |
| 723 | |
| 724 | |
| 725 static int Offset(ExternalReference ref0, ExternalReference ref1) { | 651 static int Offset(ExternalReference ref0, ExternalReference ref1) { |
| 726 int64_t offset = (ref0.address() - ref1.address()); | 652 int64_t offset = (ref0.address() - ref1.address()); |
| 727 // Check that fits into int. | 653 // Check that fits into int. |
| 728 ASSERT(static_cast<int>(offset) == offset); | 654 ASSERT(static_cast<int>(offset) == offset); |
| 729 return static_cast<int>(offset); | 655 return static_cast<int>(offset); |
| 730 } | 656 } |
| 731 | 657 |
| 732 | 658 |
| 733 void MacroAssembler::PrepareCallApiFunction(int arg_stack_space) { | 659 void MacroAssembler::PrepareCallApiFunction(int arg_stack_space) { |
| 734 #ifdef _WIN64 | 660 #ifdef _WIN64 |
| 735 // We need to prepare a slot for result handle on stack and put | 661 // We need to prepare a slot for result handle on stack and put |
| 736 // a pointer to it into 1st arg register. | 662 // a pointer to it into 1st arg register. |
| 737 EnterApiExitFrame(arg_stack_space + 1); | 663 EnterApiExitFrame(arg_stack_space + 1); |
| 738 | 664 |
| 739 // rcx must be used to pass the pointer to the return value slot. | 665 // rcx must be used to pass the pointer to the return value slot. |
| 740 lea(rcx, StackSpaceOperand(arg_stack_space)); | 666 lea(rcx, StackSpaceOperand(arg_stack_space)); |
| 741 #else | 667 #else |
| 742 EnterApiExitFrame(arg_stack_space); | 668 EnterApiExitFrame(arg_stack_space); |
| 743 #endif | 669 #endif |
| 744 } | 670 } |
| 745 | 671 |
| 746 | 672 |
| 747 MaybeObject* MacroAssembler::TryCallApiFunctionAndReturn( | 673 void MacroAssembler::CallApiFunctionAndReturn(Address function_address, |
| 748 ApiFunction* function, int stack_space) { | 674 int stack_space) { |
| 749 Label empty_result; | 675 Label empty_result; |
| 750 Label prologue; | 676 Label prologue; |
| 751 Label promote_scheduled_exception; | 677 Label promote_scheduled_exception; |
| 752 Label delete_allocated_handles; | 678 Label delete_allocated_handles; |
| 753 Label leave_exit_frame; | 679 Label leave_exit_frame; |
| 754 Label write_back; | 680 Label write_back; |
| 755 | 681 |
| 756 Factory* factory = isolate()->factory(); | 682 Factory* factory = isolate()->factory(); |
| 757 ExternalReference next_address = | 683 ExternalReference next_address = |
| 758 ExternalReference::handle_scope_next_address(); | 684 ExternalReference::handle_scope_next_address(); |
| 759 const int kNextOffset = 0; | 685 const int kNextOffset = 0; |
| 760 const int kLimitOffset = Offset( | 686 const int kLimitOffset = Offset( |
| 761 ExternalReference::handle_scope_limit_address(), | 687 ExternalReference::handle_scope_limit_address(), |
| 762 next_address); | 688 next_address); |
| 763 const int kLevelOffset = Offset( | 689 const int kLevelOffset = Offset( |
| 764 ExternalReference::handle_scope_level_address(), | 690 ExternalReference::handle_scope_level_address(), |
| 765 next_address); | 691 next_address); |
| 766 ExternalReference scheduled_exception_address = | 692 ExternalReference scheduled_exception_address = |
| 767 ExternalReference::scheduled_exception_address(isolate()); | 693 ExternalReference::scheduled_exception_address(isolate()); |
| 768 | 694 |
| 769 // Allocate HandleScope in callee-save registers. | 695 // Allocate HandleScope in callee-save registers. |
| 770 Register prev_next_address_reg = r14; | 696 Register prev_next_address_reg = r14; |
| 771 Register prev_limit_reg = rbx; | 697 Register prev_limit_reg = rbx; |
| 772 Register base_reg = r15; | 698 Register base_reg = r15; |
| 773 movq(base_reg, next_address); | 699 movq(base_reg, next_address); |
| 774 movq(prev_next_address_reg, Operand(base_reg, kNextOffset)); | 700 movq(prev_next_address_reg, Operand(base_reg, kNextOffset)); |
| 775 movq(prev_limit_reg, Operand(base_reg, kLimitOffset)); | 701 movq(prev_limit_reg, Operand(base_reg, kLimitOffset)); |
| 776 addl(Operand(base_reg, kLevelOffset), Immediate(1)); | 702 addl(Operand(base_reg, kLevelOffset), Immediate(1)); |
| 777 // Call the api function! | 703 // Call the api function! |
| 778 movq(rax, | 704 movq(rax, reinterpret_cast<int64_t>(function_address), |
| 779 reinterpret_cast<int64_t>(function->address()), | |
| 780 RelocInfo::RUNTIME_ENTRY); | 705 RelocInfo::RUNTIME_ENTRY); |
| 781 call(rax); | 706 call(rax); |
| 782 | 707 |
| 783 #ifdef _WIN64 | 708 #ifdef _WIN64 |
| 784 // rax keeps a pointer to v8::Handle, unpack it. | 709 // rax keeps a pointer to v8::Handle, unpack it. |
| 785 movq(rax, Operand(rax, 0)); | 710 movq(rax, Operand(rax, 0)); |
| 786 #endif | 711 #endif |
| 787 // Check if the result handle holds 0. | 712 // Check if the result handle holds 0. |
| 788 testq(rax, rax); | 713 testq(rax, rax); |
| 789 j(zero, &empty_result); | 714 j(zero, &empty_result); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 801 | 726 |
| 802 // Check if the function scheduled an exception. | 727 // Check if the function scheduled an exception. |
| 803 movq(rsi, scheduled_exception_address); | 728 movq(rsi, scheduled_exception_address); |
| 804 Cmp(Operand(rsi, 0), factory->the_hole_value()); | 729 Cmp(Operand(rsi, 0), factory->the_hole_value()); |
| 805 j(not_equal, &promote_scheduled_exception); | 730 j(not_equal, &promote_scheduled_exception); |
| 806 | 731 |
| 807 LeaveApiExitFrame(); | 732 LeaveApiExitFrame(); |
| 808 ret(stack_space * kPointerSize); | 733 ret(stack_space * kPointerSize); |
| 809 | 734 |
| 810 bind(&promote_scheduled_exception); | 735 bind(&promote_scheduled_exception); |
| 811 MaybeObject* result = TryTailCallRuntime(Runtime::kPromoteScheduledException, | 736 TailCallRuntime(Runtime::kPromoteScheduledException, 0, 1); |
| 812 0, 1); | |
| 813 if (result->IsFailure()) { | |
| 814 return result; | |
| 815 } | |
| 816 | 737 |
| 817 bind(&empty_result); | 738 bind(&empty_result); |
| 818 // It was zero; the result is undefined. | 739 // It was zero; the result is undefined. |
| 819 Move(rax, factory->undefined_value()); | 740 Move(rax, factory->undefined_value()); |
| 820 jmp(&prologue); | 741 jmp(&prologue); |
| 821 | 742 |
| 822 // HandleScope limit has changed. Delete allocated extensions. | 743 // HandleScope limit has changed. Delete allocated extensions. |
| 823 bind(&delete_allocated_handles); | 744 bind(&delete_allocated_handles); |
| 824 movq(Operand(base_reg, kLimitOffset), prev_limit_reg); | 745 movq(Operand(base_reg, kLimitOffset), prev_limit_reg); |
| 825 movq(prev_limit_reg, rax); | 746 movq(prev_limit_reg, rax); |
| 826 #ifdef _WIN64 | 747 #ifdef _WIN64 |
| 827 LoadAddress(rcx, ExternalReference::isolate_address()); | 748 LoadAddress(rcx, ExternalReference::isolate_address()); |
| 828 #else | 749 #else |
| 829 LoadAddress(rdi, ExternalReference::isolate_address()); | 750 LoadAddress(rdi, ExternalReference::isolate_address()); |
| 830 #endif | 751 #endif |
| 831 LoadAddress(rax, | 752 LoadAddress(rax, |
| 832 ExternalReference::delete_handle_scope_extensions(isolate())); | 753 ExternalReference::delete_handle_scope_extensions(isolate())); |
| 833 call(rax); | 754 call(rax); |
| 834 movq(rax, prev_limit_reg); | 755 movq(rax, prev_limit_reg); |
| 835 jmp(&leave_exit_frame); | 756 jmp(&leave_exit_frame); |
| 836 | |
| 837 return result; | |
| 838 } | 757 } |
| 839 | 758 |
| 840 | 759 |
| 841 void MacroAssembler::JumpToExternalReference(const ExternalReference& ext, | 760 void MacroAssembler::JumpToExternalReference(const ExternalReference& ext, |
| 842 int result_size) { | 761 int result_size) { |
| 843 // Set the entry point and jump to the C entry runtime stub. | 762 // Set the entry point and jump to the C entry runtime stub. |
| 844 LoadAddress(rbx, ext); | 763 LoadAddress(rbx, ext); |
| 845 CEntryStub ces(result_size); | 764 CEntryStub ces(result_size); |
| 846 jmp(ces.GetCode(), RelocInfo::CODE_TARGET); | 765 jmp(ces.GetCode(), RelocInfo::CODE_TARGET); |
| 847 } | 766 } |
| 848 | 767 |
| 849 | 768 |
| 850 MaybeObject* MacroAssembler::TryJumpToExternalReference( | |
| 851 const ExternalReference& ext, int result_size) { | |
| 852 // Set the entry point and jump to the C entry runtime stub. | |
| 853 LoadAddress(rbx, ext); | |
| 854 CEntryStub ces(result_size); | |
| 855 return TryTailCallStub(&ces); | |
| 856 } | |
| 857 | |
| 858 | |
| 859 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, | 769 void MacroAssembler::InvokeBuiltin(Builtins::JavaScript id, |
| 860 InvokeFlag flag, | 770 InvokeFlag flag, |
| 861 const CallWrapper& call_wrapper) { | 771 const CallWrapper& call_wrapper) { |
| 862 // You can't call a builtin without a valid frame. | 772 // You can't call a builtin without a valid frame. |
| 863 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 773 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
| 864 | 774 |
| 865 // Rely on the assertion to check that the number of provided | 775 // Rely on the assertion to check that the number of provided |
| 866 // arguments match the expected number of arguments. Fake a | 776 // arguments match the expected number of arguments. Fake a |
| 867 // parameter count to avoid emitting code to do the check. | 777 // parameter count to avoid emitting code to do the check. |
| 868 ParameterCount expected(0); | 778 ParameterCount expected(0); |
| (...skipping 2236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3105 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); | 3015 FieldOperand(rdx, SharedFunctionInfo::kFormalParameterCountOffset)); |
| 3106 // Advances rdx to the end of the Code object header, to the start of | 3016 // Advances rdx to the end of the Code object header, to the start of |
| 3107 // the executable code. | 3017 // the executable code. |
| 3108 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 3018 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
| 3109 | 3019 |
| 3110 ParameterCount expected(rbx); | 3020 ParameterCount expected(rbx); |
| 3111 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); | 3021 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); |
| 3112 } | 3022 } |
| 3113 | 3023 |
| 3114 | 3024 |
| 3115 void MacroAssembler::InvokeFunction(JSFunction* function, | 3025 void MacroAssembler::InvokeFunction(Handle<JSFunction> function, |
| 3116 const ParameterCount& actual, | 3026 const ParameterCount& actual, |
| 3117 InvokeFlag flag, | 3027 InvokeFlag flag, |
| 3118 const CallWrapper& call_wrapper, | 3028 const CallWrapper& call_wrapper, |
| 3119 CallKind call_kind) { | 3029 CallKind call_kind) { |
| 3120 // You can't call a function without a valid frame. | 3030 // You can't call a function without a valid frame. |
| 3121 ASSERT(flag == JUMP_FUNCTION || has_frame()); | 3031 ASSERT(flag == JUMP_FUNCTION || has_frame()); |
| 3122 | 3032 |
| 3123 // Get the function and setup the context. | 3033 // Get the function and setup the context. |
| 3124 Move(rdi, Handle<JSFunction>(function)); | 3034 Move(rdi, function); |
| 3125 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); | 3035 movq(rsi, FieldOperand(rdi, JSFunction::kContextOffset)); |
| 3126 | 3036 |
| 3127 // We call indirectly through the code field in the function to | 3037 // We call indirectly through the code field in the function to |
| 3128 // allow recompilation to take effect without changing any of the | 3038 // allow recompilation to take effect without changing any of the |
| 3129 // call sites. | 3039 // call sites. |
| 3130 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); | 3040 movq(rdx, FieldOperand(rdi, JSFunction::kCodeEntryOffset)); |
| 3131 ParameterCount expected(function->shared()->formal_parameter_count()); | 3041 ParameterCount expected(function->shared()->formal_parameter_count()); |
| 3132 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); | 3042 InvokeCode(rdx, expected, actual, flag, call_wrapper, call_kind); |
| 3133 } | 3043 } |
| 3134 | 3044 |
| (...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4314 | 4224 |
| 4315 and_(bitmap_scratch, Immediate(~Page::kPageAlignmentMask)); | 4225 and_(bitmap_scratch, Immediate(~Page::kPageAlignmentMask)); |
| 4316 addl(Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset), length); | 4226 addl(Operand(bitmap_scratch, MemoryChunk::kLiveBytesOffset), length); |
| 4317 | 4227 |
| 4318 bind(&done); | 4228 bind(&done); |
| 4319 } | 4229 } |
| 4320 | 4230 |
| 4321 } } // namespace v8::internal | 4231 } } // namespace v8::internal |
| 4322 | 4232 |
| 4323 #endif // V8_TARGET_ARCH_X64 | 4233 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |