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

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

Issue 1229163005: PPC: Fix memento initialization when constructing from new call (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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 | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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_PPC 7 #if V8_TARGET_ARCH_PPC
8 8
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/debug.h" 10 #include "src/debug.h"
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after
321 321
322 // Should never create mementos for api functions. 322 // Should never create mementos for api functions.
323 DCHECK(!is_api_function || !create_memento); 323 DCHECK(!is_api_function || !create_memento);
324 324
325 Isolate* isolate = masm->isolate(); 325 Isolate* isolate = masm->isolate();
326 326
327 // Enter a construct frame. 327 // Enter a construct frame.
328 { 328 {
329 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT); 329 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT);
330 330
331 if (create_memento) {
332 __ AssertUndefinedOrAllocationSite(r5, r7);
333 __ push(r5);
334 }
335
336 // Preserve the incoming parameters on the stack. 331 // Preserve the incoming parameters on the stack.
332 __ AssertUndefinedOrAllocationSite(r5, r7);
337 __ SmiTag(r3); 333 __ SmiTag(r3);
338 __ Push(r3, r4, r6); 334 __ Push(r5, r3, r4, r6);
339 335
340 // Try to allocate the object without transitioning into C code. If any of 336 // Try to allocate the object without transitioning into C code. If any of
341 // the preconditions is not met, the code bails out to the runtime call. 337 // the preconditions is not met, the code bails out to the runtime call.
342 Label rt_call, allocated; 338 Label rt_call, allocated;
343 if (FLAG_inline_new) { 339 if (FLAG_inline_new) {
344 ExternalReference debug_step_in_fp = 340 ExternalReference debug_step_in_fp =
345 ExternalReference::debug_step_in_fp_address(isolate); 341 ExternalReference::debug_step_in_fp_address(isolate);
346 __ mov(r5, Operand(debug_step_in_fp)); 342 __ mov(r5, Operand(debug_step_in_fp));
347 __ LoadP(r5, MemOperand(r5)); 343 __ LoadP(r5, MemOperand(r5));
348 __ cmpi(r5, Operand::Zero()); 344 __ cmpi(r5, Operand::Zero());
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 459
464 if (create_memento) { 460 if (create_memento) {
465 __ subi(r3, r9, Operand(AllocationMemento::kSize)); 461 __ subi(r3, r9, Operand(AllocationMemento::kSize));
466 __ InitializeFieldsWithFiller(r8, r3, r10); 462 __ InitializeFieldsWithFiller(r8, r3, r10);
467 463
468 // Fill in memento fields. 464 // Fill in memento fields.
469 // r8: points to the allocated but uninitialized memento. 465 // r8: points to the allocated but uninitialized memento.
470 __ LoadRoot(r10, Heap::kAllocationMementoMapRootIndex); 466 __ LoadRoot(r10, Heap::kAllocationMementoMapRootIndex);
471 __ StoreP(r10, MemOperand(r8, AllocationMemento::kMapOffset)); 467 __ StoreP(r10, MemOperand(r8, AllocationMemento::kMapOffset));
472 // Load the AllocationSite 468 // Load the AllocationSite
473 __ LoadP(r10, MemOperand(sp, 2 * kPointerSize)); 469 __ LoadP(r10, MemOperand(sp, 3 * kPointerSize));
470 __ AssertUndefinedOrAllocationSite(r10, r3);
474 __ StoreP(r10, 471 __ StoreP(r10,
475 MemOperand(r8, AllocationMemento::kAllocationSiteOffset)); 472 MemOperand(r8, AllocationMemento::kAllocationSiteOffset));
476 __ addi(r8, r8, Operand(AllocationMemento::kAllocationSiteOffset + 473 __ addi(r8, r8, Operand(AllocationMemento::kAllocationSiteOffset +
477 kPointerSize)); 474 kPointerSize));
478 } else { 475 } else {
479 __ InitializeFieldsWithFiller(r8, r9, r10); 476 __ InitializeFieldsWithFiller(r8, r9, r10);
480 } 477 }
481 478
482 // Add the object tag to make the JSObject real, so that we can continue 479 // Add the object tag to make the JSObject real, so that we can continue
483 // and jump into the continuation code at any time from now on. 480 // and jump into the continuation code at any time from now on.
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 void Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) { 644 void Builtins::Generate_JSConstructStubForDerived(MacroAssembler* masm) {
648 // ----------- S t a t e ------------- 645 // ----------- S t a t e -------------
649 // -- r3 : number of arguments 646 // -- r3 : number of arguments
650 // -- r4 : constructor function 647 // -- r4 : constructor function
651 // -- r5 : allocation site or undefined 648 // -- r5 : allocation site or undefined
652 // -- r6 : original constructor 649 // -- r6 : original constructor
653 // -- lr : return address 650 // -- lr : return address
654 // -- sp[...]: constructor arguments 651 // -- sp[...]: constructor arguments
655 // ----------------------------------- 652 // -----------------------------------
656 653
657 // TODO(dslomov): support pretenuring
658 CHECK(!FLAG_pretenuring_call_new);
659
660 { 654 {
661 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT); 655 FrameAndConstantPoolScope scope(masm, StackFrame::CONSTRUCT);
662 656
657 __ AssertUndefinedOrAllocationSite(r5, r7);
658
663 // Smi-tagged arguments count. 659 // Smi-tagged arguments count.
664 __ mr(r7, r3); 660 __ mr(r7, r3);
665 __ SmiTag(r7, SetRC); 661 __ SmiTag(r7, SetRC);
666 662
667 // receiver is the hole. 663 // receiver is the hole.
668 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex); 664 __ LoadRoot(ip, Heap::kTheHoleValueRootIndex);
669 665
670 // smi arguments count, new.target, receiver 666 // allocation site, smi arguments count, new.target, receiver
671 __ Push(r7, r6, ip); 667 __ Push(r5, r7, r6, ip);
672 668
673 // Set up pointer to last argument. 669 // Set up pointer to last argument.
674 __ addi(r5, fp, Operand(StandardFrameConstants::kCallerSPOffset)); 670 __ addi(r5, fp, Operand(StandardFrameConstants::kCallerSPOffset));
675 671
676 // Copy arguments and receiver to the expression stack. 672 // Copy arguments and receiver to the expression stack.
677 // r3: number of arguments 673 // r3: number of arguments
678 // r4: constructor function 674 // r4: constructor function
679 // r5: address of last argument (caller sp) 675 // r5: address of last argument (caller sp)
680 // r7: number of arguments (smi-tagged) 676 // r7: number of arguments (smi-tagged)
681 // cr0: compare against zero of arguments 677 // cr0: compare against zero of arguments
(...skipping 1100 matching lines...) Expand 10 before | Expand all | Expand 10 after
1782 __ bkpt(0); 1778 __ bkpt(0);
1783 } 1779 }
1784 } 1780 }
1785 1781
1786 1782
1787 #undef __ 1783 #undef __
1788 } // namespace internal 1784 } // namespace internal
1789 } // namespace v8 1785 } // namespace v8
1790 1786
1791 #endif // V8_TARGET_ARCH_PPC 1787 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698