| 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 #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/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 1556 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1567 __ Ret(HasArgsInRegisters() ? 0 : 2); | 1567 __ Ret(HasArgsInRegisters() ? 0 : 2); |
| 1568 } | 1568 } |
| 1569 } | 1569 } |
| 1570 | 1570 |
| 1571 | 1571 |
| 1572 void FunctionPrototypeStub::Generate(MacroAssembler* masm) { | 1572 void FunctionPrototypeStub::Generate(MacroAssembler* masm) { |
| 1573 Label miss; | 1573 Label miss; |
| 1574 Register receiver = LoadDescriptor::ReceiverRegister(); | 1574 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 1575 // Ensure that the vector and slot registers won't be clobbered before | 1575 // Ensure that the vector and slot registers won't be clobbered before |
| 1576 // calling the miss handler. | 1576 // calling the miss handler. |
| 1577 DCHECK(!FLAG_vector_ics || | 1577 DCHECK(!AreAliased(r7, r8, VectorLoadICDescriptor::VectorRegister(), |
| 1578 !AreAliased(r7, r8, VectorLoadICDescriptor::VectorRegister(), | |
| 1579 VectorLoadICDescriptor::SlotRegister())); | 1578 VectorLoadICDescriptor::SlotRegister())); |
| 1580 | 1579 |
| 1581 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, r7, | 1580 NamedLoadHandlerCompiler::GenerateLoadFunctionPrototype(masm, receiver, r7, |
| 1582 r8, &miss); | 1581 r8, &miss); |
| 1583 __ bind(&miss); | 1582 __ bind(&miss); |
| 1584 PropertyAccessCompiler::TailCallBuiltin( | 1583 PropertyAccessCompiler::TailCallBuiltin( |
| 1585 masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC)); | 1584 masm, PropertyAccessCompiler::MissBuiltin(Code::LOAD_IC)); |
| 1586 } | 1585 } |
| 1587 | 1586 |
| 1588 | 1587 |
| 1589 void LoadIndexedStringStub::Generate(MacroAssembler* masm) { | 1588 void LoadIndexedStringStub::Generate(MacroAssembler* masm) { |
| 1590 // Return address is in lr. | 1589 // Return address is in lr. |
| 1591 Label miss; | 1590 Label miss; |
| 1592 | 1591 |
| 1593 Register receiver = LoadDescriptor::ReceiverRegister(); | 1592 Register receiver = LoadDescriptor::ReceiverRegister(); |
| 1594 Register index = LoadDescriptor::NameRegister(); | 1593 Register index = LoadDescriptor::NameRegister(); |
| 1595 Register scratch = r8; | 1594 Register scratch = r8; |
| 1596 Register result = r3; | 1595 Register result = r3; |
| 1597 DCHECK(!scratch.is(receiver) && !scratch.is(index)); | 1596 DCHECK(!scratch.is(receiver) && !scratch.is(index)); |
| 1598 DCHECK(!FLAG_vector_ics || | 1597 DCHECK(!scratch.is(VectorLoadICDescriptor::VectorRegister()) && |
| 1599 (!scratch.is(VectorLoadICDescriptor::VectorRegister()) && | 1598 result.is(VectorLoadICDescriptor::SlotRegister())); |
| 1600 result.is(VectorLoadICDescriptor::SlotRegister()))); | |
| 1601 | 1599 |
| 1602 // StringCharAtGenerator doesn't use the result register until it's passed | 1600 // StringCharAtGenerator doesn't use the result register until it's passed |
| 1603 // the different miss possibilities. If it did, we would have a conflict | 1601 // the different miss possibilities. If it did, we would have a conflict |
| 1604 // when FLAG_vector_ics is true. | 1602 // when FLAG_vector_ics is true. |
| 1605 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, | 1603 StringCharAtGenerator char_at_generator(receiver, index, scratch, result, |
| 1606 &miss, // When not a string. | 1604 &miss, // When not a string. |
| 1607 &miss, // When not a number. | 1605 &miss, // When not a number. |
| 1608 &miss, // When index out of range. | 1606 &miss, // When index out of range. |
| 1609 STRING_INDEX_IS_ARRAY_INDEX, | 1607 STRING_INDEX_IS_ARRAY_INDEX, |
| 1610 RECEIVER_IS_STRING); | 1608 RECEIVER_IS_STRING); |
| (...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3118 MacroAssembler* masm, EmbedMode embed_mode, | 3116 MacroAssembler* masm, EmbedMode embed_mode, |
| 3119 const RuntimeCallHelper& call_helper) { | 3117 const RuntimeCallHelper& call_helper) { |
| 3120 __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase); | 3118 __ Abort(kUnexpectedFallthroughToCharCodeAtSlowCase); |
| 3121 | 3119 |
| 3122 // Index is not a smi. | 3120 // Index is not a smi. |
| 3123 __ bind(&index_not_smi_); | 3121 __ bind(&index_not_smi_); |
| 3124 // If index is a heap number, try converting it to an integer. | 3122 // If index is a heap number, try converting it to an integer. |
| 3125 __ CheckMap(index_, result_, Heap::kHeapNumberMapRootIndex, index_not_number_, | 3123 __ CheckMap(index_, result_, Heap::kHeapNumberMapRootIndex, index_not_number_, |
| 3126 DONT_DO_SMI_CHECK); | 3124 DONT_DO_SMI_CHECK); |
| 3127 call_helper.BeforeCall(masm); | 3125 call_helper.BeforeCall(masm); |
| 3128 if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) { | 3126 if (embed_mode == PART_OF_IC_HANDLER) { |
| 3129 __ Push(VectorLoadICDescriptor::VectorRegister(), | 3127 __ Push(VectorLoadICDescriptor::VectorRegister(), |
| 3130 VectorLoadICDescriptor::SlotRegister(), object_, index_); | 3128 VectorLoadICDescriptor::SlotRegister(), object_, index_); |
| 3131 } else { | 3129 } else { |
| 3132 // index_ is consumed by runtime conversion function. | 3130 // index_ is consumed by runtime conversion function. |
| 3133 __ Push(object_, index_); | 3131 __ Push(object_, index_); |
| 3134 } | 3132 } |
| 3135 if (index_flags_ == STRING_INDEX_IS_NUMBER) { | 3133 if (index_flags_ == STRING_INDEX_IS_NUMBER) { |
| 3136 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); | 3134 __ CallRuntime(Runtime::kNumberToIntegerMapMinusZero, 1); |
| 3137 } else { | 3135 } else { |
| 3138 DCHECK(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX); | 3136 DCHECK(index_flags_ == STRING_INDEX_IS_ARRAY_INDEX); |
| 3139 // NumberToSmi discards numbers that are not exact integers. | 3137 // NumberToSmi discards numbers that are not exact integers. |
| 3140 __ CallRuntime(Runtime::kNumberToSmi, 1); | 3138 __ CallRuntime(Runtime::kNumberToSmi, 1); |
| 3141 } | 3139 } |
| 3142 // Save the conversion result before the pop instructions below | 3140 // Save the conversion result before the pop instructions below |
| 3143 // have a chance to overwrite it. | 3141 // have a chance to overwrite it. |
| 3144 __ Move(index_, r3); | 3142 __ Move(index_, r3); |
| 3145 if (FLAG_vector_ics && embed_mode == PART_OF_IC_HANDLER) { | 3143 if (embed_mode == PART_OF_IC_HANDLER) { |
| 3146 __ Pop(VectorLoadICDescriptor::VectorRegister(), | 3144 __ Pop(VectorLoadICDescriptor::VectorRegister(), |
| 3147 VectorLoadICDescriptor::SlotRegister(), object_); | 3145 VectorLoadICDescriptor::SlotRegister(), object_); |
| 3148 } else { | 3146 } else { |
| 3149 __ pop(object_); | 3147 __ pop(object_); |
| 3150 } | 3148 } |
| 3151 // Reload the instance type. | 3149 // Reload the instance type. |
| 3152 __ LoadP(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); | 3150 __ LoadP(result_, FieldMemOperand(object_, HeapObject::kMapOffset)); |
| 3153 __ lbz(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); | 3151 __ lbz(result_, FieldMemOperand(result_, Map::kInstanceTypeOffset)); |
| 3154 call_helper.AfterCall(masm); | 3152 call_helper.AfterCall(masm); |
| 3155 // If index is still not a smi, it must be out of range. | 3153 // If index is still not a smi, it must be out of range. |
| (...skipping 2451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5607 kStackUnwindSpace, NULL, | 5605 kStackUnwindSpace, NULL, |
| 5608 MemOperand(fp, 6 * kPointerSize), NULL); | 5606 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5609 } | 5607 } |
| 5610 | 5608 |
| 5611 | 5609 |
| 5612 #undef __ | 5610 #undef __ |
| 5613 } | 5611 } |
| 5614 } // namespace v8::internal | 5612 } // namespace v8::internal |
| 5615 | 5613 |
| 5616 #endif // V8_TARGET_ARCH_PPC | 5614 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |