| 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/arm/lithium-codegen-arm.h" | 7 #include "src/arm/lithium-codegen-arm.h" |
| 8 #include "src/arm/lithium-gap-resolver-arm.h" | 8 #include "src/arm/lithium-gap-resolver-arm.h" |
| 9 #include "src/base/bits.h" | 9 #include "src/base/bits.h" |
| 10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
| (...skipping 3172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3183 Abort(kArrayIndexConstantValueTooBig); | 3183 Abort(kArrayIndexConstantValueTooBig); |
| 3184 } | 3184 } |
| 3185 } else { | 3185 } else { |
| 3186 key = ToRegister(instr->key()); | 3186 key = ToRegister(instr->key()); |
| 3187 } | 3187 } |
| 3188 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 3188 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
| 3189 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) | 3189 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
| 3190 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 3190 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
| 3191 int base_offset = instr->base_offset(); | 3191 int base_offset = instr->base_offset(); |
| 3192 | 3192 |
| 3193 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3193 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
| 3194 elements_kind == FLOAT32_ELEMENTS || | |
| 3195 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
| 3196 elements_kind == FLOAT64_ELEMENTS) { | |
| 3197 DwVfpRegister result = ToDoubleRegister(instr->result()); | 3194 DwVfpRegister result = ToDoubleRegister(instr->result()); |
| 3198 Operand operand = key_is_constant | 3195 Operand operand = key_is_constant |
| 3199 ? Operand(constant_key << element_size_shift) | 3196 ? Operand(constant_key << element_size_shift) |
| 3200 : Operand(key, LSL, shift_size); | 3197 : Operand(key, LSL, shift_size); |
| 3201 __ add(scratch0(), external_pointer, operand); | 3198 __ add(scratch0(), external_pointer, operand); |
| 3202 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3199 if (elements_kind == FLOAT32_ELEMENTS) { |
| 3203 elements_kind == FLOAT32_ELEMENTS) { | |
| 3204 __ vldr(double_scratch0().low(), scratch0(), base_offset); | 3200 __ vldr(double_scratch0().low(), scratch0(), base_offset); |
| 3205 __ vcvt_f64_f32(result, double_scratch0().low()); | 3201 __ vcvt_f64_f32(result, double_scratch0().low()); |
| 3206 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS | 3202 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS |
| 3207 __ vldr(result, scratch0(), base_offset); | 3203 __ vldr(result, scratch0(), base_offset); |
| 3208 } | 3204 } |
| 3209 } else { | 3205 } else { |
| 3210 Register result = ToRegister(instr->result()); | 3206 Register result = ToRegister(instr->result()); |
| 3211 MemOperand mem_operand = PrepareKeyedOperand( | 3207 MemOperand mem_operand = PrepareKeyedOperand( |
| 3212 key, external_pointer, key_is_constant, constant_key, | 3208 key, external_pointer, key_is_constant, constant_key, |
| 3213 element_size_shift, shift_size, base_offset); | 3209 element_size_shift, shift_size, base_offset); |
| 3214 switch (elements_kind) { | 3210 switch (elements_kind) { |
| 3215 case EXTERNAL_INT8_ELEMENTS: | |
| 3216 case INT8_ELEMENTS: | 3211 case INT8_ELEMENTS: |
| 3217 __ ldrsb(result, mem_operand); | 3212 __ ldrsb(result, mem_operand); |
| 3218 break; | 3213 break; |
| 3219 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 3220 case EXTERNAL_UINT8_ELEMENTS: | |
| 3221 case UINT8_ELEMENTS: | 3214 case UINT8_ELEMENTS: |
| 3222 case UINT8_CLAMPED_ELEMENTS: | 3215 case UINT8_CLAMPED_ELEMENTS: |
| 3223 __ ldrb(result, mem_operand); | 3216 __ ldrb(result, mem_operand); |
| 3224 break; | 3217 break; |
| 3225 case EXTERNAL_INT16_ELEMENTS: | |
| 3226 case INT16_ELEMENTS: | 3218 case INT16_ELEMENTS: |
| 3227 __ ldrsh(result, mem_operand); | 3219 __ ldrsh(result, mem_operand); |
| 3228 break; | 3220 break; |
| 3229 case EXTERNAL_UINT16_ELEMENTS: | |
| 3230 case UINT16_ELEMENTS: | 3221 case UINT16_ELEMENTS: |
| 3231 __ ldrh(result, mem_operand); | 3222 __ ldrh(result, mem_operand); |
| 3232 break; | 3223 break; |
| 3233 case EXTERNAL_INT32_ELEMENTS: | |
| 3234 case INT32_ELEMENTS: | 3224 case INT32_ELEMENTS: |
| 3235 __ ldr(result, mem_operand); | 3225 __ ldr(result, mem_operand); |
| 3236 break; | 3226 break; |
| 3237 case EXTERNAL_UINT32_ELEMENTS: | |
| 3238 case UINT32_ELEMENTS: | 3227 case UINT32_ELEMENTS: |
| 3239 __ ldr(result, mem_operand); | 3228 __ ldr(result, mem_operand); |
| 3240 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3229 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
| 3241 __ cmp(result, Operand(0x80000000)); | 3230 __ cmp(result, Operand(0x80000000)); |
| 3242 DeoptimizeIf(cs, instr, Deoptimizer::kNegativeValue); | 3231 DeoptimizeIf(cs, instr, Deoptimizer::kNegativeValue); |
| 3243 } | 3232 } |
| 3244 break; | 3233 break; |
| 3245 case FLOAT32_ELEMENTS: | 3234 case FLOAT32_ELEMENTS: |
| 3246 case FLOAT64_ELEMENTS: | 3235 case FLOAT64_ELEMENTS: |
| 3247 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 3248 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 3249 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3236 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 3250 case FAST_HOLEY_ELEMENTS: | 3237 case FAST_HOLEY_ELEMENTS: |
| 3251 case FAST_HOLEY_SMI_ELEMENTS: | 3238 case FAST_HOLEY_SMI_ELEMENTS: |
| 3252 case FAST_DOUBLE_ELEMENTS: | 3239 case FAST_DOUBLE_ELEMENTS: |
| 3253 case FAST_ELEMENTS: | 3240 case FAST_ELEMENTS: |
| 3254 case FAST_SMI_ELEMENTS: | 3241 case FAST_SMI_ELEMENTS: |
| 3255 case DICTIONARY_ELEMENTS: | 3242 case DICTIONARY_ELEMENTS: |
| 3256 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3243 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3257 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3244 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3258 UNREACHABLE(); | 3245 UNREACHABLE(); |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3348 __ cmp(result, Operand(Smi::FromInt(Isolate::kArrayProtectorValid))); | 3335 __ cmp(result, Operand(Smi::FromInt(Isolate::kArrayProtectorValid))); |
| 3349 DeoptimizeIf(ne, instr, Deoptimizer::kHole); | 3336 DeoptimizeIf(ne, instr, Deoptimizer::kHole); |
| 3350 } | 3337 } |
| 3351 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); | 3338 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); |
| 3352 __ bind(&done); | 3339 __ bind(&done); |
| 3353 } | 3340 } |
| 3354 } | 3341 } |
| 3355 | 3342 |
| 3356 | 3343 |
| 3357 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { | 3344 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { |
| 3358 if (instr->is_typed_elements()) { | 3345 if (instr->is_fixed_typed_array()) { |
| 3359 DoLoadKeyedExternalArray(instr); | 3346 DoLoadKeyedExternalArray(instr); |
| 3360 } else if (instr->hydrogen()->representation().IsDouble()) { | 3347 } else if (instr->hydrogen()->representation().IsDouble()) { |
| 3361 DoLoadKeyedFixedDoubleArray(instr); | 3348 DoLoadKeyedFixedDoubleArray(instr); |
| 3362 } else { | 3349 } else { |
| 3363 DoLoadKeyedFixedArray(instr); | 3350 DoLoadKeyedFixedArray(instr); |
| 3364 } | 3351 } |
| 3365 } | 3352 } |
| 3366 | 3353 |
| 3367 | 3354 |
| 3368 MemOperand LCodeGen::PrepareKeyedOperand(Register key, | 3355 MemOperand LCodeGen::PrepareKeyedOperand(Register key, |
| (...skipping 941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4310 Abort(kArrayIndexConstantValueTooBig); | 4297 Abort(kArrayIndexConstantValueTooBig); |
| 4311 } | 4298 } |
| 4312 } else { | 4299 } else { |
| 4313 key = ToRegister(instr->key()); | 4300 key = ToRegister(instr->key()); |
| 4314 } | 4301 } |
| 4315 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 4302 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
| 4316 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) | 4303 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
| 4317 ? (element_size_shift - kSmiTagSize) : element_size_shift; | 4304 ? (element_size_shift - kSmiTagSize) : element_size_shift; |
| 4318 int base_offset = instr->base_offset(); | 4305 int base_offset = instr->base_offset(); |
| 4319 | 4306 |
| 4320 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4307 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
| 4321 elements_kind == FLOAT32_ELEMENTS || | |
| 4322 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
| 4323 elements_kind == FLOAT64_ELEMENTS) { | |
| 4324 Register address = scratch0(); | 4308 Register address = scratch0(); |
| 4325 DwVfpRegister value(ToDoubleRegister(instr->value())); | 4309 DwVfpRegister value(ToDoubleRegister(instr->value())); |
| 4326 if (key_is_constant) { | 4310 if (key_is_constant) { |
| 4327 if (constant_key != 0) { | 4311 if (constant_key != 0) { |
| 4328 __ add(address, external_pointer, | 4312 __ add(address, external_pointer, |
| 4329 Operand(constant_key << element_size_shift)); | 4313 Operand(constant_key << element_size_shift)); |
| 4330 } else { | 4314 } else { |
| 4331 address = external_pointer; | 4315 address = external_pointer; |
| 4332 } | 4316 } |
| 4333 } else { | 4317 } else { |
| 4334 __ add(address, external_pointer, Operand(key, LSL, shift_size)); | 4318 __ add(address, external_pointer, Operand(key, LSL, shift_size)); |
| 4335 } | 4319 } |
| 4336 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4320 if (elements_kind == FLOAT32_ELEMENTS) { |
| 4337 elements_kind == FLOAT32_ELEMENTS) { | |
| 4338 __ vcvt_f32_f64(double_scratch0().low(), value); | 4321 __ vcvt_f32_f64(double_scratch0().low(), value); |
| 4339 __ vstr(double_scratch0().low(), address, base_offset); | 4322 __ vstr(double_scratch0().low(), address, base_offset); |
| 4340 } else { // Storing doubles, not floats. | 4323 } else { // Storing doubles, not floats. |
| 4341 __ vstr(value, address, base_offset); | 4324 __ vstr(value, address, base_offset); |
| 4342 } | 4325 } |
| 4343 } else { | 4326 } else { |
| 4344 Register value(ToRegister(instr->value())); | 4327 Register value(ToRegister(instr->value())); |
| 4345 MemOperand mem_operand = PrepareKeyedOperand( | 4328 MemOperand mem_operand = PrepareKeyedOperand( |
| 4346 key, external_pointer, key_is_constant, constant_key, | 4329 key, external_pointer, key_is_constant, constant_key, |
| 4347 element_size_shift, shift_size, | 4330 element_size_shift, shift_size, |
| 4348 base_offset); | 4331 base_offset); |
| 4349 switch (elements_kind) { | 4332 switch (elements_kind) { |
| 4350 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 4351 case EXTERNAL_INT8_ELEMENTS: | |
| 4352 case EXTERNAL_UINT8_ELEMENTS: | |
| 4353 case UINT8_ELEMENTS: | 4333 case UINT8_ELEMENTS: |
| 4354 case UINT8_CLAMPED_ELEMENTS: | 4334 case UINT8_CLAMPED_ELEMENTS: |
| 4355 case INT8_ELEMENTS: | 4335 case INT8_ELEMENTS: |
| 4356 __ strb(value, mem_operand); | 4336 __ strb(value, mem_operand); |
| 4357 break; | 4337 break; |
| 4358 case EXTERNAL_INT16_ELEMENTS: | |
| 4359 case EXTERNAL_UINT16_ELEMENTS: | |
| 4360 case INT16_ELEMENTS: | 4338 case INT16_ELEMENTS: |
| 4361 case UINT16_ELEMENTS: | 4339 case UINT16_ELEMENTS: |
| 4362 __ strh(value, mem_operand); | 4340 __ strh(value, mem_operand); |
| 4363 break; | 4341 break; |
| 4364 case EXTERNAL_INT32_ELEMENTS: | |
| 4365 case EXTERNAL_UINT32_ELEMENTS: | |
| 4366 case INT32_ELEMENTS: | 4342 case INT32_ELEMENTS: |
| 4367 case UINT32_ELEMENTS: | 4343 case UINT32_ELEMENTS: |
| 4368 __ str(value, mem_operand); | 4344 __ str(value, mem_operand); |
| 4369 break; | 4345 break; |
| 4370 case FLOAT32_ELEMENTS: | 4346 case FLOAT32_ELEMENTS: |
| 4371 case FLOAT64_ELEMENTS: | 4347 case FLOAT64_ELEMENTS: |
| 4372 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 4373 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 4374 case FAST_DOUBLE_ELEMENTS: | 4348 case FAST_DOUBLE_ELEMENTS: |
| 4375 case FAST_ELEMENTS: | 4349 case FAST_ELEMENTS: |
| 4376 case FAST_SMI_ELEMENTS: | 4350 case FAST_SMI_ELEMENTS: |
| 4377 case FAST_HOLEY_DOUBLE_ELEMENTS: | 4351 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 4378 case FAST_HOLEY_ELEMENTS: | 4352 case FAST_HOLEY_ELEMENTS: |
| 4379 case FAST_HOLEY_SMI_ELEMENTS: | 4353 case FAST_HOLEY_SMI_ELEMENTS: |
| 4380 case DICTIONARY_ELEMENTS: | 4354 case DICTIONARY_ELEMENTS: |
| 4381 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 4355 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 4382 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 4356 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 4383 UNREACHABLE(); | 4357 UNREACHABLE(); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4469 kSaveFPRegs, | 4443 kSaveFPRegs, |
| 4470 EMIT_REMEMBERED_SET, | 4444 EMIT_REMEMBERED_SET, |
| 4471 check_needed, | 4445 check_needed, |
| 4472 instr->hydrogen()->PointersToHereCheckForValue()); | 4446 instr->hydrogen()->PointersToHereCheckForValue()); |
| 4473 } | 4447 } |
| 4474 } | 4448 } |
| 4475 | 4449 |
| 4476 | 4450 |
| 4477 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4451 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
| 4478 // By cases: external, fast double | 4452 // By cases: external, fast double |
| 4479 if (instr->is_typed_elements()) { | 4453 if (instr->is_fixed_typed_array()) { |
| 4480 DoStoreKeyedExternalArray(instr); | 4454 DoStoreKeyedExternalArray(instr); |
| 4481 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4455 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
| 4482 DoStoreKeyedFixedDoubleArray(instr); | 4456 DoStoreKeyedFixedDoubleArray(instr); |
| 4483 } else { | 4457 } else { |
| 4484 DoStoreKeyedFixedArray(instr); | 4458 DoStoreKeyedFixedArray(instr); |
| 4485 } | 4459 } |
| 4486 } | 4460 } |
| 4487 | 4461 |
| 4488 | 4462 |
| 4489 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4463 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| (...skipping 1559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6049 __ push(ToRegister(instr->function())); | 6023 __ push(ToRegister(instr->function())); |
| 6050 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6024 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6051 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6025 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6052 } | 6026 } |
| 6053 | 6027 |
| 6054 | 6028 |
| 6055 #undef __ | 6029 #undef __ |
| 6056 | 6030 |
| 6057 } // namespace internal | 6031 } // namespace internal |
| 6058 } // namespace v8 | 6032 } // namespace v8 |
| OLD | NEW |