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/code-factory.h" | 7 #include "src/code-factory.h" |
8 #include "src/code-stubs.h" | 8 #include "src/code-stubs.h" |
9 #include "src/cpu-profiler.h" | 9 #include "src/cpu-profiler.h" |
10 #include "src/hydrogen-osr.h" | 10 #include "src/hydrogen-osr.h" |
(...skipping 3213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3224 } | 3224 } |
3225 } else { | 3225 } else { |
3226 key = ToRegister(instr->key()); | 3226 key = ToRegister(instr->key()); |
3227 } | 3227 } |
3228 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 3228 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
3229 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) | 3229 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
3230 ? (element_size_shift - (kSmiTagSize + kSmiShiftSize)) | 3230 ? (element_size_shift - (kSmiTagSize + kSmiShiftSize)) |
3231 : element_size_shift; | 3231 : element_size_shift; |
3232 int base_offset = instr->base_offset(); | 3232 int base_offset = instr->base_offset(); |
3233 | 3233 |
3234 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3234 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
3235 elements_kind == FLOAT32_ELEMENTS || | |
3236 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
3237 elements_kind == FLOAT64_ELEMENTS) { | |
3238 FPURegister result = ToDoubleRegister(instr->result()); | 3235 FPURegister result = ToDoubleRegister(instr->result()); |
3239 if (key_is_constant) { | 3236 if (key_is_constant) { |
3240 __ Daddu(scratch0(), external_pointer, | 3237 __ Daddu(scratch0(), external_pointer, |
3241 constant_key << element_size_shift); | 3238 constant_key << element_size_shift); |
3242 } else { | 3239 } else { |
3243 if (shift_size < 0) { | 3240 if (shift_size < 0) { |
3244 if (shift_size == -32) { | 3241 if (shift_size == -32) { |
3245 __ dsra32(scratch0(), key, 0); | 3242 __ dsra32(scratch0(), key, 0); |
3246 } else { | 3243 } else { |
3247 __ dsra(scratch0(), key, -shift_size); | 3244 __ dsra(scratch0(), key, -shift_size); |
3248 } | 3245 } |
3249 } else { | 3246 } else { |
3250 __ dsll(scratch0(), key, shift_size); | 3247 __ dsll(scratch0(), key, shift_size); |
3251 } | 3248 } |
3252 __ Daddu(scratch0(), scratch0(), external_pointer); | 3249 __ Daddu(scratch0(), scratch0(), external_pointer); |
3253 } | 3250 } |
3254 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3251 if (elements_kind == FLOAT32_ELEMENTS) { |
3255 elements_kind == FLOAT32_ELEMENTS) { | |
3256 __ lwc1(result, MemOperand(scratch0(), base_offset)); | 3252 __ lwc1(result, MemOperand(scratch0(), base_offset)); |
3257 __ cvt_d_s(result, result); | 3253 __ cvt_d_s(result, result); |
3258 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS | 3254 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS |
3259 __ ldc1(result, MemOperand(scratch0(), base_offset)); | 3255 __ ldc1(result, MemOperand(scratch0(), base_offset)); |
3260 } | 3256 } |
3261 } else { | 3257 } else { |
3262 Register result = ToRegister(instr->result()); | 3258 Register result = ToRegister(instr->result()); |
3263 MemOperand mem_operand = PrepareKeyedOperand( | 3259 MemOperand mem_operand = PrepareKeyedOperand( |
3264 key, external_pointer, key_is_constant, constant_key, | 3260 key, external_pointer, key_is_constant, constant_key, |
3265 element_size_shift, shift_size, base_offset); | 3261 element_size_shift, shift_size, base_offset); |
3266 switch (elements_kind) { | 3262 switch (elements_kind) { |
3267 case EXTERNAL_INT8_ELEMENTS: | |
3268 case INT8_ELEMENTS: | 3263 case INT8_ELEMENTS: |
3269 __ lb(result, mem_operand); | 3264 __ lb(result, mem_operand); |
3270 break; | 3265 break; |
3271 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
3272 case EXTERNAL_UINT8_ELEMENTS: | |
3273 case UINT8_ELEMENTS: | 3266 case UINT8_ELEMENTS: |
3274 case UINT8_CLAMPED_ELEMENTS: | 3267 case UINT8_CLAMPED_ELEMENTS: |
3275 __ lbu(result, mem_operand); | 3268 __ lbu(result, mem_operand); |
3276 break; | 3269 break; |
3277 case EXTERNAL_INT16_ELEMENTS: | |
3278 case INT16_ELEMENTS: | 3270 case INT16_ELEMENTS: |
3279 __ lh(result, mem_operand); | 3271 __ lh(result, mem_operand); |
3280 break; | 3272 break; |
3281 case EXTERNAL_UINT16_ELEMENTS: | |
3282 case UINT16_ELEMENTS: | 3273 case UINT16_ELEMENTS: |
3283 __ lhu(result, mem_operand); | 3274 __ lhu(result, mem_operand); |
3284 break; | 3275 break; |
3285 case EXTERNAL_INT32_ELEMENTS: | |
3286 case INT32_ELEMENTS: | 3276 case INT32_ELEMENTS: |
3287 __ lw(result, mem_operand); | 3277 __ lw(result, mem_operand); |
3288 break; | 3278 break; |
3289 case EXTERNAL_UINT32_ELEMENTS: | |
3290 case UINT32_ELEMENTS: | 3279 case UINT32_ELEMENTS: |
3291 __ lw(result, mem_operand); | 3280 __ lw(result, mem_operand); |
3292 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3281 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
3293 DeoptimizeIf(Ugreater_equal, instr, Deoptimizer::kNegativeValue, | 3282 DeoptimizeIf(Ugreater_equal, instr, Deoptimizer::kNegativeValue, |
3294 result, Operand(0x80000000)); | 3283 result, Operand(0x80000000)); |
3295 } | 3284 } |
3296 break; | 3285 break; |
3297 case FLOAT32_ELEMENTS: | 3286 case FLOAT32_ELEMENTS: |
3298 case FLOAT64_ELEMENTS: | 3287 case FLOAT64_ELEMENTS: |
3299 case EXTERNAL_FLOAT32_ELEMENTS: | |
3300 case EXTERNAL_FLOAT64_ELEMENTS: | |
3301 case FAST_DOUBLE_ELEMENTS: | 3288 case FAST_DOUBLE_ELEMENTS: |
3302 case FAST_ELEMENTS: | 3289 case FAST_ELEMENTS: |
3303 case FAST_SMI_ELEMENTS: | 3290 case FAST_SMI_ELEMENTS: |
3304 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3291 case FAST_HOLEY_DOUBLE_ELEMENTS: |
3305 case FAST_HOLEY_ELEMENTS: | 3292 case FAST_HOLEY_ELEMENTS: |
3306 case FAST_HOLEY_SMI_ELEMENTS: | 3293 case FAST_HOLEY_SMI_ELEMENTS: |
3307 case DICTIONARY_ELEMENTS: | 3294 case DICTIONARY_ELEMENTS: |
3308 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3295 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
3309 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3296 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
3310 UNREACHABLE(); | 3297 UNREACHABLE(); |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3428 DeoptimizeIf(ne, instr, Deoptimizer::kHole, result, | 3415 DeoptimizeIf(ne, instr, Deoptimizer::kHole, result, |
3429 Operand(Smi::FromInt(Isolate::kArrayProtectorValid))); | 3416 Operand(Smi::FromInt(Isolate::kArrayProtectorValid))); |
3430 } | 3417 } |
3431 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); | 3418 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); |
3432 __ bind(&done); | 3419 __ bind(&done); |
3433 } | 3420 } |
3434 } | 3421 } |
3435 | 3422 |
3436 | 3423 |
3437 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { | 3424 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { |
3438 if (instr->is_typed_elements()) { | 3425 if (instr->is_fixed_typed_array()) { |
3439 DoLoadKeyedExternalArray(instr); | 3426 DoLoadKeyedExternalArray(instr); |
3440 } else if (instr->hydrogen()->representation().IsDouble()) { | 3427 } else if (instr->hydrogen()->representation().IsDouble()) { |
3441 DoLoadKeyedFixedDoubleArray(instr); | 3428 DoLoadKeyedFixedDoubleArray(instr); |
3442 } else { | 3429 } else { |
3443 DoLoadKeyedFixedArray(instr); | 3430 DoLoadKeyedFixedArray(instr); |
3444 } | 3431 } |
3445 } | 3432 } |
3446 | 3433 |
3447 | 3434 |
3448 MemOperand LCodeGen::PrepareKeyedOperand(Register key, | 3435 MemOperand LCodeGen::PrepareKeyedOperand(Register key, |
(...skipping 1010 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4459 } | 4446 } |
4460 } else { | 4447 } else { |
4461 key = ToRegister(instr->key()); | 4448 key = ToRegister(instr->key()); |
4462 } | 4449 } |
4463 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 4450 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
4464 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) | 4451 int shift_size = (instr->hydrogen()->key()->representation().IsSmi()) |
4465 ? (element_size_shift - (kSmiTagSize + kSmiShiftSize)) | 4452 ? (element_size_shift - (kSmiTagSize + kSmiShiftSize)) |
4466 : element_size_shift; | 4453 : element_size_shift; |
4467 int base_offset = instr->base_offset(); | 4454 int base_offset = instr->base_offset(); |
4468 | 4455 |
4469 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4456 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
4470 elements_kind == FLOAT32_ELEMENTS || | |
4471 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
4472 elements_kind == FLOAT64_ELEMENTS) { | |
4473 Register address = scratch0(); | 4457 Register address = scratch0(); |
4474 FPURegister value(ToDoubleRegister(instr->value())); | 4458 FPURegister value(ToDoubleRegister(instr->value())); |
4475 if (key_is_constant) { | 4459 if (key_is_constant) { |
4476 if (constant_key != 0) { | 4460 if (constant_key != 0) { |
4477 __ Daddu(address, external_pointer, | 4461 __ Daddu(address, external_pointer, |
4478 Operand(constant_key << element_size_shift)); | 4462 Operand(constant_key << element_size_shift)); |
4479 } else { | 4463 } else { |
4480 address = external_pointer; | 4464 address = external_pointer; |
4481 } | 4465 } |
4482 } else { | 4466 } else { |
4483 if (shift_size < 0) { | 4467 if (shift_size < 0) { |
4484 if (shift_size == -32) { | 4468 if (shift_size == -32) { |
4485 __ dsra32(address, key, 0); | 4469 __ dsra32(address, key, 0); |
4486 } else { | 4470 } else { |
4487 __ dsra(address, key, -shift_size); | 4471 __ dsra(address, key, -shift_size); |
4488 } | 4472 } |
4489 } else { | 4473 } else { |
4490 __ dsll(address, key, shift_size); | 4474 __ dsll(address, key, shift_size); |
4491 } | 4475 } |
4492 __ Daddu(address, external_pointer, address); | 4476 __ Daddu(address, external_pointer, address); |
4493 } | 4477 } |
4494 | 4478 |
4495 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4479 if (elements_kind == FLOAT32_ELEMENTS) { |
4496 elements_kind == FLOAT32_ELEMENTS) { | |
4497 __ cvt_s_d(double_scratch0(), value); | 4480 __ cvt_s_d(double_scratch0(), value); |
4498 __ swc1(double_scratch0(), MemOperand(address, base_offset)); | 4481 __ swc1(double_scratch0(), MemOperand(address, base_offset)); |
4499 } else { // Storing doubles, not floats. | 4482 } else { // Storing doubles, not floats. |
4500 __ sdc1(value, MemOperand(address, base_offset)); | 4483 __ sdc1(value, MemOperand(address, base_offset)); |
4501 } | 4484 } |
4502 } else { | 4485 } else { |
4503 Register value(ToRegister(instr->value())); | 4486 Register value(ToRegister(instr->value())); |
4504 MemOperand mem_operand = PrepareKeyedOperand( | 4487 MemOperand mem_operand = PrepareKeyedOperand( |
4505 key, external_pointer, key_is_constant, constant_key, | 4488 key, external_pointer, key_is_constant, constant_key, |
4506 element_size_shift, shift_size, | 4489 element_size_shift, shift_size, |
4507 base_offset); | 4490 base_offset); |
4508 switch (elements_kind) { | 4491 switch (elements_kind) { |
4509 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
4510 case EXTERNAL_INT8_ELEMENTS: | |
4511 case EXTERNAL_UINT8_ELEMENTS: | |
4512 case UINT8_ELEMENTS: | 4492 case UINT8_ELEMENTS: |
4513 case UINT8_CLAMPED_ELEMENTS: | 4493 case UINT8_CLAMPED_ELEMENTS: |
4514 case INT8_ELEMENTS: | 4494 case INT8_ELEMENTS: |
4515 __ sb(value, mem_operand); | 4495 __ sb(value, mem_operand); |
4516 break; | 4496 break; |
4517 case EXTERNAL_INT16_ELEMENTS: | |
4518 case EXTERNAL_UINT16_ELEMENTS: | |
4519 case INT16_ELEMENTS: | 4497 case INT16_ELEMENTS: |
4520 case UINT16_ELEMENTS: | 4498 case UINT16_ELEMENTS: |
4521 __ sh(value, mem_operand); | 4499 __ sh(value, mem_operand); |
4522 break; | 4500 break; |
4523 case EXTERNAL_INT32_ELEMENTS: | |
4524 case EXTERNAL_UINT32_ELEMENTS: | |
4525 case INT32_ELEMENTS: | 4501 case INT32_ELEMENTS: |
4526 case UINT32_ELEMENTS: | 4502 case UINT32_ELEMENTS: |
4527 __ sw(value, mem_operand); | 4503 __ sw(value, mem_operand); |
4528 break; | 4504 break; |
4529 case FLOAT32_ELEMENTS: | 4505 case FLOAT32_ELEMENTS: |
4530 case FLOAT64_ELEMENTS: | 4506 case FLOAT64_ELEMENTS: |
4531 case EXTERNAL_FLOAT32_ELEMENTS: | |
4532 case EXTERNAL_FLOAT64_ELEMENTS: | |
4533 case FAST_DOUBLE_ELEMENTS: | 4507 case FAST_DOUBLE_ELEMENTS: |
4534 case FAST_ELEMENTS: | 4508 case FAST_ELEMENTS: |
4535 case FAST_SMI_ELEMENTS: | 4509 case FAST_SMI_ELEMENTS: |
4536 case FAST_HOLEY_DOUBLE_ELEMENTS: | 4510 case FAST_HOLEY_DOUBLE_ELEMENTS: |
4537 case FAST_HOLEY_ELEMENTS: | 4511 case FAST_HOLEY_ELEMENTS: |
4538 case FAST_HOLEY_SMI_ELEMENTS: | 4512 case FAST_HOLEY_SMI_ELEMENTS: |
4539 case DICTIONARY_ELEMENTS: | 4513 case DICTIONARY_ELEMENTS: |
4540 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 4514 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
4541 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 4515 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
4542 UNREACHABLE(); | 4516 UNREACHABLE(); |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4649 kSaveFPRegs, | 4623 kSaveFPRegs, |
4650 EMIT_REMEMBERED_SET, | 4624 EMIT_REMEMBERED_SET, |
4651 check_needed, | 4625 check_needed, |
4652 instr->hydrogen()->PointersToHereCheckForValue()); | 4626 instr->hydrogen()->PointersToHereCheckForValue()); |
4653 } | 4627 } |
4654 } | 4628 } |
4655 | 4629 |
4656 | 4630 |
4657 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4631 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
4658 // By cases: external, fast double | 4632 // By cases: external, fast double |
4659 if (instr->is_typed_elements()) { | 4633 if (instr->is_fixed_typed_array()) { |
4660 DoStoreKeyedExternalArray(instr); | 4634 DoStoreKeyedExternalArray(instr); |
4661 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4635 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
4662 DoStoreKeyedFixedDoubleArray(instr); | 4636 DoStoreKeyedFixedDoubleArray(instr); |
4663 } else { | 4637 } else { |
4664 DoStoreKeyedFixedArray(instr); | 4638 DoStoreKeyedFixedArray(instr); |
4665 } | 4639 } |
4666 } | 4640 } |
4667 | 4641 |
4668 | 4642 |
4669 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4643 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
(...skipping 1598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6268 __ Push(at, ToRegister(instr->function())); | 6242 __ Push(at, ToRegister(instr->function())); |
6269 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6243 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
6270 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6244 RecordSafepoint(Safepoint::kNoLazyDeopt); |
6271 } | 6245 } |
6272 | 6246 |
6273 | 6247 |
6274 #undef __ | 6248 #undef __ |
6275 | 6249 |
6276 } // namespace internal | 6250 } // namespace internal |
6277 } // namespace v8 | 6251 } // namespace v8 |
OLD | NEW |