| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "src/arm64/lithium-codegen-arm64.h" | 7 #include "src/arm64/lithium-codegen-arm64.h" |
| 8 #include "src/arm64/lithium-gap-resolver-arm64.h" | 8 #include "src/arm64/lithium-gap-resolver-arm64.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/stub-cache.h" | 10 #include "src/stub-cache.h" |
| (...skipping 5302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5313 if (instr->hydrogen()->NeedsWriteBarrier()) { | 5313 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 5314 ASSERT(representation.IsTagged()); | 5314 ASSERT(representation.IsTagged()); |
| 5315 // This assignment may cause element_addr to alias store_base. | 5315 // This assignment may cause element_addr to alias store_base. |
| 5316 Register element_addr = scratch; | 5316 Register element_addr = scratch; |
| 5317 SmiCheck check_needed = | 5317 SmiCheck check_needed = |
| 5318 instr->hydrogen()->value()->type().IsHeapObject() | 5318 instr->hydrogen()->value()->type().IsHeapObject() |
| 5319 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 5319 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 5320 // Compute address of modified element and store it into key register. | 5320 // Compute address of modified element and store it into key register. |
| 5321 __ Add(element_addr, mem_op.base(), mem_op.OffsetAsOperand()); | 5321 __ Add(element_addr, mem_op.base(), mem_op.OffsetAsOperand()); |
| 5322 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), | 5322 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), |
| 5323 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed); | 5323 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed, |
| 5324 instr->hydrogen()->PointersToHereCheckForValue()); |
| 5324 } | 5325 } |
| 5325 } | 5326 } |
| 5326 | 5327 |
| 5327 | 5328 |
| 5328 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 5329 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| 5329 ASSERT(ToRegister(instr->context()).is(cp)); | 5330 ASSERT(ToRegister(instr->context()).is(cp)); |
| 5330 ASSERT(ToRegister(instr->object()).Is(x2)); | 5331 ASSERT(ToRegister(instr->object()).Is(x2)); |
| 5331 ASSERT(ToRegister(instr->key()).Is(x1)); | 5332 ASSERT(ToRegister(instr->key()).Is(x1)); |
| 5332 ASSERT(ToRegister(instr->value()).Is(x0)); | 5333 ASSERT(ToRegister(instr->value()).Is(x0)); |
| 5333 | 5334 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5372 | 5373 |
| 5373 if (instr->hydrogen()->has_transition()) { | 5374 if (instr->hydrogen()->has_transition()) { |
| 5374 Handle<Map> transition = instr->hydrogen()->transition_map(); | 5375 Handle<Map> transition = instr->hydrogen()->transition_map(); |
| 5375 AddDeprecationDependency(transition); | 5376 AddDeprecationDependency(transition); |
| 5376 // Store the new map value. | 5377 // Store the new map value. |
| 5377 Register new_map_value = ToRegister(instr->temp0()); | 5378 Register new_map_value = ToRegister(instr->temp0()); |
| 5378 __ Mov(new_map_value, Operand(transition)); | 5379 __ Mov(new_map_value, Operand(transition)); |
| 5379 __ Str(new_map_value, FieldMemOperand(object, HeapObject::kMapOffset)); | 5380 __ Str(new_map_value, FieldMemOperand(object, HeapObject::kMapOffset)); |
| 5380 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { | 5381 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { |
| 5381 // Update the write barrier for the map field. | 5382 // Update the write barrier for the map field. |
| 5382 __ RecordWriteField(object, | 5383 __ RecordWriteForMap(object, |
| 5383 HeapObject::kMapOffset, | 5384 new_map_value, |
| 5384 new_map_value, | 5385 ToRegister(instr->temp1()), |
| 5385 ToRegister(instr->temp1()), | 5386 GetLinkRegisterState(), |
| 5386 GetLinkRegisterState(), | 5387 kSaveFPRegs); |
| 5387 kSaveFPRegs, | |
| 5388 OMIT_REMEMBERED_SET, | |
| 5389 OMIT_SMI_CHECK); | |
| 5390 } | 5388 } |
| 5391 } | 5389 } |
| 5392 | 5390 |
| 5393 // Do the store. | 5391 // Do the store. |
| 5394 Register destination; | 5392 Register destination; |
| 5395 if (access.IsInobject()) { | 5393 if (access.IsInobject()) { |
| 5396 destination = object; | 5394 destination = object; |
| 5397 } else { | 5395 } else { |
| 5398 Register temp0 = ToRegister(instr->temp0()); | 5396 Register temp0 = ToRegister(instr->temp0()); |
| 5399 __ Ldr(temp0, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 5397 __ Ldr(temp0, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 5421 __ Store(value, FieldMemOperand(destination, offset), representation); | 5419 __ Store(value, FieldMemOperand(destination, offset), representation); |
| 5422 } | 5420 } |
| 5423 if (instr->hydrogen()->NeedsWriteBarrier()) { | 5421 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 5424 __ RecordWriteField(destination, | 5422 __ RecordWriteField(destination, |
| 5425 offset, | 5423 offset, |
| 5426 value, // Clobbered. | 5424 value, // Clobbered. |
| 5427 ToRegister(instr->temp1()), // Clobbered. | 5425 ToRegister(instr->temp1()), // Clobbered. |
| 5428 GetLinkRegisterState(), | 5426 GetLinkRegisterState(), |
| 5429 kSaveFPRegs, | 5427 kSaveFPRegs, |
| 5430 EMIT_REMEMBERED_SET, | 5428 EMIT_REMEMBERED_SET, |
| 5431 instr->hydrogen()->SmiCheckForWriteBarrier()); | 5429 instr->hydrogen()->SmiCheckForWriteBarrier(), |
| 5430 instr->hydrogen()->PointersToHereCheckForValue()); |
| 5432 } | 5431 } |
| 5433 } | 5432 } |
| 5434 | 5433 |
| 5435 | 5434 |
| 5436 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 5435 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 5437 ASSERT(ToRegister(instr->context()).is(cp)); | 5436 ASSERT(ToRegister(instr->context()).is(cp)); |
| 5438 ASSERT(ToRegister(instr->value()).is(x0)); | 5437 ASSERT(ToRegister(instr->value()).is(x0)); |
| 5439 ASSERT(ToRegister(instr->object()).is(x1)); | 5438 ASSERT(ToRegister(instr->object()).is(x1)); |
| 5440 | 5439 |
| 5441 // Name must be in x2. | 5440 // Name must be in x2. |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5753 | 5752 |
| 5754 Label not_applicable; | 5753 Label not_applicable; |
| 5755 | 5754 |
| 5756 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { | 5755 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { |
| 5757 Register temp1 = ToRegister(instr->temp1()); | 5756 Register temp1 = ToRegister(instr->temp1()); |
| 5758 Register new_map = ToRegister(instr->temp2()); | 5757 Register new_map = ToRegister(instr->temp2()); |
| 5759 __ CheckMap(object, temp1, from_map, ¬_applicable, DONT_DO_SMI_CHECK); | 5758 __ CheckMap(object, temp1, from_map, ¬_applicable, DONT_DO_SMI_CHECK); |
| 5760 __ Mov(new_map, Operand(to_map)); | 5759 __ Mov(new_map, Operand(to_map)); |
| 5761 __ Str(new_map, FieldMemOperand(object, HeapObject::kMapOffset)); | 5760 __ Str(new_map, FieldMemOperand(object, HeapObject::kMapOffset)); |
| 5762 // Write barrier. | 5761 // Write barrier. |
| 5763 __ RecordWriteField(object, HeapObject::kMapOffset, new_map, temp1, | 5762 __ RecordWriteForMap(object, new_map, temp1, GetLinkRegisterState(), |
| 5764 GetLinkRegisterState(), kDontSaveFPRegs); | 5763 kDontSaveFPRegs); |
| 5765 } else { | 5764 } else { |
| 5766 { | 5765 { |
| 5767 UseScratchRegisterScope temps(masm()); | 5766 UseScratchRegisterScope temps(masm()); |
| 5768 // Use the temp register only in a restricted scope - the codegen checks | 5767 // Use the temp register only in a restricted scope - the codegen checks |
| 5769 // that we do not use any register across a call. | 5768 // that we do not use any register across a call. |
| 5770 __ CheckMap(object, temps.AcquireX(), from_map, ¬_applicable, | 5769 __ CheckMap(object, temps.AcquireX(), from_map, ¬_applicable, |
| 5771 DONT_DO_SMI_CHECK); | 5770 DONT_DO_SMI_CHECK); |
| 5772 } | 5771 } |
| 5773 ASSERT(object.is(x0)); | 5772 ASSERT(object.is(x0)); |
| 5774 ASSERT(ToRegister(instr->context()).is(cp)); | 5773 ASSERT(ToRegister(instr->context()).is(cp)); |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6034 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 6033 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 6035 // Index is equal to negated out of object property index plus 1. | 6034 // Index is equal to negated out of object property index plus 1. |
| 6036 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 6035 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
| 6037 __ Ldr(result, FieldMemOperand(result, | 6036 __ Ldr(result, FieldMemOperand(result, |
| 6038 FixedArray::kHeaderSize - kPointerSize)); | 6037 FixedArray::kHeaderSize - kPointerSize)); |
| 6039 __ Bind(deferred->exit()); | 6038 __ Bind(deferred->exit()); |
| 6040 __ Bind(&done); | 6039 __ Bind(&done); |
| 6041 } | 6040 } |
| 6042 | 6041 |
| 6043 } } // namespace v8::internal | 6042 } } // namespace v8::internal |
| OLD | NEW |