OLD | NEW |
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2009 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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 } | 282 } |
283 | 283 |
284 // Code generation state must be reset. | 284 // Code generation state must be reset. |
285 ASSERT(!has_cc()); | 285 ASSERT(!has_cc()); |
286 ASSERT(state_ == NULL); | 286 ASSERT(state_ == NULL); |
287 ASSERT(!function_return_is_shadowed_); | 287 ASSERT(!function_return_is_shadowed_); |
288 function_return_.Unuse(); | 288 function_return_.Unuse(); |
289 DeleteFrame(); | 289 DeleteFrame(); |
290 | 290 |
291 // Process any deferred code using the register allocator. | 291 // Process any deferred code using the register allocator. |
292 if (HasStackOverflow()) { | 292 if (!HasStackOverflow()) { |
293 ClearDeferred(); | |
294 } else { | |
295 ProcessDeferred(); | 293 ProcessDeferred(); |
296 } | 294 } |
297 | 295 |
298 allocator_ = NULL; | 296 allocator_ = NULL; |
299 scope_ = NULL; | 297 scope_ = NULL; |
300 } | 298 } |
301 | 299 |
302 | 300 |
303 MemOperand CodeGenerator::SlotOperand(Slot* slot, Register tmp) { | 301 MemOperand CodeGenerator::SlotOperand(Slot* slot, Register tmp) { |
304 // Currently, this assertion will fail if we try to assign to | 302 // Currently, this assertion will fail if we try to assign to |
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 default: | 748 default: |
751 // Other cases should have been handled before this point. | 749 // Other cases should have been handled before this point. |
752 UNREACHABLE(); | 750 UNREACHABLE(); |
753 break; | 751 break; |
754 } | 752 } |
755 } | 753 } |
756 | 754 |
757 | 755 |
758 class DeferredInlineSmiOperation: public DeferredCode { | 756 class DeferredInlineSmiOperation: public DeferredCode { |
759 public: | 757 public: |
760 DeferredInlineSmiOperation(CodeGenerator* generator, | 758 DeferredInlineSmiOperation(Token::Value op, |
761 Token::Value op, | |
762 int value, | 759 int value, |
763 bool reversed, | 760 bool reversed, |
764 OverwriteMode overwrite_mode) | 761 OverwriteMode overwrite_mode) |
765 : DeferredCode(generator), | 762 : op_(op), |
766 op_(op), | |
767 value_(value), | 763 value_(value), |
768 reversed_(reversed), | 764 reversed_(reversed), |
769 overwrite_mode_(overwrite_mode) { | 765 overwrite_mode_(overwrite_mode) { |
770 set_comment("[ DeferredInlinedSmiOperation"); | 766 set_comment("[ DeferredInlinedSmiOperation"); |
771 } | 767 } |
772 | 768 |
773 virtual void Generate(); | 769 virtual void Generate(); |
774 | 770 |
775 private: | 771 private: |
776 Token::Value op_; | 772 Token::Value op_; |
777 int value_; | 773 int value_; |
778 bool reversed_; | 774 bool reversed_; |
779 OverwriteMode overwrite_mode_; | 775 OverwriteMode overwrite_mode_; |
780 }; | 776 }; |
781 | 777 |
782 | 778 |
| 779 #undef __ |
| 780 #define __ ACCESS_MASM(masm) |
| 781 |
| 782 |
783 void DeferredInlineSmiOperation::Generate() { | 783 void DeferredInlineSmiOperation::Generate() { |
| 784 MacroAssembler* masm = cgen()->masm(); |
784 enter()->Bind(); | 785 enter()->Bind(); |
785 VirtualFrame::SpilledScope spilled_scope; | 786 VirtualFrame::SpilledScope spilled_scope; |
786 | 787 |
787 switch (op_) { | 788 switch (op_) { |
788 case Token::ADD: { | 789 case Token::ADD: { |
789 if (reversed_) { | 790 if (reversed_) { |
790 // revert optimistic add | 791 // revert optimistic add |
791 __ sub(r0, r0, Operand(Smi::FromInt(value_))); | 792 __ sub(r0, r0, Operand(Smi::FromInt(value_))); |
792 __ mov(r1, Operand(Smi::FromInt(value_))); | 793 __ mov(r1, Operand(Smi::FromInt(value_))); |
793 } else { | 794 } else { |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
834 break; | 835 break; |
835 } | 836 } |
836 | 837 |
837 default: | 838 default: |
838 // other cases should have been handled before this point. | 839 // other cases should have been handled before this point. |
839 UNREACHABLE(); | 840 UNREACHABLE(); |
840 break; | 841 break; |
841 } | 842 } |
842 | 843 |
843 GenericBinaryOpStub igostub(op_, overwrite_mode_); | 844 GenericBinaryOpStub igostub(op_, overwrite_mode_); |
844 Result arg0 = generator()->allocator()->Allocate(r1); | 845 Result arg0 = cgen()->allocator()->Allocate(r1); |
845 ASSERT(arg0.is_valid()); | 846 ASSERT(arg0.is_valid()); |
846 Result arg1 = generator()->allocator()->Allocate(r0); | 847 Result arg1 = cgen()->allocator()->Allocate(r0); |
847 ASSERT(arg1.is_valid()); | 848 ASSERT(arg1.is_valid()); |
848 generator()->frame()->CallStub(&igostub, &arg0, &arg1); | 849 cgen()->frame()->CallStub(&igostub, &arg0, &arg1); |
849 exit_.Jump(); | 850 exit_.Jump(); |
850 } | 851 } |
851 | 852 |
852 | 853 |
| 854 #undef __ |
| 855 #define __ ACCESS_MASM(masm_) |
| 856 |
| 857 |
853 void CodeGenerator::SmiOperation(Token::Value op, | 858 void CodeGenerator::SmiOperation(Token::Value op, |
854 Handle<Object> value, | 859 Handle<Object> value, |
855 bool reversed, | 860 bool reversed, |
856 OverwriteMode mode) { | 861 OverwriteMode mode) { |
857 VirtualFrame::SpilledScope spilled_scope; | 862 VirtualFrame::SpilledScope spilled_scope; |
858 // NOTE: This is an attempt to inline (a bit) more of the code for | 863 // NOTE: This is an attempt to inline (a bit) more of the code for |
859 // some possible smi operations (like + and -) when (at least) one | 864 // some possible smi operations (like + and -) when (at least) one |
860 // of the operands is a literal smi. With this optimization, the | 865 // of the operands is a literal smi. With this optimization, the |
861 // performance of the system is increased by ~15%, and the generated | 866 // performance of the system is increased by ~15%, and the generated |
862 // code size is increased by ~1% (measured on a combination of | 867 // code size is increased by ~1% (measured on a combination of |
863 // different benchmarks). | 868 // different benchmarks). |
864 | 869 |
865 // sp[0] : operand | 870 // sp[0] : operand |
866 | 871 |
867 int int_value = Smi::cast(*value)->value(); | 872 int int_value = Smi::cast(*value)->value(); |
868 | 873 |
869 JumpTarget exit; | 874 JumpTarget exit; |
870 frame_->EmitPop(r0); | 875 frame_->EmitPop(r0); |
871 | 876 |
872 switch (op) { | 877 switch (op) { |
873 case Token::ADD: { | 878 case Token::ADD: { |
874 DeferredCode* deferred = | 879 DeferredCode* deferred = |
875 new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); | 880 new DeferredInlineSmiOperation(op, int_value, reversed, mode); |
876 | 881 |
877 __ add(r0, r0, Operand(value), SetCC); | 882 __ add(r0, r0, Operand(value), SetCC); |
878 deferred->enter()->Branch(vs); | 883 deferred->enter()->Branch(vs); |
879 __ tst(r0, Operand(kSmiTagMask)); | 884 __ tst(r0, Operand(kSmiTagMask)); |
880 deferred->enter()->Branch(ne); | 885 deferred->enter()->Branch(ne); |
881 deferred->BindExit(); | 886 deferred->BindExit(); |
882 break; | 887 break; |
883 } | 888 } |
884 | 889 |
885 case Token::SUB: { | 890 case Token::SUB: { |
886 DeferredCode* deferred = | 891 DeferredCode* deferred = |
887 new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); | 892 new DeferredInlineSmiOperation(op, int_value, reversed, mode); |
888 | 893 |
889 if (!reversed) { | 894 if (!reversed) { |
890 __ sub(r0, r0, Operand(value), SetCC); | 895 __ sub(r0, r0, Operand(value), SetCC); |
891 } else { | 896 } else { |
892 __ rsb(r0, r0, Operand(value), SetCC); | 897 __ rsb(r0, r0, Operand(value), SetCC); |
893 } | 898 } |
894 deferred->enter()->Branch(vs); | 899 deferred->enter()->Branch(vs); |
895 __ tst(r0, Operand(kSmiTagMask)); | 900 __ tst(r0, Operand(kSmiTagMask)); |
896 deferred->enter()->Branch(ne); | 901 deferred->enter()->Branch(ne); |
897 deferred->BindExit(); | 902 deferred->BindExit(); |
898 break; | 903 break; |
899 } | 904 } |
900 | 905 |
901 case Token::BIT_OR: | 906 case Token::BIT_OR: |
902 case Token::BIT_XOR: | 907 case Token::BIT_XOR: |
903 case Token::BIT_AND: { | 908 case Token::BIT_AND: { |
904 DeferredCode* deferred = | 909 DeferredCode* deferred = |
905 new DeferredInlineSmiOperation(this, op, int_value, reversed, mode); | 910 new DeferredInlineSmiOperation(op, int_value, reversed, mode); |
906 __ tst(r0, Operand(kSmiTagMask)); | 911 __ tst(r0, Operand(kSmiTagMask)); |
907 deferred->enter()->Branch(ne); | 912 deferred->enter()->Branch(ne); |
908 switch (op) { | 913 switch (op) { |
909 case Token::BIT_OR: __ orr(r0, r0, Operand(value)); break; | 914 case Token::BIT_OR: __ orr(r0, r0, Operand(value)); break; |
910 case Token::BIT_XOR: __ eor(r0, r0, Operand(value)); break; | 915 case Token::BIT_XOR: __ eor(r0, r0, Operand(value)); break; |
911 case Token::BIT_AND: __ and_(r0, r0, Operand(value)); break; | 916 case Token::BIT_AND: __ and_(r0, r0, Operand(value)); break; |
912 default: UNREACHABLE(); | 917 default: UNREACHABLE(); |
913 } | 918 } |
914 deferred->BindExit(); | 919 deferred->BindExit(); |
915 break; | 920 break; |
916 } | 921 } |
917 | 922 |
918 case Token::SHL: | 923 case Token::SHL: |
919 case Token::SHR: | 924 case Token::SHR: |
920 case Token::SAR: { | 925 case Token::SAR: { |
921 if (reversed) { | 926 if (reversed) { |
922 __ mov(ip, Operand(value)); | 927 __ mov(ip, Operand(value)); |
923 frame_->EmitPush(ip); | 928 frame_->EmitPush(ip); |
924 frame_->EmitPush(r0); | 929 frame_->EmitPush(r0); |
925 GenericBinaryOperation(op, mode); | 930 GenericBinaryOperation(op, mode); |
926 | 931 |
927 } else { | 932 } else { |
928 int shift_value = int_value & 0x1f; // least significant 5 bits | 933 int shift_value = int_value & 0x1f; // least significant 5 bits |
929 DeferredCode* deferred = | 934 DeferredCode* deferred = |
930 new DeferredInlineSmiOperation(this, op, shift_value, false, mode); | 935 new DeferredInlineSmiOperation(op, shift_value, false, mode); |
931 __ tst(r0, Operand(kSmiTagMask)); | 936 __ tst(r0, Operand(kSmiTagMask)); |
932 deferred->enter()->Branch(ne); | 937 deferred->enter()->Branch(ne); |
933 __ mov(r2, Operand(r0, ASR, kSmiTagSize)); // remove tags | 938 __ mov(r2, Operand(r0, ASR, kSmiTagSize)); // remove tags |
934 switch (op) { | 939 switch (op) { |
935 case Token::SHL: { | 940 case Token::SHL: { |
936 __ mov(r2, Operand(r2, LSL, shift_value)); | 941 __ mov(r2, Operand(r2, LSL, shift_value)); |
937 // check that the *unsigned* result fits in a smi | 942 // check that the *unsigned* result fits in a smi |
938 __ add(r3, r2, Operand(0x40000000), SetCC); | 943 __ add(r3, r2, Operand(0x40000000), SetCC); |
939 deferred->enter()->Branch(mi); | 944 deferred->enter()->Branch(mi); |
940 break; | 945 break; |
(...skipping 1706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2647 ASSERT(frame_->height() == original_height + 1); | 2652 ASSERT(frame_->height() == original_height + 1); |
2648 } | 2653 } |
2649 | 2654 |
2650 | 2655 |
2651 // This deferred code stub will be used for creating the boilerplate | 2656 // This deferred code stub will be used for creating the boilerplate |
2652 // by calling Runtime_CreateObjectLiteralBoilerplate. | 2657 // by calling Runtime_CreateObjectLiteralBoilerplate. |
2653 // Each created boilerplate is stored in the JSFunction and they are | 2658 // Each created boilerplate is stored in the JSFunction and they are |
2654 // therefore context dependent. | 2659 // therefore context dependent. |
2655 class DeferredObjectLiteral: public DeferredCode { | 2660 class DeferredObjectLiteral: public DeferredCode { |
2656 public: | 2661 public: |
2657 DeferredObjectLiteral(CodeGenerator* generator, ObjectLiteral* node) | 2662 DeferredObjectLiteral(ObjectLiteral* node) : node_(node) { |
2658 : DeferredCode(generator), node_(node) { | |
2659 set_comment("[ DeferredObjectLiteral"); | 2663 set_comment("[ DeferredObjectLiteral"); |
2660 } | 2664 } |
2661 | 2665 |
2662 virtual void Generate(); | 2666 virtual void Generate(); |
2663 | 2667 |
2664 private: | 2668 private: |
2665 ObjectLiteral* node_; | 2669 ObjectLiteral* node_; |
2666 }; | 2670 }; |
2667 | 2671 |
2668 | 2672 |
| 2673 #undef __ |
| 2674 #define __ ACCESS_MASM(masm) |
| 2675 |
| 2676 |
2669 void DeferredObjectLiteral::Generate() { | 2677 void DeferredObjectLiteral::Generate() { |
| 2678 MacroAssembler* masm = cgen()->masm(); |
2670 // Argument is passed in r1. | 2679 // Argument is passed in r1. |
2671 enter()->Bind(); | 2680 enter()->Bind(); |
2672 VirtualFrame::SpilledScope spilled_scope; | 2681 VirtualFrame::SpilledScope spilled_scope; |
2673 | 2682 |
2674 // If the entry is undefined we call the runtime system to compute | 2683 // If the entry is undefined we call the runtime system to compute |
2675 // the literal. | 2684 // the literal. |
2676 | 2685 |
2677 VirtualFrame* frame = generator()->frame(); | 2686 VirtualFrame* frame = cgen()->frame(); |
2678 // Literal array (0). | 2687 // Literal array (0). |
2679 frame->EmitPush(r1); | 2688 frame->EmitPush(r1); |
2680 // Literal index (1). | 2689 // Literal index (1). |
2681 __ mov(r0, Operand(Smi::FromInt(node_->literal_index()))); | 2690 __ mov(r0, Operand(Smi::FromInt(node_->literal_index()))); |
2682 frame->EmitPush(r0); | 2691 frame->EmitPush(r0); |
2683 // Constant properties (2). | 2692 // Constant properties (2). |
2684 __ mov(r0, Operand(node_->constant_properties())); | 2693 __ mov(r0, Operand(node_->constant_properties())); |
2685 frame->EmitPush(r0); | 2694 frame->EmitPush(r0); |
2686 Result boilerplate = | 2695 Result boilerplate = |
2687 frame->CallRuntime(Runtime::kCreateObjectLiteralBoilerplate, 3); | 2696 frame->CallRuntime(Runtime::kCreateObjectLiteralBoilerplate, 3); |
2688 __ mov(r2, Operand(boilerplate.reg())); | 2697 __ mov(r2, Operand(boilerplate.reg())); |
2689 // Result is returned in r2. | 2698 // Result is returned in r2. |
2690 exit_.Jump(); | 2699 exit_.Jump(); |
2691 } | 2700 } |
2692 | 2701 |
2693 | 2702 |
| 2703 #undef __ |
| 2704 #define __ ACCESS_MASM(masm_) |
| 2705 |
| 2706 |
2694 void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { | 2707 void CodeGenerator::VisitObjectLiteral(ObjectLiteral* node) { |
2695 #ifdef DEBUG | 2708 #ifdef DEBUG |
2696 int original_height = frame_->height(); | 2709 int original_height = frame_->height(); |
2697 #endif | 2710 #endif |
2698 VirtualFrame::SpilledScope spilled_scope; | 2711 VirtualFrame::SpilledScope spilled_scope; |
2699 Comment cmnt(masm_, "[ ObjectLiteral"); | 2712 Comment cmnt(masm_, "[ ObjectLiteral"); |
2700 | 2713 |
2701 DeferredObjectLiteral* deferred = new DeferredObjectLiteral(this, node); | 2714 DeferredObjectLiteral* deferred = new DeferredObjectLiteral(node); |
2702 | 2715 |
2703 // Retrieve the literal array and check the allocated entry. | 2716 // Retrieve the literal array and check the allocated entry. |
2704 | 2717 |
2705 // Load the function of this activation. | 2718 // Load the function of this activation. |
2706 __ ldr(r1, frame_->Function()); | 2719 __ ldr(r1, frame_->Function()); |
2707 | 2720 |
2708 // Load the literals array of the function. | 2721 // Load the literals array of the function. |
2709 __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset)); | 2722 __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset)); |
2710 | 2723 |
2711 // Load the literal at the ast saved index. | 2724 // Load the literal at the ast saved index. |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2776 ASSERT(frame_->height() == original_height + 1); | 2789 ASSERT(frame_->height() == original_height + 1); |
2777 } | 2790 } |
2778 | 2791 |
2779 | 2792 |
2780 // This deferred code stub will be used for creating the boilerplate | 2793 // This deferred code stub will be used for creating the boilerplate |
2781 // by calling Runtime_CreateArrayLiteralBoilerplate. | 2794 // by calling Runtime_CreateArrayLiteralBoilerplate. |
2782 // Each created boilerplate is stored in the JSFunction and they are | 2795 // Each created boilerplate is stored in the JSFunction and they are |
2783 // therefore context dependent. | 2796 // therefore context dependent. |
2784 class DeferredArrayLiteral: public DeferredCode { | 2797 class DeferredArrayLiteral: public DeferredCode { |
2785 public: | 2798 public: |
2786 DeferredArrayLiteral(CodeGenerator* generator, ArrayLiteral* node) | 2799 DeferredArrayLiteral(ArrayLiteral* node) : node_(node) { |
2787 : DeferredCode(generator), node_(node) { | |
2788 set_comment("[ DeferredArrayLiteral"); | 2800 set_comment("[ DeferredArrayLiteral"); |
2789 } | 2801 } |
2790 | 2802 |
2791 virtual void Generate(); | 2803 virtual void Generate(); |
2792 | 2804 |
2793 private: | 2805 private: |
2794 ArrayLiteral* node_; | 2806 ArrayLiteral* node_; |
2795 }; | 2807 }; |
2796 | 2808 |
2797 | 2809 |
| 2810 #undef __ |
| 2811 #define __ ACCESS_MASM(masm) |
| 2812 |
| 2813 |
2798 void DeferredArrayLiteral::Generate() { | 2814 void DeferredArrayLiteral::Generate() { |
| 2815 MacroAssembler* masm = cgen()->masm(); |
2799 // Argument is passed in r1. | 2816 // Argument is passed in r1. |
2800 enter()->Bind(); | 2817 enter()->Bind(); |
2801 VirtualFrame::SpilledScope spilled_scope; | 2818 VirtualFrame::SpilledScope spilled_scope; |
2802 | 2819 |
2803 // If the entry is undefined we call the runtime system to computed | 2820 // If the entry is undefined we call the runtime system to computed |
2804 // the literal. | 2821 // the literal. |
2805 | 2822 |
2806 VirtualFrame* frame = generator()->frame(); | 2823 VirtualFrame* frame = cgen()->frame(); |
2807 // Literal array (0). | 2824 // Literal array (0). |
2808 frame->EmitPush(r1); | 2825 frame->EmitPush(r1); |
2809 // Literal index (1). | 2826 // Literal index (1). |
2810 __ mov(r0, Operand(Smi::FromInt(node_->literal_index()))); | 2827 __ mov(r0, Operand(Smi::FromInt(node_->literal_index()))); |
2811 frame->EmitPush(r0); | 2828 frame->EmitPush(r0); |
2812 // Constant properties (2). | 2829 // Constant properties (2). |
2813 __ mov(r0, Operand(node_->literals())); | 2830 __ mov(r0, Operand(node_->literals())); |
2814 frame->EmitPush(r0); | 2831 frame->EmitPush(r0); |
2815 Result boilerplate = | 2832 Result boilerplate = |
2816 frame->CallRuntime(Runtime::kCreateArrayLiteralBoilerplate, 3); | 2833 frame->CallRuntime(Runtime::kCreateArrayLiteralBoilerplate, 3); |
2817 __ mov(r2, Operand(boilerplate.reg())); | 2834 __ mov(r2, Operand(boilerplate.reg())); |
2818 // Result is returned in r2. | 2835 // Result is returned in r2. |
2819 exit_.Jump(); | 2836 exit_.Jump(); |
2820 } | 2837 } |
2821 | 2838 |
2822 | 2839 |
| 2840 #undef __ |
| 2841 #define __ ACCESS_MASM(masm_) |
| 2842 |
| 2843 |
2823 void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) { | 2844 void CodeGenerator::VisitArrayLiteral(ArrayLiteral* node) { |
2824 #ifdef DEBUG | 2845 #ifdef DEBUG |
2825 int original_height = frame_->height(); | 2846 int original_height = frame_->height(); |
2826 #endif | 2847 #endif |
2827 VirtualFrame::SpilledScope spilled_scope; | 2848 VirtualFrame::SpilledScope spilled_scope; |
2828 Comment cmnt(masm_, "[ ArrayLiteral"); | 2849 Comment cmnt(masm_, "[ ArrayLiteral"); |
2829 | 2850 |
2830 DeferredArrayLiteral* deferred = new DeferredArrayLiteral(this, node); | 2851 DeferredArrayLiteral* deferred = new DeferredArrayLiteral(node); |
2831 | 2852 |
2832 // Retrieve the literal array and check the allocated entry. | 2853 // Retrieve the literal array and check the allocated entry. |
2833 | 2854 |
2834 // Load the function of this activation. | 2855 // Load the function of this activation. |
2835 __ ldr(r1, frame_->Function()); | 2856 __ ldr(r1, frame_->Function()); |
2836 | 2857 |
2837 // Load the literals array of the function. | 2858 // Load the literals array of the function. |
2838 __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset)); | 2859 __ ldr(r1, FieldMemOperand(r1, JSFunction::kLiteralsOffset)); |
2839 | 2860 |
2840 // Load the literal at the ast saved index. | 2861 // Load the literal at the ast saved index. |
(...skipping 2348 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5189 __ mov(r2, Operand(0)); | 5210 __ mov(r2, Operand(0)); |
5190 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION); | 5211 __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION); |
5191 __ Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)), | 5212 __ Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)), |
5192 RelocInfo::CODE_TARGET); | 5213 RelocInfo::CODE_TARGET); |
5193 } | 5214 } |
5194 | 5215 |
5195 | 5216 |
5196 #undef __ | 5217 #undef __ |
5197 | 5218 |
5198 } } // namespace v8::internal | 5219 } } // namespace v8::internal |
OLD | NEW |