OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "v8.h" | 5 #include "v8.h" |
6 | 6 |
7 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
8 | 8 |
9 #include "ia32/lithium-codegen-ia32.h" | 9 #include "ia32/lithium-codegen-ia32.h" |
10 #include "ic.h" | 10 #include "ic.h" |
(...skipping 3977 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3988 ASSERT(!instr->hydrogen()->has_transition()); | 3988 ASSERT(!instr->hydrogen()->has_transition()); |
3989 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); | 3989 ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); |
3990 XMMRegister value = ToDoubleRegister(instr->value()); | 3990 XMMRegister value = ToDoubleRegister(instr->value()); |
3991 __ movsd(FieldOperand(object, offset), value); | 3991 __ movsd(FieldOperand(object, offset), value); |
3992 return; | 3992 return; |
3993 } | 3993 } |
3994 | 3994 |
3995 if (instr->hydrogen()->has_transition()) { | 3995 if (instr->hydrogen()->has_transition()) { |
3996 Handle<Map> transition = instr->hydrogen()->transition_map(); | 3996 Handle<Map> transition = instr->hydrogen()->transition_map(); |
3997 AddDeprecationDependency(transition); | 3997 AddDeprecationDependency(transition); |
3998 if (!instr->hydrogen()->NeedsWriteBarrierForMap()) { | 3998 __ mov(FieldOperand(object, HeapObject::kMapOffset), transition); |
3999 __ mov(FieldOperand(object, HeapObject::kMapOffset), transition); | 3999 if (instr->hydrogen()->NeedsWriteBarrierForMap()) { |
4000 } else { | |
4001 Register temp = ToRegister(instr->temp()); | 4000 Register temp = ToRegister(instr->temp()); |
4002 Register temp_map = ToRegister(instr->temp_map()); | 4001 Register temp_map = ToRegister(instr->temp_map()); |
4003 __ mov(temp_map, transition); | |
4004 __ mov(FieldOperand(object, HeapObject::kMapOffset), temp_map); | |
4005 // Update the write barrier for the map field. | 4002 // Update the write barrier for the map field. |
4006 __ RecordWriteField(object, | 4003 __ RecordWriteForMap(object, transition, temp_map, temp, kSaveFPRegs); |
4007 HeapObject::kMapOffset, | |
4008 temp_map, | |
4009 temp, | |
4010 kSaveFPRegs, | |
4011 OMIT_REMEMBERED_SET, | |
4012 OMIT_SMI_CHECK); | |
4013 } | 4004 } |
4014 } | 4005 } |
4015 | 4006 |
4016 // Do the store. | 4007 // Do the store. |
4017 Register write_register = object; | 4008 Register write_register = object; |
4018 if (!access.IsInobject()) { | 4009 if (!access.IsInobject()) { |
4019 write_register = ToRegister(instr->temp()); | 4010 write_register = ToRegister(instr->temp()); |
4020 __ mov(write_register, FieldOperand(object, JSObject::kPropertiesOffset)); | 4011 __ mov(write_register, FieldOperand(object, JSObject::kPropertiesOffset)); |
4021 } | 4012 } |
4022 | 4013 |
(...skipping 20 matching lines...) Expand all Loading... |
4043 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4034 if (instr->hydrogen()->NeedsWriteBarrier()) { |
4044 Register value = ToRegister(instr->value()); | 4035 Register value = ToRegister(instr->value()); |
4045 Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object; | 4036 Register temp = access.IsInobject() ? ToRegister(instr->temp()) : object; |
4046 // Update the write barrier for the object for in-object properties. | 4037 // Update the write barrier for the object for in-object properties. |
4047 __ RecordWriteField(write_register, | 4038 __ RecordWriteField(write_register, |
4048 offset, | 4039 offset, |
4049 value, | 4040 value, |
4050 temp, | 4041 temp, |
4051 kSaveFPRegs, | 4042 kSaveFPRegs, |
4052 EMIT_REMEMBERED_SET, | 4043 EMIT_REMEMBERED_SET, |
4053 instr->hydrogen()->SmiCheckForWriteBarrier()); | 4044 instr->hydrogen()->SmiCheckForWriteBarrier(), |
| 4045 instr->hydrogen()->ValueIsInNewSpace()); |
4054 } | 4046 } |
4055 } | 4047 } |
4056 | 4048 |
4057 | 4049 |
4058 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { | 4050 void LCodeGen::DoStoreNamedGeneric(LStoreNamedGeneric* instr) { |
4059 ASSERT(ToRegister(instr->context()).is(esi)); | 4051 ASSERT(ToRegister(instr->context()).is(esi)); |
4060 ASSERT(ToRegister(instr->object()).is(edx)); | 4052 ASSERT(ToRegister(instr->object()).is(edx)); |
4061 ASSERT(ToRegister(instr->value()).is(eax)); | 4053 ASSERT(ToRegister(instr->value()).is(eax)); |
4062 | 4054 |
4063 __ mov(ecx, instr->name()); | 4055 __ mov(ecx, instr->name()); |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4212 SmiCheck check_needed = | 4204 SmiCheck check_needed = |
4213 instr->hydrogen()->value()->type().IsHeapObject() | 4205 instr->hydrogen()->value()->type().IsHeapObject() |
4214 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4206 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
4215 // Compute address of modified element and store it into key register. | 4207 // Compute address of modified element and store it into key register. |
4216 __ lea(key, operand); | 4208 __ lea(key, operand); |
4217 __ RecordWrite(elements, | 4209 __ RecordWrite(elements, |
4218 key, | 4210 key, |
4219 value, | 4211 value, |
4220 kSaveFPRegs, | 4212 kSaveFPRegs, |
4221 EMIT_REMEMBERED_SET, | 4213 EMIT_REMEMBERED_SET, |
4222 check_needed); | 4214 check_needed, |
| 4215 instr->hydrogen()->ValueIsInNewSpace()); |
4223 } | 4216 } |
4224 } | 4217 } |
4225 | 4218 |
4226 | 4219 |
4227 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4220 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
4228 // By cases...external, fast-double, fast | 4221 // By cases...external, fast-double, fast |
4229 if (instr->is_typed_elements()) { | 4222 if (instr->is_typed_elements()) { |
4230 DoStoreKeyedExternalArray(instr); | 4223 DoStoreKeyedExternalArray(instr); |
4231 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4224 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
4232 DoStoreKeyedFixedDoubleArray(instr); | 4225 DoStoreKeyedFixedDoubleArray(instr); |
(...skipping 1425 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5658 __ bind(deferred->exit()); | 5651 __ bind(deferred->exit()); |
5659 __ bind(&done); | 5652 __ bind(&done); |
5660 } | 5653 } |
5661 | 5654 |
5662 | 5655 |
5663 #undef __ | 5656 #undef __ |
5664 | 5657 |
5665 } } // namespace v8::internal | 5658 } } // namespace v8::internal |
5666 | 5659 |
5667 #endif // V8_TARGET_ARCH_IA32 | 5660 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |