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 |