| OLD | NEW |
| 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 #if V8_TARGET_ARCH_PPC | 5 #if V8_TARGET_ARCH_PPC |
| 6 | 6 |
| 7 #include "src/code-stubs.h" | 7 #include "src/code-stubs.h" |
| 8 #include "src/api-arguments.h" | 8 #include "src/api-arguments.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 3504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3515 | 3515 |
| 3516 Label fast_elements_case; | 3516 Label fast_elements_case; |
| 3517 __ cmpi(r6, Operand(FAST_ELEMENTS)); | 3517 __ cmpi(r6, Operand(FAST_ELEMENTS)); |
| 3518 __ beq(&fast_elements_case); | 3518 __ beq(&fast_elements_case); |
| 3519 GenerateCase(masm, FAST_HOLEY_ELEMENTS); | 3519 GenerateCase(masm, FAST_HOLEY_ELEMENTS); |
| 3520 | 3520 |
| 3521 __ bind(&fast_elements_case); | 3521 __ bind(&fast_elements_case); |
| 3522 GenerateCase(masm, FAST_ELEMENTS); | 3522 GenerateCase(masm, FAST_ELEMENTS); |
| 3523 } | 3523 } |
| 3524 | 3524 |
| 3525 void FastNewObjectStub::Generate(MacroAssembler* masm) { | |
| 3526 // ----------- S t a t e ------------- | |
| 3527 // -- r4 : target | |
| 3528 // -- r6 : new target | |
| 3529 // -- cp : context | |
| 3530 // -- lr : return address | |
| 3531 // ----------------------------------- | |
| 3532 __ AssertFunction(r4); | |
| 3533 __ AssertReceiver(r6); | |
| 3534 | |
| 3535 // Verify that the new target is a JSFunction. | |
| 3536 Label new_object; | |
| 3537 __ CompareObjectType(r6, r5, r5, JS_FUNCTION_TYPE); | |
| 3538 __ bne(&new_object); | |
| 3539 | |
| 3540 // Load the initial map and verify that it's in fact a map. | |
| 3541 __ LoadP(r5, FieldMemOperand(r6, JSFunction::kPrototypeOrInitialMapOffset)); | |
| 3542 __ JumpIfSmi(r5, &new_object); | |
| 3543 __ CompareObjectType(r5, r3, r3, MAP_TYPE); | |
| 3544 __ bne(&new_object); | |
| 3545 | |
| 3546 // Fall back to runtime if the target differs from the new target's | |
| 3547 // initial map constructor. | |
| 3548 __ LoadP(r3, FieldMemOperand(r5, Map::kConstructorOrBackPointerOffset)); | |
| 3549 __ cmp(r3, r4); | |
| 3550 __ bne(&new_object); | |
| 3551 | |
| 3552 // Allocate the JSObject on the heap. | |
| 3553 Label allocate, done_allocate; | |
| 3554 __ lbz(r7, FieldMemOperand(r5, Map::kInstanceSizeOffset)); | |
| 3555 __ Allocate(r7, r3, r8, r9, &allocate, SIZE_IN_WORDS); | |
| 3556 __ bind(&done_allocate); | |
| 3557 | |
| 3558 // Initialize the JSObject fields. | |
| 3559 __ StoreP(r5, FieldMemOperand(r3, JSObject::kMapOffset), r0); | |
| 3560 __ LoadRoot(r6, Heap::kEmptyFixedArrayRootIndex); | |
| 3561 __ StoreP(r6, FieldMemOperand(r3, JSObject::kPropertiesOffset), r0); | |
| 3562 __ StoreP(r6, FieldMemOperand(r3, JSObject::kElementsOffset), r0); | |
| 3563 STATIC_ASSERT(JSObject::kHeaderSize == 3 * kPointerSize); | |
| 3564 __ addi(r4, r3, Operand(JSObject::kHeaderSize - kHeapObjectTag)); | |
| 3565 | |
| 3566 // ----------- S t a t e ------------- | |
| 3567 // -- r3 : result (tagged) | |
| 3568 // -- r4 : result fields (untagged) | |
| 3569 // -- r8 : result end (untagged) | |
| 3570 // -- r5 : initial map | |
| 3571 // -- cp : context | |
| 3572 // -- lr : return address | |
| 3573 // ----------------------------------- | |
| 3574 | |
| 3575 // Perform in-object slack tracking if requested. | |
| 3576 Label slack_tracking; | |
| 3577 STATIC_ASSERT(Map::kNoSlackTracking == 0); | |
| 3578 __ LoadRoot(r9, Heap::kUndefinedValueRootIndex); | |
| 3579 __ lwz(r6, FieldMemOperand(r5, Map::kBitField3Offset)); | |
| 3580 __ DecodeField<Map::ConstructionCounter>(r10, r6, SetRC); | |
| 3581 __ bne(&slack_tracking, cr0); | |
| 3582 { | |
| 3583 // Initialize all in-object fields with undefined. | |
| 3584 __ InitializeFieldsWithFiller(r4, r8, r9); | |
| 3585 __ Ret(); | |
| 3586 } | |
| 3587 __ bind(&slack_tracking); | |
| 3588 { | |
| 3589 // Decrease generous allocation count. | |
| 3590 STATIC_ASSERT(Map::ConstructionCounter::kNext == 32); | |
| 3591 __ Add(r6, r6, -(1 << Map::ConstructionCounter::kShift), r0); | |
| 3592 __ stw(r6, FieldMemOperand(r5, Map::kBitField3Offset)); | |
| 3593 | |
| 3594 // Initialize the in-object fields with undefined. | |
| 3595 __ lbz(r7, FieldMemOperand(r5, Map::kUnusedPropertyFieldsOffset)); | |
| 3596 __ ShiftLeftImm(r7, r7, Operand(kPointerSizeLog2)); | |
| 3597 __ sub(r7, r8, r7); | |
| 3598 __ InitializeFieldsWithFiller(r4, r7, r9); | |
| 3599 | |
| 3600 // Initialize the remaining (reserved) fields with one pointer filler map. | |
| 3601 __ LoadRoot(r9, Heap::kOnePointerFillerMapRootIndex); | |
| 3602 __ InitializeFieldsWithFiller(r4, r8, r9); | |
| 3603 | |
| 3604 // Check if we can finalize the instance size. | |
| 3605 __ cmpi(r10, Operand(Map::kSlackTrackingCounterEnd)); | |
| 3606 __ Ret(ne); | |
| 3607 | |
| 3608 // Finalize the instance size. | |
| 3609 { | |
| 3610 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | |
| 3611 __ Push(r3, r5); | |
| 3612 __ CallRuntime(Runtime::kFinalizeInstanceSize); | |
| 3613 __ Pop(r3); | |
| 3614 } | |
| 3615 __ Ret(); | |
| 3616 } | |
| 3617 | |
| 3618 // Fall back to %AllocateInNewSpace. | |
| 3619 __ bind(&allocate); | |
| 3620 { | |
| 3621 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | |
| 3622 STATIC_ASSERT(kSmiTag == 0); | |
| 3623 __ ShiftLeftImm(r7, r7, | |
| 3624 Operand(kPointerSizeLog2 + kSmiTagSize + kSmiShiftSize)); | |
| 3625 __ Push(r5, r7); | |
| 3626 __ CallRuntime(Runtime::kAllocateInNewSpace); | |
| 3627 __ Pop(r5); | |
| 3628 } | |
| 3629 __ lbz(r8, FieldMemOperand(r5, Map::kInstanceSizeOffset)); | |
| 3630 __ ShiftLeftImm(r8, r8, Operand(kPointerSizeLog2)); | |
| 3631 __ add(r8, r3, r8); | |
| 3632 __ subi(r8, r8, Operand(kHeapObjectTag)); | |
| 3633 __ b(&done_allocate); | |
| 3634 | |
| 3635 // Fall back to %NewObject. | |
| 3636 __ bind(&new_object); | |
| 3637 __ Push(r4, r6); | |
| 3638 __ TailCallRuntime(Runtime::kNewObject); | |
| 3639 } | |
| 3640 | |
| 3641 void FastNewRestParameterStub::Generate(MacroAssembler* masm) { | 3525 void FastNewRestParameterStub::Generate(MacroAssembler* masm) { |
| 3642 // ----------- S t a t e ------------- | 3526 // ----------- S t a t e ------------- |
| 3643 // -- r4 : function | 3527 // -- r4 : function |
| 3644 // -- cp : context | 3528 // -- cp : context |
| 3645 // -- fp : frame pointer | 3529 // -- fp : frame pointer |
| 3646 // -- lr : return address | 3530 // -- lr : return address |
| 3647 // ----------------------------------- | 3531 // ----------------------------------- |
| 3648 __ AssertFunction(r4); | 3532 __ AssertFunction(r4); |
| 3649 | 3533 |
| 3650 // Make r5 point to the JavaScript frame. | 3534 // Make r5 point to the JavaScript frame. |
| (...skipping 884 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4535 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); | 4419 fp, (PropertyCallbackArguments::kReturnValueOffset + 3) * kPointerSize); |
| 4536 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, | 4420 CallApiFunctionAndReturn(masm, api_function_address, thunk_ref, |
| 4537 kStackUnwindSpace, NULL, return_value_operand, NULL); | 4421 kStackUnwindSpace, NULL, return_value_operand, NULL); |
| 4538 } | 4422 } |
| 4539 | 4423 |
| 4540 #undef __ | 4424 #undef __ |
| 4541 } // namespace internal | 4425 } // namespace internal |
| 4542 } // namespace v8 | 4426 } // namespace v8 |
| 4543 | 4427 |
| 4544 #endif // V8_TARGET_ARCH_PPC | 4428 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |