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

Side by Side Diff: src/builtins/mips64/builtins-mips64.cc

Issue 2145023002: [builtins] move builtin files to src/builtins/. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase Created 4 years, 5 months 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
« no previous file with comments | « src/builtins/mips64/OWNERS ('k') | src/builtins/ppc/OWNERS » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #if V8_TARGET_ARCH_MIPS64 5 #if V8_TARGET_ARCH_MIPS64
6 6
7 #include "src/codegen.h" 7 #include "src/codegen.h"
8 #include "src/debug/debug.h" 8 #include "src/debug/debug.h"
9 #include "src/deoptimizer.h" 9 #include "src/deoptimizer.h"
10 #include "src/full-codegen/full-codegen.h" 10 #include "src/full-codegen/full-codegen.h"
11 #include "src/runtime/runtime.h" 11 #include "src/runtime/runtime.h"
12 12
13 namespace v8 { 13 namespace v8 {
14 namespace internal { 14 namespace internal {
15 15
16
17 #define __ ACCESS_MASM(masm) 16 #define __ ACCESS_MASM(masm)
18 17
19 void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id, 18 void Builtins::Generate_Adaptor(MacroAssembler* masm, CFunctionId id,
20 ExitFrameType exit_frame_type) { 19 ExitFrameType exit_frame_type) {
21 // ----------- S t a t e ------------- 20 // ----------- S t a t e -------------
22 // -- a0 : number of arguments excluding receiver 21 // -- a0 : number of arguments excluding receiver
23 // -- a1 : target 22 // -- a1 : target
24 // -- a3 : new.target 23 // -- a3 : new.target
25 // -- sp[0] : last argument 24 // -- sp[0] : last argument
26 // -- ... 25 // -- ...
(...skipping 15 matching lines...) Expand all
42 41
43 // Insert extra arguments. 42 // Insert extra arguments.
44 __ SmiTag(a0); 43 __ SmiTag(a0);
45 __ Push(a0, a1, a3); 44 __ Push(a0, a1, a3);
46 __ SmiUntag(a0); 45 __ SmiUntag(a0);
47 46
48 __ JumpToExternalReference(ExternalReference(id, masm->isolate()), PROTECT, 47 __ JumpToExternalReference(ExternalReference(id, masm->isolate()), PROTECT,
49 exit_frame_type == BUILTIN_EXIT); 48 exit_frame_type == BUILTIN_EXIT);
50 } 49 }
51 50
52
53 // Load the built-in InternalArray function from the current context. 51 // Load the built-in InternalArray function from the current context.
54 static void GenerateLoadInternalArrayFunction(MacroAssembler* masm, 52 static void GenerateLoadInternalArrayFunction(MacroAssembler* masm,
55 Register result) { 53 Register result) {
56 // Load the InternalArray function from the native context. 54 // Load the InternalArray function from the native context.
57 __ LoadNativeContextSlot(Context::INTERNAL_ARRAY_FUNCTION_INDEX, result); 55 __ LoadNativeContextSlot(Context::INTERNAL_ARRAY_FUNCTION_INDEX, result);
58 } 56 }
59 57
60
61 // Load the built-in Array function from the current context. 58 // Load the built-in Array function from the current context.
62 static void GenerateLoadArrayFunction(MacroAssembler* masm, Register result) { 59 static void GenerateLoadArrayFunction(MacroAssembler* masm, Register result) {
63 // Load the Array function from the native context. 60 // Load the Array function from the native context.
64 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, result); 61 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, result);
65 } 62 }
66 63
67
68 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) { 64 void Builtins::Generate_InternalArrayCode(MacroAssembler* masm) {
69 // ----------- S t a t e ------------- 65 // ----------- S t a t e -------------
70 // -- a0 : number of arguments 66 // -- a0 : number of arguments
71 // -- ra : return address 67 // -- ra : return address
72 // -- sp[...]: constructor arguments 68 // -- sp[...]: constructor arguments
73 // ----------------------------------- 69 // -----------------------------------
74 Label generic_array_code, one_or_more_arguments, two_or_more_arguments; 70 Label generic_array_code, one_or_more_arguments, two_or_more_arguments;
75 71
76 // Get the InternalArray function. 72 // Get the InternalArray function.
77 GenerateLoadInternalArrayFunction(masm, a1); 73 GenerateLoadInternalArrayFunction(masm, a1);
78 74
79 if (FLAG_debug_code) { 75 if (FLAG_debug_code) {
80 // Initial map for the builtin InternalArray functions should be maps. 76 // Initial map for the builtin InternalArray functions should be maps.
81 __ ld(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); 77 __ ld(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
82 __ SmiTst(a2, a4); 78 __ SmiTst(a2, a4);
83 __ Assert(ne, kUnexpectedInitialMapForInternalArrayFunction, 79 __ Assert(ne, kUnexpectedInitialMapForInternalArrayFunction, a4,
84 a4, Operand(zero_reg)); 80 Operand(zero_reg));
85 __ GetObjectType(a2, a3, a4); 81 __ GetObjectType(a2, a3, a4);
86 __ Assert(eq, kUnexpectedInitialMapForInternalArrayFunction, 82 __ Assert(eq, kUnexpectedInitialMapForInternalArrayFunction, a4,
87 a4, Operand(MAP_TYPE)); 83 Operand(MAP_TYPE));
88 } 84 }
89 85
90 // Run the native code for the InternalArray function called as a normal 86 // Run the native code for the InternalArray function called as a normal
91 // function. 87 // function.
92 // Tail call a stub. 88 // Tail call a stub.
93 InternalArrayConstructorStub stub(masm->isolate()); 89 InternalArrayConstructorStub stub(masm->isolate());
94 __ TailCallStub(&stub); 90 __ TailCallStub(&stub);
95 } 91 }
96 92
97
98 void Builtins::Generate_ArrayCode(MacroAssembler* masm) { 93 void Builtins::Generate_ArrayCode(MacroAssembler* masm) {
99 // ----------- S t a t e ------------- 94 // ----------- S t a t e -------------
100 // -- a0 : number of arguments 95 // -- a0 : number of arguments
101 // -- ra : return address 96 // -- ra : return address
102 // -- sp[...]: constructor arguments 97 // -- sp[...]: constructor arguments
103 // ----------------------------------- 98 // -----------------------------------
104 Label generic_array_code; 99 Label generic_array_code;
105 100
106 // Get the Array function. 101 // Get the Array function.
107 GenerateLoadArrayFunction(masm, a1); 102 GenerateLoadArrayFunction(masm, a1);
108 103
109 if (FLAG_debug_code) { 104 if (FLAG_debug_code) {
110 // Initial map for the builtin Array functions should be maps. 105 // Initial map for the builtin Array functions should be maps.
111 __ ld(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset)); 106 __ ld(a2, FieldMemOperand(a1, JSFunction::kPrototypeOrInitialMapOffset));
112 __ SmiTst(a2, a4); 107 __ SmiTst(a2, a4);
113 __ Assert(ne, kUnexpectedInitialMapForArrayFunction1, 108 __ Assert(ne, kUnexpectedInitialMapForArrayFunction1, a4,
114 a4, Operand(zero_reg)); 109 Operand(zero_reg));
115 __ GetObjectType(a2, a3, a4); 110 __ GetObjectType(a2, a3, a4);
116 __ Assert(eq, kUnexpectedInitialMapForArrayFunction2, 111 __ Assert(eq, kUnexpectedInitialMapForArrayFunction2, a4,
117 a4, Operand(MAP_TYPE)); 112 Operand(MAP_TYPE));
118 } 113 }
119 114
120 // Run the native code for the Array function called as a normal function. 115 // Run the native code for the Array function called as a normal function.
121 // Tail call a stub. 116 // Tail call a stub.
122 __ mov(a3, a1); 117 __ mov(a3, a1);
123 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); 118 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
124 ArrayConstructorStub stub(masm->isolate()); 119 ArrayConstructorStub stub(masm->isolate());
125 __ TailCallStub(&stub); 120 __ TailCallStub(&stub);
126 } 121 }
127 122
128
129 // static 123 // static
130 void Builtins::Generate_MathMaxMin(MacroAssembler* masm, MathMaxMinKind kind) { 124 void Builtins::Generate_MathMaxMin(MacroAssembler* masm, MathMaxMinKind kind) {
131 // ----------- S t a t e ------------- 125 // ----------- S t a t e -------------
132 // -- a0 : number of arguments 126 // -- a0 : number of arguments
133 // -- a1 : function 127 // -- a1 : function
134 // -- cp : context 128 // -- cp : context
135 // -- ra : return address 129 // -- ra : return address
136 // -- sp[(argc - n - 1) * 8] : arg[n] (zero-based) 130 // -- sp[(argc - n - 1) * 8] : arg[n] (zero-based)
137 // -- sp[argc * 8] : receiver 131 // -- sp[argc * 8] : receiver
138 // ----------------------------------- 132 // -----------------------------------
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 __ Dlsa(sp, sp, t0, kPointerSizeLog2); 261 __ Dlsa(sp, sp, t0, kPointerSizeLog2);
268 __ DropAndRet(1); 262 __ DropAndRet(1);
269 } 263 }
270 264
271 // 2b. No arguments, return +0. 265 // 2b. No arguments, return +0.
272 __ bind(&no_arguments); 266 __ bind(&no_arguments);
273 __ Move(v0, Smi::FromInt(0)); 267 __ Move(v0, Smi::FromInt(0));
274 __ DropAndRet(1); 268 __ DropAndRet(1);
275 } 269 }
276 270
277
278 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) { 271 void Builtins::Generate_NumberConstructor_ConstructStub(MacroAssembler* masm) {
279 // ----------- S t a t e ------------- 272 // ----------- S t a t e -------------
280 // -- a0 : number of arguments 273 // -- a0 : number of arguments
281 // -- a1 : constructor function 274 // -- a1 : constructor function
282 // -- a3 : new target 275 // -- a3 : new target
283 // -- cp : context 276 // -- cp : context
284 // -- ra : return address 277 // -- ra : return address
285 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) 278 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based)
286 // -- sp[argc * 8] : receiver 279 // -- sp[argc * 8] : receiver
287 // ----------------------------------- 280 // -----------------------------------
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 } 340 }
348 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset)); 341 __ sd(a0, FieldMemOperand(v0, JSValue::kValueOffset));
349 342
350 __ bind(&drop_frame_and_ret); 343 __ bind(&drop_frame_and_ret);
351 { 344 {
352 __ Dlsa(sp, sp, t0, kPointerSizeLog2); 345 __ Dlsa(sp, sp, t0, kPointerSizeLog2);
353 __ DropAndRet(1); 346 __ DropAndRet(1);
354 } 347 }
355 } 348 }
356 349
357
358 // static 350 // static
359 void Builtins::Generate_StringConstructor(MacroAssembler* masm) { 351 void Builtins::Generate_StringConstructor(MacroAssembler* masm) {
360 // ----------- S t a t e ------------- 352 // ----------- S t a t e -------------
361 // -- a0 : number of arguments 353 // -- a0 : number of arguments
362 // -- a1 : constructor function 354 // -- a1 : constructor function
363 // -- cp : context 355 // -- cp : context
364 // -- ra : return address 356 // -- ra : return address
365 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) 357 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based)
366 // -- sp[argc * 8] : receiver 358 // -- sp[argc * 8] : receiver
367 // ----------------------------------- 359 // -----------------------------------
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 __ TailCallRuntime(Runtime::kSymbolDescriptiveString); 412 __ TailCallRuntime(Runtime::kSymbolDescriptiveString);
421 } 413 }
422 414
423 __ bind(&drop_frame_and_ret); 415 __ bind(&drop_frame_and_ret);
424 { 416 {
425 __ Dlsa(sp, sp, t0, kPointerSizeLog2); 417 __ Dlsa(sp, sp, t0, kPointerSizeLog2);
426 __ DropAndRet(1); 418 __ DropAndRet(1);
427 } 419 }
428 } 420 }
429 421
430
431 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) { 422 void Builtins::Generate_StringConstructor_ConstructStub(MacroAssembler* masm) {
432 // ----------- S t a t e ------------- 423 // ----------- S t a t e -------------
433 // -- a0 : number of arguments 424 // -- a0 : number of arguments
434 // -- a1 : constructor function 425 // -- a1 : constructor function
435 // -- a3 : new target 426 // -- a3 : new target
436 // -- cp : context 427 // -- cp : context
437 // -- ra : return address 428 // -- ra : return address
438 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based) 429 // -- sp[(argc - n - 1) * 8] : arg[n] (zero based)
439 // -- sp[argc * 8] : receiver 430 // -- sp[argc * 8] : receiver
440 // ----------------------------------- 431 // -----------------------------------
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
534 __ CallRuntime(function_id, 1); 525 __ CallRuntime(function_id, 1);
535 // Restore target function and new target. 526 // Restore target function and new target.
536 __ Pop(a0, a1, a3); 527 __ Pop(a0, a1, a3);
537 __ SmiUntag(a0); 528 __ SmiUntag(a0);
538 } 529 }
539 530
540 __ Daddu(at, v0, Operand(Code::kHeaderSize - kHeapObjectTag)); 531 __ Daddu(at, v0, Operand(Code::kHeaderSize - kHeapObjectTag));
541 __ Jump(at); 532 __ Jump(at);
542 } 533 }
543 534
544
545 void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) { 535 void Builtins::Generate_InOptimizationQueue(MacroAssembler* masm) {
546 // Checking whether the queued function is ready for install is optional, 536 // Checking whether the queued function is ready for install is optional,
547 // since we come across interrupts and stack checks elsewhere. However, 537 // since we come across interrupts and stack checks elsewhere. However,
548 // not checking may delay installing ready functions, and always checking 538 // not checking may delay installing ready functions, and always checking
549 // would be quite expensive. A good compromise is to first check against 539 // would be quite expensive. A good compromise is to first check against
550 // stack limit as a cue for an interrupt signal. 540 // stack limit as a cue for an interrupt signal.
551 Label ok; 541 Label ok;
552 __ LoadRoot(a4, Heap::kStackLimitRootIndex); 542 __ LoadRoot(a4, Heap::kStackLimitRootIndex);
553 __ Branch(&ok, hs, sp, Operand(a4)); 543 __ Branch(&ok, hs, sp, Operand(a4));
554 544
555 GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode); 545 GenerateTailCallToReturnedCode(masm, Runtime::kTryInstallOptimizedCode);
556 546
557 __ bind(&ok); 547 __ bind(&ok);
558 GenerateTailCallToSharedCode(masm); 548 GenerateTailCallToSharedCode(masm);
559 } 549 }
560 550
561
562 static void Generate_JSConstructStubHelper(MacroAssembler* masm, 551 static void Generate_JSConstructStubHelper(MacroAssembler* masm,
563 bool is_api_function, 552 bool is_api_function,
564 bool create_implicit_receiver, 553 bool create_implicit_receiver,
565 bool check_derived_construct) { 554 bool check_derived_construct) {
566 // ----------- S t a t e ------------- 555 // ----------- S t a t e -------------
567 // -- a0 : number of arguments 556 // -- a0 : number of arguments
568 // -- a1 : constructor function 557 // -- a1 : constructor function
569 // -- a2 : allocation site or undefined 558 // -- a2 : allocation site or undefined
570 // -- a3 : new target 559 // -- a3 : new target
571 // -- cp : context 560 // -- cp : context
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 688
700 __ SmiScale(a4, a1, kPointerSizeLog2); 689 __ SmiScale(a4, a1, kPointerSizeLog2);
701 __ Daddu(sp, sp, a4); 690 __ Daddu(sp, sp, a4);
702 __ Daddu(sp, sp, kPointerSize); 691 __ Daddu(sp, sp, kPointerSize);
703 if (create_implicit_receiver) { 692 if (create_implicit_receiver) {
704 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2); 693 __ IncrementCounter(isolate->counters()->constructed_objects(), 1, a1, a2);
705 } 694 }
706 __ Ret(); 695 __ Ret();
707 } 696 }
708 697
709
710 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) { 698 void Builtins::Generate_JSConstructStubGeneric(MacroAssembler* masm) {
711 Generate_JSConstructStubHelper(masm, false, true, false); 699 Generate_JSConstructStubHelper(masm, false, true, false);
712 } 700 }
713 701
714
715 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) { 702 void Builtins::Generate_JSConstructStubApi(MacroAssembler* masm) {
716 Generate_JSConstructStubHelper(masm, true, false, false); 703 Generate_JSConstructStubHelper(masm, true, false, false);
717 } 704 }
718 705
719
720 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) { 706 void Builtins::Generate_JSBuiltinsConstructStub(MacroAssembler* masm) {
721 Generate_JSConstructStubHelper(masm, false, false, false); 707 Generate_JSConstructStubHelper(masm, false, false, false);
722 } 708 }
723 709
724
725 void Builtins::Generate_JSBuiltinsConstructStubForDerived( 710 void Builtins::Generate_JSBuiltinsConstructStubForDerived(
726 MacroAssembler* masm) { 711 MacroAssembler* masm) {
727 Generate_JSConstructStubHelper(masm, false, false, true); 712 Generate_JSConstructStubHelper(masm, false, false, true);
728 } 713 }
729 714
730 // static 715 // static
731 void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) { 716 void Builtins::Generate_ResumeGeneratorTrampoline(MacroAssembler* masm) {
732 // ----------- S t a t e ------------- 717 // ----------- S t a t e -------------
733 // -- v0 : the value to pass to the generator 718 // -- v0 : the value to pass to the generator
734 // -- a1 : the JSGeneratorObject to resume 719 // -- a1 : the JSGeneratorObject to resume
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
801 Label old_generator; 786 Label old_generator;
802 __ ld(a3, FieldMemOperand(a4, JSFunction::kSharedFunctionInfoOffset)); 787 __ ld(a3, FieldMemOperand(a4, JSFunction::kSharedFunctionInfoOffset));
803 __ ld(a3, FieldMemOperand(a3, SharedFunctionInfo::kFunctionDataOffset)); 788 __ ld(a3, FieldMemOperand(a3, SharedFunctionInfo::kFunctionDataOffset));
804 __ GetObjectType(a3, a3, a3); 789 __ GetObjectType(a3, a3, a3);
805 __ Branch(&old_generator, ne, a3, Operand(BYTECODE_ARRAY_TYPE)); 790 __ Branch(&old_generator, ne, a3, Operand(BYTECODE_ARRAY_TYPE));
806 791
807 // New-style (ignition/turbofan) generator object. 792 // New-style (ignition/turbofan) generator object.
808 { 793 {
809 __ ld(a0, FieldMemOperand(a4, JSFunction::kSharedFunctionInfoOffset)); 794 __ ld(a0, FieldMemOperand(a4, JSFunction::kSharedFunctionInfoOffset));
810 __ lw(a0, 795 __ lw(a0,
811 FieldMemOperand(a0, SharedFunctionInfo::kFormalParameterCountOffset)); 796 FieldMemOperand(a0, SharedFunctionInfo::kFormalParameterCountOffset));
812 // We abuse new.target both to indicate that this is a resume call and to 797 // We abuse new.target both to indicate that this is a resume call and to
813 // pass in the generator object. In ordinary calls, new.target is always 798 // pass in the generator object. In ordinary calls, new.target is always
814 // undefined because generator functions are non-constructable. 799 // undefined because generator functions are non-constructable.
815 __ Move(a3, a1); 800 __ Move(a3, a1);
816 __ Move(a1, a4); 801 __ Move(a1, a4);
817 __ ld(a2, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); 802 __ ld(a2, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
818 __ Jump(a2); 803 __ Jump(a2);
819 } 804 }
820 805
821 // Old-style (full-codegen) generator object 806 // Old-style (full-codegen) generator object
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 __ Branch(USE_DELAY_SLOT, &stepping_prepared); 867 __ Branch(USE_DELAY_SLOT, &stepping_prepared);
883 __ ld(a4, FieldMemOperand(a1, JSGeneratorObject::kFunctionOffset)); 868 __ ld(a4, FieldMemOperand(a1, JSGeneratorObject::kFunctionOffset));
884 } 869 }
885 870
886 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) { 871 void Builtins::Generate_ConstructedNonConstructable(MacroAssembler* masm) {
887 FrameScope scope(masm, StackFrame::INTERNAL); 872 FrameScope scope(masm, StackFrame::INTERNAL);
888 __ Push(a1); 873 __ Push(a1);
889 __ CallRuntime(Runtime::kThrowConstructedNonConstructable); 874 __ CallRuntime(Runtime::kThrowConstructedNonConstructable);
890 } 875 }
891 876
892
893 enum IsTagged { kArgcIsSmiTagged, kArgcIsUntaggedInt }; 877 enum IsTagged { kArgcIsSmiTagged, kArgcIsUntaggedInt };
894 878
895
896 // Clobbers a2; preserves all other registers. 879 // Clobbers a2; preserves all other registers.
897 static void Generate_CheckStackOverflow(MacroAssembler* masm, Register argc, 880 static void Generate_CheckStackOverflow(MacroAssembler* masm, Register argc,
898 IsTagged argc_is_tagged) { 881 IsTagged argc_is_tagged) {
899 // Check the stack for overflow. We are not trying to catch 882 // Check the stack for overflow. We are not trying to catch
900 // interruptions (e.g. debug break and preemption) here, so the "real stack 883 // interruptions (e.g. debug break and preemption) here, so the "real stack
901 // limit" is checked. 884 // limit" is checked.
902 Label okay; 885 Label okay;
903 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex); 886 __ LoadRoot(a2, Heap::kRealStackLimitRootIndex);
904 // Make a2 the space we have left. The stack might already be overflowed 887 // Make a2 the space we have left. The stack might already be overflowed
905 // here which will cause r2 to become negative. 888 // here which will cause r2 to become negative.
906 __ dsubu(a2, sp, a2); 889 __ dsubu(a2, sp, a2);
907 // Check if the arguments will overflow the stack. 890 // Check if the arguments will overflow the stack.
908 if (argc_is_tagged == kArgcIsSmiTagged) { 891 if (argc_is_tagged == kArgcIsSmiTagged) {
909 __ SmiScale(a7, v0, kPointerSizeLog2); 892 __ SmiScale(a7, v0, kPointerSizeLog2);
910 } else { 893 } else {
911 DCHECK(argc_is_tagged == kArgcIsUntaggedInt); 894 DCHECK(argc_is_tagged == kArgcIsUntaggedInt);
912 __ dsll(a7, argc, kPointerSizeLog2); 895 __ dsll(a7, argc, kPointerSizeLog2);
913 } 896 }
914 __ Branch(&okay, gt, a2, Operand(a7)); // Signed comparison. 897 __ Branch(&okay, gt, a2, Operand(a7)); // Signed comparison.
915 898
916 // Out of stack space. 899 // Out of stack space.
917 __ CallRuntime(Runtime::kThrowStackOverflow); 900 __ CallRuntime(Runtime::kThrowStackOverflow);
918 901
919 __ bind(&okay); 902 __ bind(&okay);
920 } 903 }
921 904
922
923 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm, 905 static void Generate_JSEntryTrampolineHelper(MacroAssembler* masm,
924 bool is_construct) { 906 bool is_construct) {
925 // Called from JSEntryStub::GenerateBody 907 // Called from JSEntryStub::GenerateBody
926 908
927 // ----------- S t a t e ------------- 909 // ----------- S t a t e -------------
928 // -- a0: new.target 910 // -- a0: new.target
929 // -- a1: function 911 // -- a1: function
930 // -- a2: receiver_pointer 912 // -- a2: receiver_pointer
931 // -- a3: argc 913 // -- a3: argc
932 // -- s0: argv 914 // -- s0: argv
(...skipping 19 matching lines...) Expand all
952 934
953 // Remember new.target. 935 // Remember new.target.
954 __ mov(a5, a0); 936 __ mov(a5, a0);
955 937
956 // Copy arguments to the stack in a loop. 938 // Copy arguments to the stack in a loop.
957 // a3: argc 939 // a3: argc
958 // s0: argv, i.e. points to first arg 940 // s0: argv, i.e. points to first arg
959 Label loop, entry; 941 Label loop, entry;
960 __ Dlsa(a6, s0, a3, kPointerSizeLog2); 942 __ Dlsa(a6, s0, a3, kPointerSizeLog2);
961 __ b(&entry); 943 __ b(&entry);
962 __ nop(); // Branch delay slot nop. 944 __ nop(); // Branch delay slot nop.
963 // a6 points past last arg. 945 // a6 points past last arg.
964 __ bind(&loop); 946 __ bind(&loop);
965 __ ld(a4, MemOperand(s0)); // Read next parameter. 947 __ ld(a4, MemOperand(s0)); // Read next parameter.
966 __ daddiu(s0, s0, kPointerSize); 948 __ daddiu(s0, s0, kPointerSize);
967 __ ld(a4, MemOperand(a4)); // Dereference handle. 949 __ ld(a4, MemOperand(a4)); // Dereference handle.
968 __ push(a4); // Push parameter. 950 __ push(a4); // Push parameter.
969 __ bind(&entry); 951 __ bind(&entry);
970 __ Branch(&loop, ne, s0, Operand(a6)); 952 __ Branch(&loop, ne, s0, Operand(a6));
971 953
972 // Setup new.target and argc. 954 // Setup new.target and argc.
973 __ mov(a0, a3); 955 __ mov(a0, a3);
974 __ mov(a3, a5); 956 __ mov(a3, a5);
975 957
976 // Initialize all JavaScript callee-saved registers, since they will be seen 958 // Initialize all JavaScript callee-saved registers, since they will be seen
977 // by the garbage collector as part of handlers. 959 // by the garbage collector as part of handlers.
978 __ LoadRoot(a4, Heap::kUndefinedValueRootIndex); 960 __ LoadRoot(a4, Heap::kUndefinedValueRootIndex);
979 __ mov(s1, a4); 961 __ mov(s1, a4);
980 __ mov(s2, a4); 962 __ mov(s2, a4);
981 __ mov(s3, a4); 963 __ mov(s3, a4);
982 __ mov(s4, a4); 964 __ mov(s4, a4);
983 __ mov(s5, a4); 965 __ mov(s5, a4);
984 // s6 holds the root address. Do not clobber. 966 // s6 holds the root address. Do not clobber.
985 // s7 is cp. Do not init. 967 // s7 is cp. Do not init.
986 968
987 // Invoke the code. 969 // Invoke the code.
988 Handle<Code> builtin = is_construct 970 Handle<Code> builtin = is_construct
989 ? masm->isolate()->builtins()->Construct() 971 ? masm->isolate()->builtins()->Construct()
990 : masm->isolate()->builtins()->Call(); 972 : masm->isolate()->builtins()->Call();
991 __ Call(builtin, RelocInfo::CODE_TARGET); 973 __ Call(builtin, RelocInfo::CODE_TARGET);
992 974
993 // Leave internal frame. 975 // Leave internal frame.
994 } 976 }
995 __ Jump(ra); 977 __ Jump(ra);
996 } 978 }
997 979
998
999 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) { 980 void Builtins::Generate_JSEntryTrampoline(MacroAssembler* masm) {
1000 Generate_JSEntryTrampolineHelper(masm, false); 981 Generate_JSEntryTrampolineHelper(masm, false);
1001 } 982 }
1002 983
1003
1004 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) { 984 void Builtins::Generate_JSConstructEntryTrampoline(MacroAssembler* masm) {
1005 Generate_JSEntryTrampolineHelper(masm, true); 985 Generate_JSEntryTrampolineHelper(masm, true);
1006 } 986 }
1007 987
1008 static void LeaveInterpreterFrame(MacroAssembler* masm, Register scratch) { 988 static void LeaveInterpreterFrame(MacroAssembler* masm, Register scratch) {
1009 Register args_count = scratch; 989 Register args_count = scratch;
1010 990
1011 // Get the arguments + receiver count. 991 // Get the arguments + receiver count.
1012 __ ld(args_count, 992 __ ld(args_count,
1013 MemOperand(fp, InterpreterFrameConstants::kBytecodeArrayFromFp)); 993 MemOperand(fp, InterpreterFrameConstants::kBytecodeArrayFromFp));
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1499 } 1479 }
1500 1480
1501 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) { 1481 static void GenerateMakeCodeYoungAgainCommon(MacroAssembler* masm) {
1502 // For now, we are relying on the fact that make_code_young doesn't do any 1482 // For now, we are relying on the fact that make_code_young doesn't do any
1503 // garbage collection which allows us to save/restore the registers without 1483 // garbage collection which allows us to save/restore the registers without
1504 // worrying about which of them contain pointers. We also don't build an 1484 // worrying about which of them contain pointers. We also don't build an
1505 // internal frame to make the code faster, since we shouldn't have to do stack 1485 // internal frame to make the code faster, since we shouldn't have to do stack
1506 // crawls in MakeCodeYoung. This seems a bit fragile. 1486 // crawls in MakeCodeYoung. This seems a bit fragile.
1507 1487
1508 // Set a0 to point to the head of the PlatformCodeAge sequence. 1488 // Set a0 to point to the head of the PlatformCodeAge sequence.
1509 __ Dsubu(a0, a0, 1489 __ Dsubu(a0, a0, Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize));
1510 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize));
1511 1490
1512 // The following registers must be saved and restored when calling through to 1491 // The following registers must be saved and restored when calling through to
1513 // the runtime: 1492 // the runtime:
1514 // a0 - contains return address (beginning of patch sequence) 1493 // a0 - contains return address (beginning of patch sequence)
1515 // a1 - isolate 1494 // a1 - isolate
1516 // a3 - new target 1495 // a3 - new target
1517 RegList saved_regs = 1496 RegList saved_regs =
1518 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit(); 1497 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit();
1519 FrameScope scope(masm, StackFrame::MANUAL); 1498 FrameScope scope(masm, StackFrame::MANUAL);
1520 __ MultiPush(saved_regs); 1499 __ MultiPush(saved_regs);
1521 __ PrepareCallCFunction(2, 0, a2); 1500 __ PrepareCallCFunction(2, 0, a2);
1522 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); 1501 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
1523 __ CallCFunction( 1502 __ CallCFunction(
1524 ExternalReference::get_make_code_young_function(masm->isolate()), 2); 1503 ExternalReference::get_make_code_young_function(masm->isolate()), 2);
1525 __ MultiPop(saved_regs); 1504 __ MultiPop(saved_regs);
1526 __ Jump(a0); 1505 __ Jump(a0);
1527 } 1506 }
1528 1507
1529 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \ 1508 #define DEFINE_CODE_AGE_BUILTIN_GENERATOR(C) \
1530 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \ 1509 void Builtins::Generate_Make##C##CodeYoungAgainEvenMarking( \
1531 MacroAssembler* masm) { \ 1510 MacroAssembler* masm) { \
1532 GenerateMakeCodeYoungAgainCommon(masm); \ 1511 GenerateMakeCodeYoungAgainCommon(masm); \
1533 } \ 1512 } \
1534 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \ 1513 void Builtins::Generate_Make##C##CodeYoungAgainOddMarking( \
1535 MacroAssembler* masm) { \ 1514 MacroAssembler* masm) { \
1536 GenerateMakeCodeYoungAgainCommon(masm); \ 1515 GenerateMakeCodeYoungAgainCommon(masm); \
1537 } 1516 }
1538 CODE_AGE_LIST(DEFINE_CODE_AGE_BUILTIN_GENERATOR) 1517 CODE_AGE_LIST(DEFINE_CODE_AGE_BUILTIN_GENERATOR)
1539 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR 1518 #undef DEFINE_CODE_AGE_BUILTIN_GENERATOR
1540 1519
1541
1542 void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) { 1520 void Builtins::Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm) {
1543 // For now, as in GenerateMakeCodeYoungAgainCommon, we are relying on the fact 1521 // For now, as in GenerateMakeCodeYoungAgainCommon, we are relying on the fact
1544 // that make_code_young doesn't do any garbage collection which allows us to 1522 // that make_code_young doesn't do any garbage collection which allows us to
1545 // save/restore the registers without worrying about which of them contain 1523 // save/restore the registers without worrying about which of them contain
1546 // pointers. 1524 // pointers.
1547 1525
1548 // Set a0 to point to the head of the PlatformCodeAge sequence. 1526 // Set a0 to point to the head of the PlatformCodeAge sequence.
1549 __ Dsubu(a0, a0, 1527 __ Dsubu(a0, a0, Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize));
1550 Operand(kNoCodeAgeSequenceLength - Assembler::kInstrSize));
1551 1528
1552 // The following registers must be saved and restored when calling through to 1529 // The following registers must be saved and restored when calling through to
1553 // the runtime: 1530 // the runtime:
1554 // a0 - contains return address (beginning of patch sequence) 1531 // a0 - contains return address (beginning of patch sequence)
1555 // a1 - isolate 1532 // a1 - isolate
1556 // a3 - new target 1533 // a3 - new target
1557 RegList saved_regs = 1534 RegList saved_regs =
1558 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit(); 1535 (a0.bit() | a1.bit() | a3.bit() | ra.bit() | fp.bit()) & ~sp.bit();
1559 FrameScope scope(masm, StackFrame::MANUAL); 1536 FrameScope scope(masm, StackFrame::MANUAL);
1560 __ MultiPush(saved_regs); 1537 __ MultiPush(saved_regs);
1561 __ PrepareCallCFunction(2, 0, a2); 1538 __ PrepareCallCFunction(2, 0, a2);
1562 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate()))); 1539 __ li(a1, Operand(ExternalReference::isolate_address(masm->isolate())));
1563 __ CallCFunction( 1540 __ CallCFunction(
1564 ExternalReference::get_mark_code_as_executed_function(masm->isolate()), 1541 ExternalReference::get_mark_code_as_executed_function(masm->isolate()),
1565 2); 1542 2);
1566 __ MultiPop(saved_regs); 1543 __ MultiPop(saved_regs);
1567 1544
1568 // Perform prologue operations usually performed by the young code stub. 1545 // Perform prologue operations usually performed by the young code stub.
1569 __ PushStandardFrame(a1); 1546 __ PushStandardFrame(a1);
1570 1547
1571 // Jump to point after the code-age stub. 1548 // Jump to point after the code-age stub.
1572 __ Daddu(a0, a0, Operand((kNoCodeAgeSequenceLength))); 1549 __ Daddu(a0, a0, Operand((kNoCodeAgeSequenceLength)));
1573 __ Jump(a0); 1550 __ Jump(a0);
1574 } 1551 }
1575 1552
1576
1577 void Builtins::Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm) { 1553 void Builtins::Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm) {
1578 GenerateMakeCodeYoungAgainCommon(masm); 1554 GenerateMakeCodeYoungAgainCommon(masm);
1579 } 1555 }
1580 1556
1581
1582 void Builtins::Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm) { 1557 void Builtins::Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm) {
1583 Generate_MarkCodeAsExecutedOnce(masm); 1558 Generate_MarkCodeAsExecutedOnce(masm);
1584 } 1559 }
1585 1560
1586
1587 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm, 1561 static void Generate_NotifyStubFailureHelper(MacroAssembler* masm,
1588 SaveFPRegsMode save_doubles) { 1562 SaveFPRegsMode save_doubles) {
1589 { 1563 {
1590 FrameScope scope(masm, StackFrame::INTERNAL); 1564 FrameScope scope(masm, StackFrame::INTERNAL);
1591 1565
1592 // Preserve registers across notification, this is important for compiled 1566 // Preserve registers across notification, this is important for compiled
1593 // stubs that tail call the runtime on deopts passing their parameters in 1567 // stubs that tail call the runtime on deopts passing their parameters in
1594 // registers. 1568 // registers.
1595 __ MultiPush(kJSCallerSaved | kCalleeSaved); 1569 __ MultiPush(kJSCallerSaved | kCalleeSaved);
1596 // Pass the function and deoptimization type to the runtime system. 1570 // Pass the function and deoptimization type to the runtime system.
1597 __ CallRuntime(Runtime::kNotifyStubFailure, save_doubles); 1571 __ CallRuntime(Runtime::kNotifyStubFailure, save_doubles);
1598 __ MultiPop(kJSCallerSaved | kCalleeSaved); 1572 __ MultiPop(kJSCallerSaved | kCalleeSaved);
1599 } 1573 }
1600 1574
1601 __ Daddu(sp, sp, Operand(kPointerSize)); // Ignore state 1575 __ Daddu(sp, sp, Operand(kPointerSize)); // Ignore state
1602 __ Jump(ra); // Jump to miss handler 1576 __ Jump(ra); // Jump to miss handler
1603 } 1577 }
1604 1578
1605
1606 void Builtins::Generate_NotifyStubFailure(MacroAssembler* masm) { 1579 void Builtins::Generate_NotifyStubFailure(MacroAssembler* masm) {
1607 Generate_NotifyStubFailureHelper(masm, kDontSaveFPRegs); 1580 Generate_NotifyStubFailureHelper(masm, kDontSaveFPRegs);
1608 } 1581 }
1609 1582
1610
1611 void Builtins::Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm) { 1583 void Builtins::Generate_NotifyStubFailureSaveDoubles(MacroAssembler* masm) {
1612 Generate_NotifyStubFailureHelper(masm, kSaveFPRegs); 1584 Generate_NotifyStubFailureHelper(masm, kSaveFPRegs);
1613 } 1585 }
1614 1586
1615
1616 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm, 1587 static void Generate_NotifyDeoptimizedHelper(MacroAssembler* masm,
1617 Deoptimizer::BailoutType type) { 1588 Deoptimizer::BailoutType type) {
1618 { 1589 {
1619 FrameScope scope(masm, StackFrame::INTERNAL); 1590 FrameScope scope(masm, StackFrame::INTERNAL);
1620 // Pass the function and deoptimization type to the runtime system. 1591 // Pass the function and deoptimization type to the runtime system.
1621 __ li(a0, Operand(Smi::FromInt(static_cast<int>(type)))); 1592 __ li(a0, Operand(Smi::FromInt(static_cast<int>(type))));
1622 __ push(a0); 1593 __ push(a0);
1623 __ CallRuntime(Runtime::kNotifyDeoptimized); 1594 __ CallRuntime(Runtime::kNotifyDeoptimized);
1624 } 1595 }
1625 1596
(...skipping 17 matching lines...) Expand all
1643 Operand(static_cast<int64_t>(Deoptimizer::BailoutState::TOS_REGISTER))); 1614 Operand(static_cast<int64_t>(Deoptimizer::BailoutState::TOS_REGISTER)));
1644 1615
1645 __ Ret(USE_DELAY_SLOT); 1616 __ Ret(USE_DELAY_SLOT);
1646 // Safe to fill delay slot Addu will emit one instruction. 1617 // Safe to fill delay slot Addu will emit one instruction.
1647 __ Daddu(sp, sp, Operand(2 * kPointerSize)); // Remove state. 1618 __ Daddu(sp, sp, Operand(2 * kPointerSize)); // Remove state.
1648 1619
1649 __ bind(&unknown_state); 1620 __ bind(&unknown_state);
1650 __ stop("no cases left"); 1621 __ stop("no cases left");
1651 } 1622 }
1652 1623
1653
1654 void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) { 1624 void Builtins::Generate_NotifyDeoptimized(MacroAssembler* masm) {
1655 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::EAGER); 1625 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::EAGER);
1656 } 1626 }
1657 1627
1658
1659 void Builtins::Generate_NotifySoftDeoptimized(MacroAssembler* masm) { 1628 void Builtins::Generate_NotifySoftDeoptimized(MacroAssembler* masm) {
1660 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::SOFT); 1629 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::SOFT);
1661 } 1630 }
1662 1631
1663
1664 void Builtins::Generate_NotifyLazyDeoptimized(MacroAssembler* masm) { 1632 void Builtins::Generate_NotifyLazyDeoptimized(MacroAssembler* masm) {
1665 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::LAZY); 1633 Generate_NotifyDeoptimizedHelper(masm, Deoptimizer::LAZY);
1666 } 1634 }
1667 1635
1668
1669 // Clobbers {t2, t3, a4, a5}. 1636 // Clobbers {t2, t3, a4, a5}.
1670 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver, 1637 static void CompatibleReceiverCheck(MacroAssembler* masm, Register receiver,
1671 Register function_template_info, 1638 Register function_template_info,
1672 Label* receiver_check_failed) { 1639 Label* receiver_check_failed) {
1673 Register signature = t2; 1640 Register signature = t2;
1674 Register map = t3; 1641 Register map = t3;
1675 Register constructor = a4; 1642 Register constructor = a4;
1676 Register scratch = a5; 1643 Register scratch = a5;
1677 1644
1678 // If there is no signature, return the holder. 1645 // If there is no signature, return the holder.
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
1722 __ Branch(receiver_check_failed, eq, scratch, Operand(zero_reg)); 1689 __ Branch(receiver_check_failed, eq, scratch, Operand(zero_reg));
1723 1690
1724 __ ld(receiver, FieldMemOperand(map, Map::kPrototypeOffset)); 1691 __ ld(receiver, FieldMemOperand(map, Map::kPrototypeOffset));
1725 __ ld(map, FieldMemOperand(receiver, HeapObject::kMapOffset)); 1692 __ ld(map, FieldMemOperand(receiver, HeapObject::kMapOffset));
1726 // Iterate. 1693 // Iterate.
1727 __ Branch(&prototype_loop_start); 1694 __ Branch(&prototype_loop_start);
1728 1695
1729 __ bind(&receiver_check_passed); 1696 __ bind(&receiver_check_passed);
1730 } 1697 }
1731 1698
1732
1733 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) { 1699 void Builtins::Generate_HandleFastApiCall(MacroAssembler* masm) {
1734 // ----------- S t a t e ------------- 1700 // ----------- S t a t e -------------
1735 // -- a0 : number of arguments excluding receiver 1701 // -- a0 : number of arguments excluding receiver
1736 // -- a1 : callee 1702 // -- a1 : callee
1737 // -- ra : return address 1703 // -- ra : return address
1738 // -- sp[0] : last argument 1704 // -- sp[0] : last argument
1739 // -- ... 1705 // -- ...
1740 // -- sp[8 * (argc - 1)] : first argument 1706 // -- sp[8 * (argc - 1)] : first argument
1741 // -- sp[8 * argc] : receiver 1707 // -- sp[8 * argc] : receiver
1742 // ----------------------------------- 1708 // -----------------------------------
(...skipping 16 matching lines...) Expand all
1759 __ Jump(t2); 1725 __ Jump(t2);
1760 1726
1761 // Compatible receiver check failed: throw an Illegal Invocation exception. 1727 // Compatible receiver check failed: throw an Illegal Invocation exception.
1762 __ bind(&receiver_check_failed); 1728 __ bind(&receiver_check_failed);
1763 // Drop the arguments (including the receiver); 1729 // Drop the arguments (including the receiver);
1764 __ Daddu(t8, t8, Operand(kPointerSize)); 1730 __ Daddu(t8, t8, Operand(kPointerSize));
1765 __ daddu(sp, t8, zero_reg); 1731 __ daddu(sp, t8, zero_reg);
1766 __ TailCallRuntime(Runtime::kThrowIllegalInvocation); 1732 __ TailCallRuntime(Runtime::kThrowIllegalInvocation);
1767 } 1733 }
1768 1734
1769
1770 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) { 1735 void Builtins::Generate_OnStackReplacement(MacroAssembler* masm) {
1771 // Lookup the function in the JavaScript frame. 1736 // Lookup the function in the JavaScript frame.
1772 __ ld(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset)); 1737 __ ld(a0, MemOperand(fp, JavaScriptFrameConstants::kFunctionOffset));
1773 { 1738 {
1774 FrameScope scope(masm, StackFrame::INTERNAL); 1739 FrameScope scope(masm, StackFrame::INTERNAL);
1775 // Pass function as argument. 1740 // Pass function as argument.
1776 __ push(a0); 1741 __ push(a0);
1777 __ CallRuntime(Runtime::kCompileForOnStackReplacement); 1742 __ CallRuntime(Runtime::kCompileForOnStackReplacement);
1778 } 1743 }
1779 1744
1780 // If the code object is null, just return to the unoptimized code. 1745 // If the code object is null, just return to the unoptimized code.
1781 __ Ret(eq, v0, Operand(Smi::FromInt(0))); 1746 __ Ret(eq, v0, Operand(Smi::FromInt(0)));
1782 1747
1783 // Load deoptimization data from the code object. 1748 // Load deoptimization data from the code object.
1784 // <deopt_data> = <code>[#deoptimization_data_offset] 1749 // <deopt_data> = <code>[#deoptimization_data_offset]
1785 __ ld(a1, MemOperand(v0, Code::kDeoptimizationDataOffset - kHeapObjectTag)); 1750 __ ld(a1, MemOperand(v0, Code::kDeoptimizationDataOffset - kHeapObjectTag));
1786 1751
1787 // Load the OSR entrypoint offset from the deoptimization data. 1752 // Load the OSR entrypoint offset from the deoptimization data.
1788 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset] 1753 // <osr_offset> = <deopt_data>[#header_size + #osr_pc_offset]
1789 __ ld(a1, MemOperand(a1, FixedArray::OffsetOfElementAt( 1754 __ ld(a1, MemOperand(a1, FixedArray::OffsetOfElementAt(
1790 DeoptimizationInputData::kOsrPcOffsetIndex) - kHeapObjectTag)); 1755 DeoptimizationInputData::kOsrPcOffsetIndex) -
1756 kHeapObjectTag));
1791 __ SmiUntag(a1); 1757 __ SmiUntag(a1);
1792 1758
1793 // Compute the target address = code_obj + header_size + osr_offset 1759 // Compute the target address = code_obj + header_size + osr_offset
1794 // <entry_addr> = <code_obj> + #header_size + <osr_offset> 1760 // <entry_addr> = <code_obj> + #header_size + <osr_offset>
1795 __ daddu(v0, v0, a1); 1761 __ daddu(v0, v0, a1);
1796 __ daddiu(ra, v0, Code::kHeaderSize - kHeapObjectTag); 1762 __ daddiu(ra, v0, Code::kHeaderSize - kHeapObjectTag);
1797 1763
1798 // And "return" to the OSR entry point of the function. 1764 // And "return" to the OSR entry point of the function.
1799 __ Ret(); 1765 __ Ret();
1800 } 1766 }
1801 1767
1802
1803 // static 1768 // static
1804 void Builtins::Generate_DatePrototype_GetField(MacroAssembler* masm, 1769 void Builtins::Generate_DatePrototype_GetField(MacroAssembler* masm,
1805 int field_index) { 1770 int field_index) {
1806 // ----------- S t a t e ------------- 1771 // ----------- S t a t e -------------
1807 // -- a0 : number of arguments 1772 // -- a0 : number of arguments
1808 // -- a1 : function 1773 // -- a1 : function
1809 // -- cp : context 1774 // -- cp : context
1810 // -- sp[0] : receiver 1775 // -- sp[0] : receiver
1811 // ----------------------------------- 1776 // -----------------------------------
1812 1777
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
1921 } 1886 }
1922 1887
1923 // 4c. The receiver is not callable, throw an appropriate TypeError. 1888 // 4c. The receiver is not callable, throw an appropriate TypeError.
1924 __ bind(&receiver_not_callable); 1889 __ bind(&receiver_not_callable);
1925 { 1890 {
1926 __ sd(a1, MemOperand(sp)); 1891 __ sd(a1, MemOperand(sp));
1927 __ TailCallRuntime(Runtime::kThrowApplyNonFunction); 1892 __ TailCallRuntime(Runtime::kThrowApplyNonFunction);
1928 } 1893 }
1929 } 1894 }
1930 1895
1931
1932 // static 1896 // static
1933 void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) { 1897 void Builtins::Generate_FunctionPrototypeCall(MacroAssembler* masm) {
1934 // 1. Make sure we have at least one argument. 1898 // 1. Make sure we have at least one argument.
1935 // a0: actual number of arguments 1899 // a0: actual number of arguments
1936 { 1900 {
1937 Label done; 1901 Label done;
1938 __ Branch(&done, ne, a0, Operand(zero_reg)); 1902 __ Branch(&done, ne, a0, Operand(zero_reg));
1939 __ PushRoot(Heap::kUndefinedValueRootIndex); 1903 __ PushRoot(Heap::kUndefinedValueRootIndex);
1940 __ Daddu(a0, a0, Operand(1)); 1904 __ Daddu(a0, a0, Operand(1));
1941 __ bind(&done); 1905 __ bind(&done);
(...skipping 22 matching lines...) Expand all
1964 // Adjust the actual number of arguments and remove the top element 1928 // Adjust the actual number of arguments and remove the top element
1965 // (which is a copy of the last argument). 1929 // (which is a copy of the last argument).
1966 __ Dsubu(a0, a0, Operand(1)); 1930 __ Dsubu(a0, a0, Operand(1));
1967 __ Pop(); 1931 __ Pop();
1968 } 1932 }
1969 1933
1970 // 4. Call the callable. 1934 // 4. Call the callable.
1971 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET); 1935 __ Jump(masm->isolate()->builtins()->Call(), RelocInfo::CODE_TARGET);
1972 } 1936 }
1973 1937
1974
1975 void Builtins::Generate_ReflectApply(MacroAssembler* masm) { 1938 void Builtins::Generate_ReflectApply(MacroAssembler* masm) {
1976 // ----------- S t a t e ------------- 1939 // ----------- S t a t e -------------
1977 // -- a0 : argc 1940 // -- a0 : argc
1978 // -- sp[0] : argumentsList 1941 // -- sp[0] : argumentsList
1979 // -- sp[4] : thisArgument 1942 // -- sp[4] : thisArgument
1980 // -- sp[8] : target 1943 // -- sp[8] : target
1981 // -- sp[12] : receiver 1944 // -- sp[12] : receiver
1982 // ----------------------------------- 1945 // -----------------------------------
1983 1946
1984 // 1. Load target into a1 (if present), argumentsList into a0 (if present), 1947 // 1. Load target into a1 (if present), argumentsList into a0 (if present),
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2028 __ Jump(masm->isolate()->builtins()->Apply(), RelocInfo::CODE_TARGET); 1991 __ Jump(masm->isolate()->builtins()->Apply(), RelocInfo::CODE_TARGET);
2029 1992
2030 // 3b. The target is not callable, throw an appropriate TypeError. 1993 // 3b. The target is not callable, throw an appropriate TypeError.
2031 __ bind(&target_not_callable); 1994 __ bind(&target_not_callable);
2032 { 1995 {
2033 __ sd(a1, MemOperand(sp)); 1996 __ sd(a1, MemOperand(sp));
2034 __ TailCallRuntime(Runtime::kThrowApplyNonFunction); 1997 __ TailCallRuntime(Runtime::kThrowApplyNonFunction);
2035 } 1998 }
2036 } 1999 }
2037 2000
2038
2039 void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) { 2001 void Builtins::Generate_ReflectConstruct(MacroAssembler* masm) {
2040 // ----------- S t a t e ------------- 2002 // ----------- S t a t e -------------
2041 // -- a0 : argc 2003 // -- a0 : argc
2042 // -- sp[0] : new.target (optional) 2004 // -- sp[0] : new.target (optional)
2043 // -- sp[4] : argumentsList 2005 // -- sp[4] : argumentsList
2044 // -- sp[8] : target 2006 // -- sp[8] : target
2045 // -- sp[12] : receiver 2007 // -- sp[12] : receiver
2046 // ----------------------------------- 2008 // -----------------------------------
2047 2009
2048 // 1. Load target into a1 (if present), argumentsList into a0 (if present), 2010 // 1. Load target into a1 (if present), argumentsList into a0 (if present),
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2107 } 2069 }
2108 2070
2109 // 4c. The new.target is not a constructor, throw an appropriate TypeError. 2071 // 4c. The new.target is not a constructor, throw an appropriate TypeError.
2110 __ bind(&new_target_not_constructor); 2072 __ bind(&new_target_not_constructor);
2111 { 2073 {
2112 __ sd(a3, MemOperand(sp)); 2074 __ sd(a3, MemOperand(sp));
2113 __ TailCallRuntime(Runtime::kThrowCalledNonCallable); 2075 __ TailCallRuntime(Runtime::kThrowCalledNonCallable);
2114 } 2076 }
2115 } 2077 }
2116 2078
2117
2118 static void ArgumentAdaptorStackCheck(MacroAssembler* masm, 2079 static void ArgumentAdaptorStackCheck(MacroAssembler* masm,
2119 Label* stack_overflow) { 2080 Label* stack_overflow) {
2120 // ----------- S t a t e ------------- 2081 // ----------- S t a t e -------------
2121 // -- a0 : actual number of arguments 2082 // -- a0 : actual number of arguments
2122 // -- a1 : function (passed through to callee) 2083 // -- a1 : function (passed through to callee)
2123 // -- a2 : expected number of arguments 2084 // -- a2 : expected number of arguments
2124 // -- a3 : new target (passed through to callee) 2085 // -- a3 : new target (passed through to callee)
2125 // ----------------------------------- 2086 // -----------------------------------
2126 // Check the stack for overflow. We are not trying to catch 2087 // Check the stack for overflow. We are not trying to catch
2127 // interruptions (e.g. debug break and preemption) here, so the "real stack 2088 // interruptions (e.g. debug break and preemption) here, so the "real stack
2128 // limit" is checked. 2089 // limit" is checked.
2129 __ LoadRoot(a5, Heap::kRealStackLimitRootIndex); 2090 __ LoadRoot(a5, Heap::kRealStackLimitRootIndex);
2130 // Make a5 the space we have left. The stack might already be overflowed 2091 // Make a5 the space we have left. The stack might already be overflowed
2131 // here which will cause a5 to become negative. 2092 // here which will cause a5 to become negative.
2132 __ dsubu(a5, sp, a5); 2093 __ dsubu(a5, sp, a5);
2133 // Check if the arguments will overflow the stack. 2094 // Check if the arguments will overflow the stack.
2134 __ dsll(at, a2, kPointerSizeLog2); 2095 __ dsll(at, a2, kPointerSizeLog2);
2135 // Signed comparison. 2096 // Signed comparison.
2136 __ Branch(stack_overflow, le, a5, Operand(at)); 2097 __ Branch(stack_overflow, le, a5, Operand(at));
2137 } 2098 }
2138 2099
2139
2140 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) { 2100 static void EnterArgumentsAdaptorFrame(MacroAssembler* masm) {
2141 // __ sll(a0, a0, kSmiTagSize); 2101 // __ sll(a0, a0, kSmiTagSize);
2142 __ dsll32(a0, a0, 0); 2102 __ dsll32(a0, a0, 0);
2143 __ li(a4, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR))); 2103 __ li(a4, Operand(Smi::FromInt(StackFrame::ARGUMENTS_ADAPTOR)));
2144 __ MultiPush(a0.bit() | a1.bit() | a4.bit() | fp.bit() | ra.bit()); 2104 __ MultiPush(a0.bit() | a1.bit() | a4.bit() | fp.bit() | ra.bit());
2145 __ Daddu(fp, sp, 2105 __ Daddu(fp, sp, Operand(StandardFrameConstants::kFixedFrameSizeFromFp +
2146 Operand(StandardFrameConstants::kFixedFrameSizeFromFp + kPointerSize)); 2106 kPointerSize));
2147 } 2107 }
2148 2108
2149
2150 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) { 2109 static void LeaveArgumentsAdaptorFrame(MacroAssembler* masm) {
2151 // ----------- S t a t e ------------- 2110 // ----------- S t a t e -------------
2152 // -- v0 : result being passed through 2111 // -- v0 : result being passed through
2153 // ----------------------------------- 2112 // -----------------------------------
2154 // Get the number of arguments passed (as a smi), tear down the frame and 2113 // Get the number of arguments passed (as a smi), tear down the frame and
2155 // then tear down the parameters. 2114 // then tear down the parameters.
2156 __ ld(a1, MemOperand(fp, -(StandardFrameConstants::kFixedFrameSizeFromFp + 2115 __ ld(a1, MemOperand(fp, -(StandardFrameConstants::kFixedFrameSizeFromFp +
2157 kPointerSize))); 2116 kPointerSize)));
2158 __ mov(sp, fp); 2117 __ mov(sp, fp);
2159 __ MultiPop(fp.bit() | ra.bit()); 2118 __ MultiPop(fp.bit() | ra.bit());
2160 __ SmiScale(a4, a1, kPointerSizeLog2); 2119 __ SmiScale(a4, a1, kPointerSizeLog2);
2161 __ Daddu(sp, sp, a4); 2120 __ Daddu(sp, sp, a4);
2162 // Adjust for the receiver. 2121 // Adjust for the receiver.
2163 __ Daddu(sp, sp, Operand(kPointerSize)); 2122 __ Daddu(sp, sp, Operand(kPointerSize));
2164 } 2123 }
2165 2124
2166
2167 // static 2125 // static
2168 void Builtins::Generate_Apply(MacroAssembler* masm) { 2126 void Builtins::Generate_Apply(MacroAssembler* masm) {
2169 // ----------- S t a t e ------------- 2127 // ----------- S t a t e -------------
2170 // -- a0 : argumentsList 2128 // -- a0 : argumentsList
2171 // -- a1 : target 2129 // -- a1 : target
2172 // -- a3 : new.target (checked to be constructor or undefined) 2130 // -- a3 : new.target (checked to be constructor or undefined)
2173 // -- sp[0] : thisArgument 2131 // -- sp[0] : thisArgument
2174 // ----------------------------------- 2132 // -----------------------------------
2175 2133
2176 // Create the list of arguments from the array-like argumentsList. 2134 // Create the list of arguments from the array-like argumentsList.
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
2478 2436
2479 // The function is a "classConstructor", need to raise an exception. 2437 // The function is a "classConstructor", need to raise an exception.
2480 __ bind(&class_constructor); 2438 __ bind(&class_constructor);
2481 { 2439 {
2482 FrameScope frame(masm, StackFrame::INTERNAL); 2440 FrameScope frame(masm, StackFrame::INTERNAL);
2483 __ Push(a1); 2441 __ Push(a1);
2484 __ CallRuntime(Runtime::kThrowConstructorNonCallableError); 2442 __ CallRuntime(Runtime::kThrowConstructorNonCallableError);
2485 } 2443 }
2486 } 2444 }
2487 2445
2488
2489 // static 2446 // static
2490 void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm, 2447 void Builtins::Generate_CallBoundFunctionImpl(MacroAssembler* masm,
2491 TailCallMode tail_call_mode) { 2448 TailCallMode tail_call_mode) {
2492 // ----------- S t a t e ------------- 2449 // ----------- S t a t e -------------
2493 // -- a0 : the number of arguments (not including the receiver) 2450 // -- a0 : the number of arguments (not including the receiver)
2494 // -- a1 : the function to call (checked to be a JSBoundFunction) 2451 // -- a1 : the function to call (checked to be a JSBoundFunction)
2495 // ----------------------------------- 2452 // -----------------------------------
2496 __ AssertBoundFunction(a1); 2453 __ AssertBoundFunction(a1);
2497 2454
2498 if (tail_call_mode == TailCallMode::kAllow) { 2455 if (tail_call_mode == TailCallMode::kAllow) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2573 2530
2574 // Call the [[BoundTargetFunction]] via the Call builtin. 2531 // Call the [[BoundTargetFunction]] via the Call builtin.
2575 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); 2532 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset));
2576 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny, 2533 __ li(at, Operand(ExternalReference(Builtins::kCall_ReceiverIsAny,
2577 masm->isolate()))); 2534 masm->isolate())));
2578 __ ld(at, MemOperand(at)); 2535 __ ld(at, MemOperand(at));
2579 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); 2536 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag));
2580 __ Jump(at); 2537 __ Jump(at);
2581 } 2538 }
2582 2539
2583
2584 // static 2540 // static
2585 void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode, 2541 void Builtins::Generate_Call(MacroAssembler* masm, ConvertReceiverMode mode,
2586 TailCallMode tail_call_mode) { 2542 TailCallMode tail_call_mode) {
2587 // ----------- S t a t e ------------- 2543 // ----------- S t a t e -------------
2588 // -- a0 : the number of arguments (not including the receiver) 2544 // -- a0 : the number of arguments (not including the receiver)
2589 // -- a1 : the target to call (can be any Object). 2545 // -- a1 : the target to call (can be any Object).
2590 // ----------------------------------- 2546 // -----------------------------------
2591 2547
2592 Label non_callable, non_function, non_smi; 2548 Label non_callable, non_function, non_smi;
2593 __ JumpIfSmi(a1, &non_callable); 2549 __ JumpIfSmi(a1, &non_callable);
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
2633 2589
2634 // 3. Call to something that is not callable. 2590 // 3. Call to something that is not callable.
2635 __ bind(&non_callable); 2591 __ bind(&non_callable);
2636 { 2592 {
2637 FrameScope scope(masm, StackFrame::INTERNAL); 2593 FrameScope scope(masm, StackFrame::INTERNAL);
2638 __ Push(a1); 2594 __ Push(a1);
2639 __ CallRuntime(Runtime::kThrowCalledNonCallable); 2595 __ CallRuntime(Runtime::kThrowCalledNonCallable);
2640 } 2596 }
2641 } 2597 }
2642 2598
2643
2644 void Builtins::Generate_ConstructFunction(MacroAssembler* masm) { 2599 void Builtins::Generate_ConstructFunction(MacroAssembler* masm) {
2645 // ----------- S t a t e ------------- 2600 // ----------- S t a t e -------------
2646 // -- a0 : the number of arguments (not including the receiver) 2601 // -- a0 : the number of arguments (not including the receiver)
2647 // -- a1 : the constructor to call (checked to be a JSFunction) 2602 // -- a1 : the constructor to call (checked to be a JSFunction)
2648 // -- a3 : the new target (checked to be a constructor) 2603 // -- a3 : the new target (checked to be a constructor)
2649 // ----------------------------------- 2604 // -----------------------------------
2650 __ AssertFunction(a1); 2605 __ AssertFunction(a1);
2651 2606
2652 // Calling convention for function specific ConstructStubs require 2607 // Calling convention for function specific ConstructStubs require
2653 // a2 to contain either an AllocationSite or undefined. 2608 // a2 to contain either an AllocationSite or undefined.
2654 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex); 2609 __ LoadRoot(a2, Heap::kUndefinedValueRootIndex);
2655 2610
2656 // Tail call to the function-specific construct stub (still in the caller 2611 // Tail call to the function-specific construct stub (still in the caller
2657 // context at this point). 2612 // context at this point).
2658 __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset)); 2613 __ ld(a4, FieldMemOperand(a1, JSFunction::kSharedFunctionInfoOffset));
2659 __ ld(a4, FieldMemOperand(a4, SharedFunctionInfo::kConstructStubOffset)); 2614 __ ld(a4, FieldMemOperand(a4, SharedFunctionInfo::kConstructStubOffset));
2660 __ Daddu(at, a4, Operand(Code::kHeaderSize - kHeapObjectTag)); 2615 __ Daddu(at, a4, Operand(Code::kHeaderSize - kHeapObjectTag));
2661 __ Jump(at); 2616 __ Jump(at);
2662 } 2617 }
2663 2618
2664
2665 // static 2619 // static
2666 void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) { 2620 void Builtins::Generate_ConstructBoundFunction(MacroAssembler* masm) {
2667 // ----------- S t a t e ------------- 2621 // ----------- S t a t e -------------
2668 // -- a0 : the number of arguments (not including the receiver) 2622 // -- a0 : the number of arguments (not including the receiver)
2669 // -- a1 : the function to call (checked to be a JSBoundFunction) 2623 // -- a1 : the function to call (checked to be a JSBoundFunction)
2670 // -- a3 : the new target (checked to be a constructor) 2624 // -- a3 : the new target (checked to be a constructor)
2671 // ----------------------------------- 2625 // -----------------------------------
2672 __ AssertBoundFunction(a1); 2626 __ AssertBoundFunction(a1);
2673 2627
2674 // Load [[BoundArguments]] into a2 and length of that into a4. 2628 // Load [[BoundArguments]] into a2 and length of that into a4.
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
2746 } 2700 }
2747 2701
2748 // Construct the [[BoundTargetFunction]] via the Construct builtin. 2702 // Construct the [[BoundTargetFunction]] via the Construct builtin.
2749 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset)); 2703 __ ld(a1, FieldMemOperand(a1, JSBoundFunction::kBoundTargetFunctionOffset));
2750 __ li(at, Operand(ExternalReference(Builtins::kConstruct, masm->isolate()))); 2704 __ li(at, Operand(ExternalReference(Builtins::kConstruct, masm->isolate())));
2751 __ ld(at, MemOperand(at)); 2705 __ ld(at, MemOperand(at));
2752 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag)); 2706 __ Daddu(at, at, Operand(Code::kHeaderSize - kHeapObjectTag));
2753 __ Jump(at); 2707 __ Jump(at);
2754 } 2708 }
2755 2709
2756
2757 // static 2710 // static
2758 void Builtins::Generate_ConstructProxy(MacroAssembler* masm) { 2711 void Builtins::Generate_ConstructProxy(MacroAssembler* masm) {
2759 // ----------- S t a t e ------------- 2712 // ----------- S t a t e -------------
2760 // -- a0 : the number of arguments (not including the receiver) 2713 // -- a0 : the number of arguments (not including the receiver)
2761 // -- a1 : the constructor to call (checked to be a JSProxy) 2714 // -- a1 : the constructor to call (checked to be a JSProxy)
2762 // -- a3 : the new target (either the same as the constructor or 2715 // -- a3 : the new target (either the same as the constructor or
2763 // the JSFunction on which new was invoked initially) 2716 // the JSFunction on which new was invoked initially)
2764 // ----------------------------------- 2717 // -----------------------------------
2765 2718
2766 // Call into the Runtime for Proxy [[Construct]]. 2719 // Call into the Runtime for Proxy [[Construct]].
2767 __ Push(a1, a3); 2720 __ Push(a1, a3);
2768 // Include the pushed new_target, constructor and the receiver. 2721 // Include the pushed new_target, constructor and the receiver.
2769 __ Daddu(a0, a0, Operand(3)); 2722 __ Daddu(a0, a0, Operand(3));
2770 // Tail-call to the runtime. 2723 // Tail-call to the runtime.
2771 __ JumpToExternalReference( 2724 __ JumpToExternalReference(
2772 ExternalReference(Runtime::kJSProxyConstruct, masm->isolate())); 2725 ExternalReference(Runtime::kJSProxyConstruct, masm->isolate()));
2773 } 2726 }
2774 2727
2775
2776 // static 2728 // static
2777 void Builtins::Generate_Construct(MacroAssembler* masm) { 2729 void Builtins::Generate_Construct(MacroAssembler* masm) {
2778 // ----------- S t a t e ------------- 2730 // ----------- S t a t e -------------
2779 // -- a0 : the number of arguments (not including the receiver) 2731 // -- a0 : the number of arguments (not including the receiver)
2780 // -- a1 : the constructor to call (can be any Object) 2732 // -- a1 : the constructor to call (can be any Object)
2781 // -- a3 : the new target (either the same as the constructor or 2733 // -- a3 : the new target (either the same as the constructor or
2782 // the JSFunction on which new was invoked initially) 2734 // the JSFunction on which new was invoked initially)
2783 // ----------------------------------- 2735 // -----------------------------------
2784 2736
2785 // Check if target is a Smi. 2737 // Check if target is a Smi.
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
2931 // ----------- S t a t e ------------- 2883 // ----------- S t a t e -------------
2932 // -- a0: actual arguments count 2884 // -- a0: actual arguments count
2933 // -- a1: function (passed through to callee) 2885 // -- a1: function (passed through to callee)
2934 // -- a2: expected arguments count 2886 // -- a2: expected arguments count
2935 // -- a3: new target (passed through to callee) 2887 // -- a3: new target (passed through to callee)
2936 // ----------------------------------- 2888 // -----------------------------------
2937 2889
2938 Label invoke, dont_adapt_arguments, stack_overflow; 2890 Label invoke, dont_adapt_arguments, stack_overflow;
2939 2891
2940 Label enough, too_few; 2892 Label enough, too_few;
2941 __ Branch(&dont_adapt_arguments, eq, 2893 __ Branch(&dont_adapt_arguments, eq, a2,
2942 a2, Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel)); 2894 Operand(SharedFunctionInfo::kDontAdaptArgumentsSentinel));
2943 // We use Uless as the number of argument should always be greater than 0. 2895 // We use Uless as the number of argument should always be greater than 0.
2944 __ Branch(&too_few, Uless, a0, Operand(a2)); 2896 __ Branch(&too_few, Uless, a0, Operand(a2));
2945 2897
2946 { // Enough parameters: actual >= expected. 2898 { // Enough parameters: actual >= expected.
2947 // a0: actual number of arguments as a smi 2899 // a0: actual number of arguments as a smi
2948 // a1: function 2900 // a1: function
2949 // a2: expected number of arguments 2901 // a2: expected number of arguments
2950 // a3: new target (passed through to callee) 2902 // a3: new target (passed through to callee)
2951 __ bind(&enough); 2903 __ bind(&enough);
2952 EnterArgumentsAdaptorFrame(masm); 2904 EnterArgumentsAdaptorFrame(masm);
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 __ ld(a4, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); 2988 __ ld(a4, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
3037 __ Call(a4); 2989 __ Call(a4);
3038 2990
3039 // Store offset of return address for deoptimizer. 2991 // Store offset of return address for deoptimizer.
3040 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset()); 2992 masm->isolate()->heap()->SetArgumentsAdaptorDeoptPCOffset(masm->pc_offset());
3041 2993
3042 // Exit frame and return. 2994 // Exit frame and return.
3043 LeaveArgumentsAdaptorFrame(masm); 2995 LeaveArgumentsAdaptorFrame(masm);
3044 __ Ret(); 2996 __ Ret();
3045 2997
3046
3047 // ------------------------------------------- 2998 // -------------------------------------------
3048 // Don't adapt arguments. 2999 // Don't adapt arguments.
3049 // ------------------------------------------- 3000 // -------------------------------------------
3050 __ bind(&dont_adapt_arguments); 3001 __ bind(&dont_adapt_arguments);
3051 __ ld(a4, FieldMemOperand(a1, JSFunction::kCodeEntryOffset)); 3002 __ ld(a4, FieldMemOperand(a1, JSFunction::kCodeEntryOffset));
3052 __ Jump(a4); 3003 __ Jump(a4);
3053 3004
3054 __ bind(&stack_overflow); 3005 __ bind(&stack_overflow);
3055 { 3006 {
3056 FrameScope frame(masm, StackFrame::MANUAL); 3007 FrameScope frame(masm, StackFrame::MANUAL);
3057 __ CallRuntime(Runtime::kThrowStackOverflow); 3008 __ CallRuntime(Runtime::kThrowStackOverflow);
3058 __ break_(0xCC); 3009 __ break_(0xCC);
3059 } 3010 }
3060 } 3011 }
3061 3012
3062
3063 #undef __ 3013 #undef __
3064 3014
3065 } // namespace internal 3015 } // namespace internal
3066 } // namespace v8 3016 } // namespace v8
3067 3017
3068 #endif // V8_TARGET_ARCH_MIPS64 3018 #endif // V8_TARGET_ARCH_MIPS64
OLDNEW
« no previous file with comments | « src/builtins/mips64/OWNERS ('k') | src/builtins/ppc/OWNERS » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698