| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2998 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3009 | 3009 |
| 3010 | 3010 |
| 3011 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { | 3011 void LCodeGen::DoLoadNamedField(LLoadNamedField* instr) { |
| 3012 HObjectAccess access = instr->hydrogen()->access(); | 3012 HObjectAccess access = instr->hydrogen()->access(); |
| 3013 int offset = access.offset(); | 3013 int offset = access.offset(); |
| 3014 Register object = ToRegister(instr->object()); | 3014 Register object = ToRegister(instr->object()); |
| 3015 | 3015 |
| 3016 if (access.IsExternalMemory()) { | 3016 if (access.IsExternalMemory()) { |
| 3017 Register result = ToRegister(instr->result()); | 3017 Register result = ToRegister(instr->result()); |
| 3018 MemOperand operand = MemOperand(object, offset); | 3018 MemOperand operand = MemOperand(object, offset); |
| 3019 if (access.representation().IsByte()) { | 3019 __ Load(result, operand, access.representation()); |
| 3020 __ ldrb(result, operand); | |
| 3021 } else { | |
| 3022 __ ldr(result, operand); | |
| 3023 } | |
| 3024 return; | 3020 return; |
| 3025 } | 3021 } |
| 3026 | 3022 |
| 3027 if (instr->hydrogen()->representation().IsDouble()) { | 3023 if (instr->hydrogen()->representation().IsDouble()) { |
| 3028 DwVfpRegister result = ToDoubleRegister(instr->result()); | 3024 DwVfpRegister result = ToDoubleRegister(instr->result()); |
| 3029 __ vldr(result, FieldMemOperand(object, offset)); | 3025 __ vldr(result, FieldMemOperand(object, offset)); |
| 3030 return; | 3026 return; |
| 3031 } | 3027 } |
| 3032 | 3028 |
| 3033 Register result = ToRegister(instr->result()); | 3029 Register result = ToRegister(instr->result()); |
| 3034 if (!access.IsInobject()) { | 3030 if (!access.IsInobject()) { |
| 3035 __ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 3031 __ ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 3036 object = result; | 3032 object = result; |
| 3037 } | 3033 } |
| 3038 MemOperand operand = FieldMemOperand(object, offset); | 3034 MemOperand operand = FieldMemOperand(object, offset); |
| 3039 if (access.representation().IsByte()) { | 3035 __ Load(result, operand, access.representation()); |
| 3040 __ ldrb(result, operand); | |
| 3041 } else { | |
| 3042 __ ldr(result, operand); | |
| 3043 } | |
| 3044 } | 3036 } |
| 3045 | 3037 |
| 3046 | 3038 |
| 3047 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { | 3039 void LCodeGen::DoLoadNamedGeneric(LLoadNamedGeneric* instr) { |
| 3048 ASSERT(ToRegister(instr->context()).is(cp)); | 3040 ASSERT(ToRegister(instr->context()).is(cp)); |
| 3049 ASSERT(ToRegister(instr->object()).is(r0)); | 3041 ASSERT(ToRegister(instr->object()).is(r0)); |
| 3050 ASSERT(ToRegister(instr->result()).is(r0)); | 3042 ASSERT(ToRegister(instr->result()).is(r0)); |
| 3051 | 3043 |
| 3052 // Name is always in r2. | 3044 // Name is always in r2. |
| 3053 __ mov(r2, Operand(instr->name())); | 3045 __ mov(r2, Operand(instr->name())); |
| (...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4136 Representation representation = instr->representation(); | 4128 Representation representation = instr->representation(); |
| 4137 | 4129 |
| 4138 Register object = ToRegister(instr->object()); | 4130 Register object = ToRegister(instr->object()); |
| 4139 Register scratch = scratch0(); | 4131 Register scratch = scratch0(); |
| 4140 HObjectAccess access = instr->hydrogen()->access(); | 4132 HObjectAccess access = instr->hydrogen()->access(); |
| 4141 int offset = access.offset(); | 4133 int offset = access.offset(); |
| 4142 | 4134 |
| 4143 if (access.IsExternalMemory()) { | 4135 if (access.IsExternalMemory()) { |
| 4144 Register value = ToRegister(instr->value()); | 4136 Register value = ToRegister(instr->value()); |
| 4145 MemOperand operand = MemOperand(object, offset); | 4137 MemOperand operand = MemOperand(object, offset); |
| 4146 if (representation.IsByte()) { | 4138 __ Store(value, operand, representation); |
| 4147 __ strb(value, operand); | |
| 4148 } else { | |
| 4149 __ str(value, operand); | |
| 4150 } | |
| 4151 return; | 4139 return; |
| 4152 } | 4140 } |
| 4153 | 4141 |
| 4154 Handle<Map> transition = instr->transition(); | 4142 Handle<Map> transition = instr->transition(); |
| 4155 | 4143 |
| 4156 if (FLAG_track_heap_object_fields && representation.IsHeapObject()) { | 4144 if (FLAG_track_heap_object_fields && representation.IsHeapObject()) { |
| 4157 Register value = ToRegister(instr->value()); | 4145 Register value = ToRegister(instr->value()); |
| 4158 if (!instr->hydrogen()->value()->type().IsHeapObject()) { | 4146 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 4159 __ SmiTst(value); | 4147 __ SmiTst(value); |
| 4160 DeoptimizeIf(eq, instr->environment()); | 4148 DeoptimizeIf(eq, instr->environment()); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4186 } | 4174 } |
| 4187 | 4175 |
| 4188 // Do the store. | 4176 // Do the store. |
| 4189 Register value = ToRegister(instr->value()); | 4177 Register value = ToRegister(instr->value()); |
| 4190 ASSERT(!object.is(value)); | 4178 ASSERT(!object.is(value)); |
| 4191 SmiCheck check_needed = | 4179 SmiCheck check_needed = |
| 4192 instr->hydrogen()->value()->IsHeapObject() | 4180 instr->hydrogen()->value()->IsHeapObject() |
| 4193 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4181 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4194 if (access.IsInobject()) { | 4182 if (access.IsInobject()) { |
| 4195 MemOperand operand = FieldMemOperand(object, offset); | 4183 MemOperand operand = FieldMemOperand(object, offset); |
| 4196 if (representation.IsByte()) { | 4184 __ Store(value, operand, representation); |
| 4197 __ strb(value, operand); | |
| 4198 } else { | |
| 4199 __ str(value, operand); | |
| 4200 } | |
| 4201 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4185 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4202 // Update the write barrier for the object for in-object properties. | 4186 // Update the write barrier for the object for in-object properties. |
| 4203 __ RecordWriteField(object, | 4187 __ RecordWriteField(object, |
| 4204 offset, | 4188 offset, |
| 4205 value, | 4189 value, |
| 4206 scratch, | 4190 scratch, |
| 4207 GetLinkRegisterState(), | 4191 GetLinkRegisterState(), |
| 4208 kSaveFPRegs, | 4192 kSaveFPRegs, |
| 4209 EMIT_REMEMBERED_SET, | 4193 EMIT_REMEMBERED_SET, |
| 4210 check_needed); | 4194 check_needed); |
| 4211 } | 4195 } |
| 4212 } else { | 4196 } else { |
| 4213 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 4197 __ ldr(scratch, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 4214 MemOperand operand = FieldMemOperand(scratch, offset); | 4198 MemOperand operand = FieldMemOperand(scratch, offset); |
| 4215 if (representation.IsByte()) { | 4199 __ Store(value, operand, representation); |
| 4216 __ strb(value, operand); | |
| 4217 } else { | |
| 4218 __ str(value, operand); | |
| 4219 } | |
| 4220 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4200 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4221 // Update the write barrier for the properties array. | 4201 // Update the write barrier for the properties array. |
| 4222 // object is used as a scratch register. | 4202 // object is used as a scratch register. |
| 4223 __ RecordWriteField(scratch, | 4203 __ RecordWriteField(scratch, |
| 4224 offset, | 4204 offset, |
| 4225 value, | 4205 value, |
| 4226 object, | 4206 object, |
| 4227 GetLinkRegisterState(), | 4207 GetLinkRegisterState(), |
| 4228 kSaveFPRegs, | 4208 kSaveFPRegs, |
| 4229 EMIT_REMEMBERED_SET, | 4209 EMIT_REMEMBERED_SET, |
| (...skipping 1596 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5826 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); | 5806 __ sub(scratch, result, Operand::PointerOffsetFromSmiKey(index)); |
| 5827 __ ldr(result, FieldMemOperand(scratch, | 5807 __ ldr(result, FieldMemOperand(scratch, |
| 5828 FixedArray::kHeaderSize - kPointerSize)); | 5808 FixedArray::kHeaderSize - kPointerSize)); |
| 5829 __ bind(&done); | 5809 __ bind(&done); |
| 5830 } | 5810 } |
| 5831 | 5811 |
| 5832 | 5812 |
| 5833 #undef __ | 5813 #undef __ |
| 5834 | 5814 |
| 5835 } } // namespace v8::internal | 5815 } } // namespace v8::internal |
| OLD | NEW |