| 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/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
| (...skipping 2581 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2592 __ mr(r6, r4); | 2592 __ mr(r6, r4); |
| 2593 ArrayConstructorStub stub(masm->isolate(), arg_count()); | 2593 ArrayConstructorStub stub(masm->isolate(), arg_count()); |
| 2594 __ TailCallStub(&stub); | 2594 __ TailCallStub(&stub); |
| 2595 } | 2595 } |
| 2596 | 2596 |
| 2597 | 2597 |
| 2598 void CallICStub::Generate(MacroAssembler* masm) { | 2598 void CallICStub::Generate(MacroAssembler* masm) { |
| 2599 // r4 - function | 2599 // r4 - function |
| 2600 // r6 - slot id (Smi) | 2600 // r6 - slot id (Smi) |
| 2601 // r5 - vector | 2601 // r5 - vector |
| 2602 const int with_types_offset = | |
| 2603 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kWithTypesIndex); | |
| 2604 const int generic_offset = | |
| 2605 FixedArray::OffsetOfElementAt(TypeFeedbackVector::kGenericCountIndex); | |
| 2606 Label extra_checks_or_miss, call, call_function; | 2602 Label extra_checks_or_miss, call, call_function; |
| 2607 int argc = arg_count(); | 2603 int argc = arg_count(); |
| 2608 ParameterCount actual(argc); | 2604 ParameterCount actual(argc); |
| 2609 | 2605 |
| 2610 // The checks. First, does r4 match the recorded monomorphic target? | 2606 // The checks. First, does r4 match the recorded monomorphic target? |
| 2611 __ SmiToPtrArrayOffset(r9, r6); | 2607 __ SmiToPtrArrayOffset(r9, r6); |
| 2612 __ add(r9, r5, r9); | 2608 __ add(r9, r5, r9); |
| 2613 __ LoadP(r7, FieldMemOperand(r9, FixedArray::kHeaderSize)); | 2609 __ LoadP(r7, FieldMemOperand(r9, FixedArray::kHeaderSize)); |
| 2614 | 2610 |
| 2615 // We don't know that we have a weak cell. We might have a private symbol | 2611 // We don't know that we have a weak cell. We might have a private symbol |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2670 __ CompareRoot(r7, Heap::kuninitialized_symbolRootIndex); | 2666 __ CompareRoot(r7, Heap::kuninitialized_symbolRootIndex); |
| 2671 __ beq(&uninitialized); | 2667 __ beq(&uninitialized); |
| 2672 | 2668 |
| 2673 // We are going megamorphic. If the feedback is a JSFunction, it is fine | 2669 // We are going megamorphic. If the feedback is a JSFunction, it is fine |
| 2674 // to handle it here. More complex cases are dealt with in the runtime. | 2670 // to handle it here. More complex cases are dealt with in the runtime. |
| 2675 __ AssertNotSmi(r7); | 2671 __ AssertNotSmi(r7); |
| 2676 __ CompareObjectType(r7, r8, r8, JS_FUNCTION_TYPE); | 2672 __ CompareObjectType(r7, r8, r8, JS_FUNCTION_TYPE); |
| 2677 __ bne(&miss); | 2673 __ bne(&miss); |
| 2678 __ LoadRoot(ip, Heap::kmegamorphic_symbolRootIndex); | 2674 __ LoadRoot(ip, Heap::kmegamorphic_symbolRootIndex); |
| 2679 __ StoreP(ip, FieldMemOperand(r9, FixedArray::kHeaderSize), r0); | 2675 __ StoreP(ip, FieldMemOperand(r9, FixedArray::kHeaderSize), r0); |
| 2680 // We have to update statistics for runtime profiling. | |
| 2681 __ LoadP(r7, FieldMemOperand(r5, with_types_offset)); | |
| 2682 __ SubSmiLiteral(r7, r7, Smi::FromInt(1), r0); | |
| 2683 __ StoreP(r7, FieldMemOperand(r5, with_types_offset), r0); | |
| 2684 __ LoadP(r7, FieldMemOperand(r5, generic_offset)); | |
| 2685 __ AddSmiLiteral(r7, r7, Smi::FromInt(1), r0); | |
| 2686 __ StoreP(r7, FieldMemOperand(r5, generic_offset), r0); | |
| 2687 | 2676 |
| 2688 __ bind(&call); | 2677 __ bind(&call); |
| 2689 __ mov(r3, Operand(argc)); | 2678 __ mov(r3, Operand(argc)); |
| 2690 __ Jump(masm->isolate()->builtins()->Call(convert_mode()), | 2679 __ Jump(masm->isolate()->builtins()->Call(convert_mode()), |
| 2691 RelocInfo::CODE_TARGET); | 2680 RelocInfo::CODE_TARGET); |
| 2692 | 2681 |
| 2693 __ bind(&uninitialized); | 2682 __ bind(&uninitialized); |
| 2694 | 2683 |
| 2695 // We are going monomorphic, provided we actually have a JSFunction. | 2684 // We are going monomorphic, provided we actually have a JSFunction. |
| 2696 __ JumpIfSmi(r4, &miss); | 2685 __ JumpIfSmi(r4, &miss); |
| 2697 | 2686 |
| 2698 // Goto miss case if we do not have a function. | 2687 // Goto miss case if we do not have a function. |
| 2699 __ CompareObjectType(r4, r7, r7, JS_FUNCTION_TYPE); | 2688 __ CompareObjectType(r4, r7, r7, JS_FUNCTION_TYPE); |
| 2700 __ bne(&miss); | 2689 __ bne(&miss); |
| 2701 | 2690 |
| 2702 // Make sure the function is not the Array() function, which requires special | 2691 // Make sure the function is not the Array() function, which requires special |
| 2703 // behavior on MISS. | 2692 // behavior on MISS. |
| 2704 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, r7); | 2693 __ LoadNativeContextSlot(Context::ARRAY_FUNCTION_INDEX, r7); |
| 2705 __ cmp(r4, r7); | 2694 __ cmp(r4, r7); |
| 2706 __ beq(&miss); | 2695 __ beq(&miss); |
| 2707 | 2696 |
| 2708 // Make sure the function belongs to the same native context. | 2697 // Make sure the function belongs to the same native context. |
| 2709 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kContextOffset)); | 2698 __ LoadP(r7, FieldMemOperand(r4, JSFunction::kContextOffset)); |
| 2710 __ LoadP(r7, ContextMemOperand(r7, Context::NATIVE_CONTEXT_INDEX)); | 2699 __ LoadP(r7, ContextMemOperand(r7, Context::NATIVE_CONTEXT_INDEX)); |
| 2711 __ LoadP(ip, NativeContextMemOperand()); | 2700 __ LoadP(ip, NativeContextMemOperand()); |
| 2712 __ cmp(r7, ip); | 2701 __ cmp(r7, ip); |
| 2713 __ bne(&miss); | 2702 __ bne(&miss); |
| 2714 | 2703 |
| 2715 // Update stats. | |
| 2716 __ LoadP(r7, FieldMemOperand(r5, with_types_offset)); | |
| 2717 __ AddSmiLiteral(r7, r7, Smi::FromInt(1), r0); | |
| 2718 __ StoreP(r7, FieldMemOperand(r5, with_types_offset), r0); | |
| 2719 | |
| 2720 // Initialize the call counter. | 2704 // Initialize the call counter. |
| 2721 __ LoadSmiLiteral(r8, Smi::FromInt(CallICNexus::kCallCountIncrement)); | 2705 __ LoadSmiLiteral(r8, Smi::FromInt(CallICNexus::kCallCountIncrement)); |
| 2722 __ StoreP(r8, FieldMemOperand(r9, count_offset), r0); | 2706 __ StoreP(r8, FieldMemOperand(r9, count_offset), r0); |
| 2723 | 2707 |
| 2724 // Store the function. Use a stub since we need a frame for allocation. | 2708 // Store the function. Use a stub since we need a frame for allocation. |
| 2725 // r5 - vector | 2709 // r5 - vector |
| 2726 // r6 - slot | 2710 // r6 - slot |
| 2727 // r4 - function | 2711 // r4 - function |
| 2728 { | 2712 { |
| 2729 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); | 2713 FrameAndConstantPoolScope scope(masm, StackFrame::INTERNAL); |
| (...skipping 2924 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5654 kStackUnwindSpace, NULL, | 5638 kStackUnwindSpace, NULL, |
| 5655 MemOperand(fp, 6 * kPointerSize), NULL); | 5639 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5656 } | 5640 } |
| 5657 | 5641 |
| 5658 | 5642 |
| 5659 #undef __ | 5643 #undef __ |
| 5660 } // namespace internal | 5644 } // namespace internal |
| 5661 } // namespace v8 | 5645 } // namespace v8 |
| 5662 | 5646 |
| 5663 #endif // V8_TARGET_ARCH_PPC | 5647 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |