Index: src/ic/ppc/ic-ppc.cc |
diff --git a/src/ic/ppc/ic-ppc.cc b/src/ic/ppc/ic-ppc.cc |
index 2715cc9c195cfa7001061ab8cdbf1ba0d8fc12cc..c5f4a3c0a1bb0eba9078c46c93a64ce8f34fe8f3 100644 |
--- a/src/ic/ppc/ic-ppc.cc |
+++ b/src/ic/ppc/ic-ppc.cc |
@@ -497,13 +497,16 @@ static void KeyedStoreGenerateMegamorphicHelper( |
// Fast case: Do the store, could be either Object or double. |
__ bind(fast_object); |
- Register scratch_value = r7; |
+ Register scratch = r7; |
+ Register scratch2 = r0; |
Register address = r8; |
+ DCHECK(!AreAliased(value, key, receiver, receiver_map, elements_map, elements, |
+ scratch, scratch2, address)); |
+ |
if (check_map == kCheckMap) { |
__ LoadP(elements_map, FieldMemOperand(elements, HeapObject::kMapOffset)); |
- __ mov(scratch_value, |
- Operand(masm->isolate()->factory()->fixed_array_map())); |
- __ cmp(elements_map, scratch_value); |
+ __ mov(scratch, Operand(masm->isolate()->factory()->fixed_array_map())); |
+ __ cmp(elements_map, scratch); |
__ bne(fast_double); |
} |
@@ -512,13 +515,12 @@ static void KeyedStoreGenerateMegamorphicHelper( |
// there may be a callback on the element |
Label holecheck_passed1; |
__ addi(address, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- __ SmiToPtrArrayOffset(scratch_value, key); |
- __ LoadPX(scratch_value, MemOperand(address, scratch_value)); |
- __ Cmpi(scratch_value, Operand(masm->isolate()->factory()->the_hole_value()), |
- r0); |
+ __ SmiToPtrArrayOffset(scratch, key); |
+ __ LoadPX(scratch, MemOperand(address, scratch)); |
+ __ Cmpi(scratch, Operand(masm->isolate()->factory()->the_hole_value()), |
+ scratch2); |
__ bne(&holecheck_passed1); |
- __ JumpIfDictionaryInPrototypeChain(receiver, elements_map, scratch_value, |
- slow); |
+ __ JumpIfDictionaryInPrototypeChain(receiver, elements_map, scratch, slow); |
__ bind(&holecheck_passed1); |
@@ -528,35 +530,34 @@ static void KeyedStoreGenerateMegamorphicHelper( |
if (increment_length == kIncrementLength) { |
// Add 1 to receiver->length. |
- __ AddSmiLiteral(scratch_value, key, Smi::FromInt(1), r0); |
- __ StoreP(scratch_value, FieldMemOperand(receiver, JSArray::kLengthOffset), |
- r0); |
+ __ AddSmiLiteral(scratch, key, Smi::FromInt(1), scratch2); |
+ __ StoreP(scratch, FieldMemOperand(receiver, JSArray::kLengthOffset), |
+ scratch2); |
} |
// It's irrelevant whether array is smi-only or not when writing a smi. |
__ addi(address, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- __ SmiToPtrArrayOffset(scratch_value, key); |
- __ StorePX(value, MemOperand(address, scratch_value)); |
+ __ SmiToPtrArrayOffset(scratch, key); |
+ __ StorePX(value, MemOperand(address, scratch)); |
__ Ret(); |
__ bind(&non_smi_value); |
// Escape to elements kind transition case. |
- __ CheckFastObjectElements(receiver_map, scratch_value, |
- &transition_smi_elements); |
+ __ CheckFastObjectElements(receiver_map, scratch, &transition_smi_elements); |
// Fast elements array, store the value to the elements backing store. |
__ bind(&finish_object_store); |
if (increment_length == kIncrementLength) { |
// Add 1 to receiver->length. |
- __ AddSmiLiteral(scratch_value, key, Smi::FromInt(1), r0); |
- __ StoreP(scratch_value, FieldMemOperand(receiver, JSArray::kLengthOffset), |
- r0); |
+ __ AddSmiLiteral(scratch, key, Smi::FromInt(1), scratch2); |
+ __ StoreP(scratch, FieldMemOperand(receiver, JSArray::kLengthOffset), |
+ scratch2); |
} |
__ addi(address, elements, Operand(FixedArray::kHeaderSize - kHeapObjectTag)); |
- __ SmiToPtrArrayOffset(scratch_value, key); |
- __ StorePUX(value, MemOperand(address, scratch_value)); |
+ __ SmiToPtrArrayOffset(scratch, key); |
+ __ StorePUX(value, MemOperand(address, scratch)); |
// Update write barrier for the elements array address. |
- __ mr(scratch_value, value); // Preserve the value which is returned. |
- __ RecordWrite(elements, address, scratch_value, kLRHasNotBeenSaved, |
+ __ mr(scratch, value); // Preserve the value which is returned. |
+ __ RecordWrite(elements, address, scratch, kLRHasNotBeenSaved, |
kDontSaveFPRegs, EMIT_REMEMBERED_SET, OMIT_SMI_CHECK); |
__ Ret(); |
@@ -574,21 +575,20 @@ static void KeyedStoreGenerateMegamorphicHelper( |
__ addi(address, elements, |
Operand((FixedDoubleArray::kHeaderSize + Register::kExponentOffset - |
kHeapObjectTag))); |
- __ SmiToDoubleArrayOffset(scratch_value, key); |
- __ lwzx(scratch_value, MemOperand(address, scratch_value)); |
- __ Cmpi(scratch_value, Operand(kHoleNanUpper32), r0); |
+ __ SmiToDoubleArrayOffset(scratch, key); |
+ __ lwzx(scratch, MemOperand(address, scratch)); |
+ __ Cmpi(scratch, Operand(kHoleNanUpper32), scratch2); |
__ bne(&fast_double_without_map_check); |
- __ JumpIfDictionaryInPrototypeChain(receiver, elements_map, scratch_value, |
- slow); |
+ __ JumpIfDictionaryInPrototypeChain(receiver, elements_map, scratch, slow); |
__ bind(&fast_double_without_map_check); |
- __ StoreNumberToDoubleElements(value, key, elements, r6, d0, |
+ __ StoreNumberToDoubleElements(value, key, elements, scratch, d0, |
&transition_double_elements); |
if (increment_length == kIncrementLength) { |
// Add 1 to receiver->length. |
- __ AddSmiLiteral(scratch_value, key, Smi::FromInt(1), r0); |
- __ StoreP(scratch_value, FieldMemOperand(receiver, JSArray::kLengthOffset), |
- r0); |
+ __ AddSmiLiteral(scratch, key, Smi::FromInt(1), scratch2); |
+ __ StoreP(scratch, FieldMemOperand(receiver, JSArray::kLengthOffset), |
+ scratch2); |
} |
__ Ret(); |
@@ -601,7 +601,7 @@ static void KeyedStoreGenerateMegamorphicHelper( |
// Value is a double. Transition FAST_SMI_ELEMENTS -> |
// FAST_DOUBLE_ELEMENTS and complete the store. |
__ LoadTransitionedArrayMapConditional( |
- FAST_SMI_ELEMENTS, FAST_DOUBLE_ELEMENTS, receiver_map, r7, slow); |
+ FAST_SMI_ELEMENTS, FAST_DOUBLE_ELEMENTS, receiver_map, scratch, slow); |
AllocationSiteMode mode = |
AllocationSite::GetMode(FAST_SMI_ELEMENTS, FAST_DOUBLE_ELEMENTS); |
ElementsTransitionGenerator::GenerateSmiToDouble(masm, receiver, key, value, |
@@ -612,7 +612,7 @@ static void KeyedStoreGenerateMegamorphicHelper( |
__ bind(&non_double_value); |
// Value is not a double, FAST_SMI_ELEMENTS -> FAST_ELEMENTS |
__ LoadTransitionedArrayMapConditional(FAST_SMI_ELEMENTS, FAST_ELEMENTS, |
- receiver_map, r7, slow); |
+ receiver_map, scratch, slow); |
mode = AllocationSite::GetMode(FAST_SMI_ELEMENTS, FAST_ELEMENTS); |
ElementsTransitionGenerator::GenerateMapChangeElementsTransition( |
masm, receiver, key, value, receiver_map, mode, slow); |
@@ -624,7 +624,7 @@ static void KeyedStoreGenerateMegamorphicHelper( |
// HeapNumber. Make sure that the receiver is a Array with FAST_ELEMENTS and |
// transition array from FAST_DOUBLE_ELEMENTS to FAST_ELEMENTS |
__ LoadTransitionedArrayMapConditional(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS, |
- receiver_map, r7, slow); |
+ receiver_map, scratch, slow); |
mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS); |
ElementsTransitionGenerator::GenerateDoubleToObject( |
masm, receiver, key, value, receiver_map, mode, slow); |