| 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 5359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5370 for (int i = 0; i < depth(); i++) { | 5370 for (int i = 0; i < depth(); i++) { |
| 5371 __ LoadP(context_temp, ContextOperand(context, Context::PREVIOUS_INDEX)); | 5371 __ LoadP(context_temp, ContextOperand(context, Context::PREVIOUS_INDEX)); |
| 5372 context = context_temp; | 5372 context = context_temp; |
| 5373 } | 5373 } |
| 5374 | 5374 |
| 5375 // Load the PropertyCell at the specified slot. | 5375 // Load the PropertyCell at the specified slot. |
| 5376 __ ShiftLeftImm(cell, slot, Operand(kPointerSizeLog2)); | 5376 __ ShiftLeftImm(cell, slot, Operand(kPointerSizeLog2)); |
| 5377 __ add(cell, context, cell); | 5377 __ add(cell, context, cell); |
| 5378 __ LoadP(cell, ContextOperand(cell)); | 5378 __ LoadP(cell, ContextOperand(cell)); |
| 5379 | 5379 |
| 5380 // Check that cell value is not the_hole. |
| 5381 __ LoadP(cell_value, FieldMemOperand(cell, PropertyCell::kValueOffset)); |
| 5382 __ CompareRoot(cell_value, Heap::kTheHoleValueRootIndex); |
| 5383 __ beq(&slow_case); |
| 5384 |
| 5380 // Load PropertyDetails for the cell (actually only the cell_type and kind). | 5385 // Load PropertyDetails for the cell (actually only the cell_type and kind). |
| 5381 __ LoadP(cell_details, FieldMemOperand(cell, PropertyCell::kDetailsOffset)); | 5386 __ LoadP(cell_details, FieldMemOperand(cell, PropertyCell::kDetailsOffset)); |
| 5382 __ SmiUntag(cell_details); | 5387 __ SmiUntag(cell_details); |
| 5383 __ andi(cell_details, cell_details, | 5388 __ andi(cell_details, cell_details, |
| 5384 Operand(PropertyDetails::PropertyCellTypeField::kMask | | 5389 Operand(PropertyDetails::PropertyCellTypeField::kMask | |
| 5385 PropertyDetails::KindField::kMask)); | 5390 PropertyDetails::KindField::kMask)); |
| 5386 | 5391 |
| 5387 // Check if PropertyCell holds mutable data. | 5392 // Check if PropertyCell holds mutable data. |
| 5388 Label not_mutable_data; | 5393 Label not_mutable_data; |
| 5389 __ cmpi(cell_details, Operand(PropertyDetails::PropertyCellTypeField::encode( | 5394 __ cmpi(cell_details, Operand(PropertyDetails::PropertyCellTypeField::encode( |
| 5390 PropertyCellType::kMutable) | | 5395 PropertyCellType::kMutable) | |
| 5391 PropertyDetails::KindField::encode(kData))); | 5396 PropertyDetails::KindField::encode(kData))); |
| 5392 __ bne(¬_mutable_data); | 5397 __ bne(¬_mutable_data); |
| 5393 __ JumpIfSmi(value, &fast_smi_case); | 5398 __ JumpIfSmi(value, &fast_smi_case); |
| 5394 | 5399 |
| 5395 __ bind(&fast_heapobject_case); | 5400 __ bind(&fast_heapobject_case); |
| 5396 __ StoreP(value, FieldMemOperand(cell, PropertyCell::kValueOffset), r0); | 5401 __ StoreP(value, FieldMemOperand(cell, PropertyCell::kValueOffset), r0); |
| 5397 // RecordWriteField clobbers the value register, so we copy it before the | 5402 // RecordWriteField clobbers the value register, so we copy it before the |
| 5398 // call. | 5403 // call. |
| 5399 __ mr(r7, value); | 5404 __ mr(r7, value); |
| 5400 __ RecordWriteField(cell, PropertyCell::kValueOffset, r7, scratch, | 5405 __ RecordWriteField(cell, PropertyCell::kValueOffset, r7, scratch, |
| 5401 kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, | 5406 kLRHasNotBeenSaved, kDontSaveFPRegs, EMIT_REMEMBERED_SET, |
| 5402 OMIT_SMI_CHECK); | 5407 OMIT_SMI_CHECK); |
| 5403 __ Ret(); | 5408 __ Ret(); |
| 5404 | 5409 |
| 5405 __ bind(¬_mutable_data); | 5410 __ bind(¬_mutable_data); |
| 5406 // Check if PropertyCell value matches the new value (relevant for Constant, | 5411 // Check if PropertyCell value matches the new value (relevant for Constant, |
| 5407 // ConstantType and Undefined cells). | 5412 // ConstantType and Undefined cells). |
| 5408 Label not_same_value; | 5413 Label not_same_value; |
| 5409 __ LoadP(cell_value, FieldMemOperand(cell, PropertyCell::kValueOffset)); | |
| 5410 __ cmp(cell_value, value); | 5414 __ cmp(cell_value, value); |
| 5411 __ bne(¬_same_value); | 5415 __ bne(¬_same_value); |
| 5412 | 5416 |
| 5413 if (FLAG_debug_code) { | 5417 if (FLAG_debug_code) { |
| 5414 Label done; | 5418 Label done; |
| 5415 // This can only be true for Constant, ConstantType and Undefined cells, | 5419 // This can only be true for Constant, ConstantType and Undefined cells, |
| 5416 // because we never store the_hole via this stub. | 5420 // because we never store the_hole via this stub. |
| 5417 __ cmpi(cell_details, | 5421 __ cmpi(cell_details, |
| 5418 Operand(PropertyDetails::PropertyCellTypeField::encode( | 5422 Operand(PropertyDetails::PropertyCellTypeField::encode( |
| 5419 PropertyCellType::kConstant) | | 5423 PropertyCellType::kConstant) | |
| (...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5826 kStackUnwindSpace, NULL, | 5830 kStackUnwindSpace, NULL, |
| 5827 MemOperand(fp, 6 * kPointerSize), NULL); | 5831 MemOperand(fp, 6 * kPointerSize), NULL); |
| 5828 } | 5832 } |
| 5829 | 5833 |
| 5830 | 5834 |
| 5831 #undef __ | 5835 #undef __ |
| 5832 } // namespace internal | 5836 } // namespace internal |
| 5833 } // namespace v8 | 5837 } // namespace v8 |
| 5834 | 5838 |
| 5835 #endif // V8_TARGET_ARCH_PPC | 5839 #endif // V8_TARGET_ARCH_PPC |
| OLD | NEW |