OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_ARM64 | 7 #if V8_TARGET_ARCH_ARM64 |
8 | 8 |
9 #include "src/codegen.h" | 9 #include "src/codegen.h" |
10 #include "src/debug.h" | 10 #include "src/debug.h" |
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 ASM_LOCATION("Builtins::Generate_JSConstructStubHelper"); | 317 ASM_LOCATION("Builtins::Generate_JSConstructStubHelper"); |
318 // Should never create mementos for api functions. | 318 // Should never create mementos for api functions. |
319 DCHECK(!is_api_function || !create_memento); | 319 DCHECK(!is_api_function || !create_memento); |
320 | 320 |
321 Isolate* isolate = masm->isolate(); | 321 Isolate* isolate = masm->isolate(); |
322 | 322 |
323 // Enter a construct frame. | 323 // Enter a construct frame. |
324 { | 324 { |
325 FrameScope scope(masm, StackFrame::CONSTRUCT); | 325 FrameScope scope(masm, StackFrame::CONSTRUCT); |
326 | 326 |
327 // Preserve the three incoming parameters on the stack. | 327 // Preserve the four incoming parameters on the stack. |
328 if (create_memento) { | |
329 __ AssertUndefinedOrAllocationSite(x2, x10); | |
330 __ Push(x2); | |
331 } | |
332 | |
333 Register argc = x0; | 328 Register argc = x0; |
334 Register constructor = x1; | 329 Register constructor = x1; |
| 330 Register allocation_site = x2; |
335 Register original_constructor = x3; | 331 Register original_constructor = x3; |
336 | 332 |
337 // Preserve the incoming parameters on the stack. | 333 // Preserve the incoming parameters on the stack. |
| 334 __ AssertUndefinedOrAllocationSite(allocation_site, x10); |
338 __ SmiTag(argc); | 335 __ SmiTag(argc); |
339 __ Push(argc, constructor, original_constructor); | 336 __ Push(allocation_site, argc, constructor, original_constructor); |
340 // sp[0]: new.target | 337 // sp[0]: new.target |
341 // sp[1]: Constructor function. | 338 // sp[1]: Constructor function. |
342 // sp[2]: number of arguments (smi-tagged) | 339 // sp[2]: number of arguments (smi-tagged) |
| 340 // sp[3]: allocation site |
343 | 341 |
344 // Try to allocate the object without transitioning into C code. If any of | 342 // Try to allocate the object without transitioning into C code. If any of |
345 // the preconditions is not met, the code bails out to the runtime call. | 343 // the preconditions is not met, the code bails out to the runtime call. |
346 Label rt_call, allocated; | 344 Label rt_call, allocated; |
347 if (FLAG_inline_new) { | 345 if (FLAG_inline_new) { |
348 ExternalReference debug_step_in_fp = | 346 ExternalReference debug_step_in_fp = |
349 ExternalReference::debug_step_in_fp_address(isolate); | 347 ExternalReference::debug_step_in_fp_address(isolate); |
350 __ Mov(x2, Operand(debug_step_in_fp)); | 348 __ Mov(x2, Operand(debug_step_in_fp)); |
351 __ Ldr(x2, MemOperand(x2)); | 349 __ Ldr(x2, MemOperand(x2)); |
352 __ Cbnz(x2, &rt_call); | 350 __ Cbnz(x2, &rt_call); |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 __ bind(&no_inobject_slack_tracking); | 474 __ bind(&no_inobject_slack_tracking); |
477 } | 475 } |
478 if (create_memento) { | 476 if (create_memento) { |
479 // Fill the pre-allocated fields with undef. | 477 // Fill the pre-allocated fields with undef. |
480 __ FillFields(first_prop, prop_fields, filler); | 478 __ FillFields(first_prop, prop_fields, filler); |
481 __ Add(first_prop, new_obj, Operand(obj_size, LSL, kPointerSizeLog2)); | 479 __ Add(first_prop, new_obj, Operand(obj_size, LSL, kPointerSizeLog2)); |
482 __ LoadRoot(x14, Heap::kAllocationMementoMapRootIndex); | 480 __ LoadRoot(x14, Heap::kAllocationMementoMapRootIndex); |
483 DCHECK_EQ(0 * kPointerSize, AllocationMemento::kMapOffset); | 481 DCHECK_EQ(0 * kPointerSize, AllocationMemento::kMapOffset); |
484 __ Str(x14, MemOperand(first_prop, kPointerSize, PostIndex)); | 482 __ Str(x14, MemOperand(first_prop, kPointerSize, PostIndex)); |
485 // Load the AllocationSite | 483 // Load the AllocationSite |
486 __ Peek(x14, 2 * kXRegSize); | 484 __ Peek(x14, 3 * kXRegSize); |
| 485 __ AssertUndefinedOrAllocationSite(x14, x10); |
487 DCHECK_EQ(1 * kPointerSize, AllocationMemento::kAllocationSiteOffset); | 486 DCHECK_EQ(1 * kPointerSize, AllocationMemento::kAllocationSiteOffset); |
488 __ Str(x14, MemOperand(first_prop, kPointerSize, PostIndex)); | 487 __ Str(x14, MemOperand(first_prop, kPointerSize, PostIndex)); |
489 first_prop = NoReg; | 488 first_prop = NoReg; |
490 } else { | 489 } else { |
491 // Fill all of the property fields with undef. | 490 // Fill all of the property fields with undef. |
492 __ FillFields(first_prop, prop_fields, filler); | 491 __ FillFields(first_prop, prop_fields, filler); |
493 first_prop = NoReg; | 492 first_prop = NoReg; |
494 prop_fields = NoReg; | 493 prop_fields = NoReg; |
495 } | 494 } |
496 | 495 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
662 // ----------- S t a t e ------------- | 661 // ----------- S t a t e ------------- |
663 // -- x0 : number of arguments | 662 // -- x0 : number of arguments |
664 // -- x1 : constructor function | 663 // -- x1 : constructor function |
665 // -- x2 : allocation site or undefined | 664 // -- x2 : allocation site or undefined |
666 // -- x3 : original constructor | 665 // -- x3 : original constructor |
667 // -- lr : return address | 666 // -- lr : return address |
668 // -- sp[...]: constructor arguments | 667 // -- sp[...]: constructor arguments |
669 // ----------------------------------- | 668 // ----------------------------------- |
670 ASM_LOCATION("Builtins::Generate_JSConstructStubForDerived"); | 669 ASM_LOCATION("Builtins::Generate_JSConstructStubForDerived"); |
671 | 670 |
672 // TODO(dslomov): support pretenuring | |
673 CHECK(!FLAG_pretenuring_call_new); | |
674 | |
675 { | 671 { |
676 FrameScope frame_scope(masm, StackFrame::CONSTRUCT); | 672 FrameScope frame_scope(masm, StackFrame::CONSTRUCT); |
| 673 |
| 674 __ AssertUndefinedOrAllocationSite(x2, x10); |
677 __ Mov(x4, x0); | 675 __ Mov(x4, x0); |
678 __ SmiTag(x4); | 676 __ SmiTag(x4); |
679 __ LoadRoot(x10, Heap::kTheHoleValueRootIndex); | 677 __ LoadRoot(x10, Heap::kTheHoleValueRootIndex); |
680 __ Push(x4, x3, x10); | 678 __ Push(x2, x4, x3, x10); |
681 // sp[0]: number of arguments | 679 // sp[0]: receiver (the hole) |
682 // sp[1]: new.target | 680 // sp[1]: new.target |
683 // sp[2]: receiver (the hole) | 681 // sp[2]: number of arguments |
| 682 // sp[3]: allocation site |
684 | 683 |
685 // Set up pointer to last argument. | 684 // Set up pointer to last argument. |
686 __ Add(x2, fp, StandardFrameConstants::kCallerSPOffset); | 685 __ Add(x2, fp, StandardFrameConstants::kCallerSPOffset); |
687 | 686 |
688 // Copy arguments and receiver to the expression stack. | 687 // Copy arguments and receiver to the expression stack. |
689 // Copy 2 values every loop to use ldp/stp. | 688 // Copy 2 values every loop to use ldp/stp. |
690 // x0: number of arguments | 689 // x0: number of arguments |
691 // x1: constructor function | 690 // x1: constructor function |
692 // x2: address of last argument (caller sp) | 691 // x2: address of last argument (caller sp) |
693 // jssp[0]: receiver | 692 // jssp[0]: receiver |
(...skipping 1095 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1789 } | 1788 } |
1790 } | 1789 } |
1791 | 1790 |
1792 | 1791 |
1793 #undef __ | 1792 #undef __ |
1794 | 1793 |
1795 } // namespace internal | 1794 } // namespace internal |
1796 } // namespace v8 | 1795 } // namespace v8 |
1797 | 1796 |
1798 #endif // V8_TARGET_ARCH_ARM | 1797 #endif // V8_TARGET_ARCH_ARM |
OLD | NEW |