| 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 #if V8_TARGET_ARCH_X64 | 7 #if V8_TARGET_ARCH_X64 |
| 8 | 8 |
| 9 #include "src/x64/lithium-codegen-x64.h" | 9 #include "src/x64/lithium-codegen-x64.h" |
| 10 #include "src/code-stubs.h" | 10 #include "src/code-stubs.h" |
| (...skipping 4006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4017 if (hinstr->has_transition()) { | 4017 if (hinstr->has_transition()) { |
| 4018 Handle<Map> transition = hinstr->transition_map(); | 4018 Handle<Map> transition = hinstr->transition_map(); |
| 4019 AddDeprecationDependency(transition); | 4019 AddDeprecationDependency(transition); |
| 4020 if (!hinstr->NeedsWriteBarrierForMap()) { | 4020 if (!hinstr->NeedsWriteBarrierForMap()) { |
| 4021 __ Move(FieldOperand(object, HeapObject::kMapOffset), transition); | 4021 __ Move(FieldOperand(object, HeapObject::kMapOffset), transition); |
| 4022 } else { | 4022 } else { |
| 4023 Register temp = ToRegister(instr->temp()); | 4023 Register temp = ToRegister(instr->temp()); |
| 4024 __ Move(kScratchRegister, transition); | 4024 __ Move(kScratchRegister, transition); |
| 4025 __ movp(FieldOperand(object, HeapObject::kMapOffset), kScratchRegister); | 4025 __ movp(FieldOperand(object, HeapObject::kMapOffset), kScratchRegister); |
| 4026 // Update the write barrier for the map field. | 4026 // Update the write barrier for the map field. |
| 4027 __ RecordWriteField(object, | 4027 __ RecordWriteForMap(object, |
| 4028 HeapObject::kMapOffset, | 4028 kScratchRegister, |
| 4029 kScratchRegister, | 4029 temp, |
| 4030 temp, | 4030 kSaveFPRegs); |
| 4031 kSaveFPRegs, | |
| 4032 OMIT_REMEMBERED_SET, | |
| 4033 OMIT_SMI_CHECK); | |
| 4034 } | 4031 } |
| 4035 } | 4032 } |
| 4036 | 4033 |
| 4037 // Do the store. | 4034 // Do the store. |
| 4038 Register write_register = object; | 4035 Register write_register = object; |
| 4039 if (!access.IsInobject()) { | 4036 if (!access.IsInobject()) { |
| 4040 write_register = ToRegister(instr->temp()); | 4037 write_register = ToRegister(instr->temp()); |
| 4041 __ movp(write_register, FieldOperand(object, JSObject::kPropertiesOffset)); | 4038 __ movp(write_register, FieldOperand(object, JSObject::kPropertiesOffset)); |
| 4042 } | 4039 } |
| 4043 | 4040 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4083 if (hinstr->NeedsWriteBarrier()) { | 4080 if (hinstr->NeedsWriteBarrier()) { |
| 4084 Register value = ToRegister(instr->value()); | 4081 Register value = ToRegister(instr->value()); |
| 4085 Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object; | 4082 Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object; |
| 4086 // Update the write barrier for the object for in-object properties. | 4083 // Update the write barrier for the object for in-object properties. |
| 4087 __ RecordWriteField(write_register, | 4084 __ RecordWriteField(write_register, |
| 4088 offset, | 4085 offset, |
| 4089 value, | 4086 value, |
| 4090 temp, | 4087 temp, |
| 4091 kSaveFPRegs, | 4088 kSaveFPRegs, |
| 4092 EMIT_REMEMBERED_SET, | 4089 EMIT_REMEMBERED_SET, |
| 4093 hinstr->SmiCheckForWriteBarrier()); | 4090 hinstr->SmiCheckForWriteBarrier(), |
| 4091 hinstr->PointersToHereCheckForValue()); |
| 4094 } | 4092 } |
| 4095 } | 4093 } |
| 4096 | 4094 |
| 4097 | 4095 |
| 4098 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 4096 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
| 4099 ASSERT(ToRegister(instr->context()).is(rsi)); | 4097 ASSERT(ToRegister(instr->context()).is(rsi)); |
| 4100 ASSERT(ToRegister(instr->object()).is(rdx)); | 4098 ASSERT(ToRegister(instr->object()).is(rdx)); |
| 4101 ASSERT(ToRegister(instr->value()).is(rax)); | 4099 ASSERT(ToRegister(instr->value()).is(rax)); |
| 4102 | 4100 |
| 4103 __ Move(rcx, instr->hydrogen()->name()); | 4101 __ Move(rcx, instr->hydrogen()->name()); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4308 SmiCheck check_needed = hinstr->value()->type().IsHeapObject() | 4306 SmiCheck check_needed = hinstr->value()->type().IsHeapObject() |
| 4309 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4307 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4310 // Compute address of modified element and store it into key register. | 4308 // Compute address of modified element and store it into key register. |
| 4311 Register key_reg(ToRegister(key)); | 4309 Register key_reg(ToRegister(key)); |
| 4312 __ leap(key_reg, operand); | 4310 __ leap(key_reg, operand); |
| 4313 __ RecordWrite(elements, | 4311 __ RecordWrite(elements, |
| 4314 key_reg, | 4312 key_reg, |
| 4315 value, | 4313 value, |
| 4316 kSaveFPRegs, | 4314 kSaveFPRegs, |
| 4317 EMIT_REMEMBERED_SET, | 4315 EMIT_REMEMBERED_SET, |
| 4318 check_needed); | 4316 check_needed, |
| 4317 hinstr->PointersToHereCheckForValue()); |
| 4319 } | 4318 } |
| 4320 } | 4319 } |
| 4321 | 4320 |
| 4322 | 4321 |
| 4323 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4322 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
| 4324 if (instr->is_typed_elements()) { | 4323 if (instr->is_typed_elements()) { |
| 4325 DoStoreKeyedExternalArray(instr); | 4324 DoStoreKeyedExternalArray(instr); |
| 4326 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4325 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
| 4327 DoStoreKeyedFixedDoubleArray(instr); | 4326 DoStoreKeyedFixedDoubleArray(instr); |
| 4328 } else { | 4327 } else { |
| (...skipping 24 matching lines...) Expand all Loading... |
| 4353 ElementsKind to_kind = instr->to_kind(); | 4352 ElementsKind to_kind = instr->to_kind(); |
| 4354 | 4353 |
| 4355 Label not_applicable; | 4354 Label not_applicable; |
| 4356 __ Cmp(FieldOperand(object_reg, HeapObject::kMapOffset), from_map); | 4355 __ Cmp(FieldOperand(object_reg, HeapObject::kMapOffset), from_map); |
| 4357 __ j(not_equal, ¬_applicable); | 4356 __ j(not_equal, ¬_applicable); |
| 4358 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { | 4357 if (IsSimpleMapChangeTransition(from_kind, to_kind)) { |
| 4359 Register new_map_reg = ToRegister(instr->new_map_temp()); | 4358 Register new_map_reg = ToRegister(instr->new_map_temp()); |
| 4360 __ Move(new_map_reg, to_map, RelocInfo::EMBEDDED_OBJECT); | 4359 __ Move(new_map_reg, to_map, RelocInfo::EMBEDDED_OBJECT); |
| 4361 __ movp(FieldOperand(object_reg, HeapObject::kMapOffset), new_map_reg); | 4360 __ movp(FieldOperand(object_reg, HeapObject::kMapOffset), new_map_reg); |
| 4362 // Write barrier. | 4361 // Write barrier. |
| 4363 ASSERT_NE(instr->temp(), NULL); | 4362 __ RecordWriteForMap(object_reg, new_map_reg, ToRegister(instr->temp()), |
| 4364 __ RecordWriteField(object_reg, HeapObject::kMapOffset, new_map_reg, | 4363 kDontSaveFPRegs); |
| 4365 ToRegister(instr->temp()), kDontSaveFPRegs); | |
| 4366 } else { | 4364 } else { |
| 4367 ASSERT(object_reg.is(rax)); | 4365 ASSERT(object_reg.is(rax)); |
| 4368 ASSERT(ToRegister(instr->context()).is(rsi)); | 4366 ASSERT(ToRegister(instr->context()).is(rsi)); |
| 4369 PushSafepointRegistersScope scope(this); | 4367 PushSafepointRegistersScope scope(this); |
| 4370 __ Move(rbx, to_map); | 4368 __ Move(rbx, to_map); |
| 4371 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; | 4369 bool is_js_array = from_map->instance_type() == JS_ARRAY_TYPE; |
| 4372 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); | 4370 TransitionElementsKindStub stub(isolate(), from_kind, to_kind, is_js_array); |
| 4373 __ CallStub(&stub); | 4371 __ CallStub(&stub); |
| 4374 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0); | 4372 RecordSafepointWithLazyDeopt(instr, RECORD_SAFEPOINT_WITH_REGISTERS, 0); |
| 4375 } | 4373 } |
| (...skipping 1309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5685 __ bind(deferred->exit()); | 5683 __ bind(deferred->exit()); |
| 5686 __ bind(&done); | 5684 __ bind(&done); |
| 5687 } | 5685 } |
| 5688 | 5686 |
| 5689 | 5687 |
| 5690 #undef __ | 5688 #undef __ |
| 5691 | 5689 |
| 5692 } } // namespace v8::internal | 5690 } } // namespace v8::internal |
| 5693 | 5691 |
| 5694 #endif // V8_TARGET_ARCH_X64 | 5692 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |