| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/base/bits.h" | 7 #include "src/base/bits.h" |
| 8 #include "src/code-factory.h" | 8 #include "src/code-factory.h" |
| 9 #include "src/code-stubs.h" | 9 #include "src/code-stubs.h" |
| 10 #include "src/cpu-profiler.h" | 10 #include "src/cpu-profiler.h" |
| (...skipping 3279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3290 if (constant_key & 0xF0000000) { | 3290 if (constant_key & 0xF0000000) { |
| 3291 Abort(kArrayIndexConstantValueTooBig); | 3291 Abort(kArrayIndexConstantValueTooBig); |
| 3292 } | 3292 } |
| 3293 } else { | 3293 } else { |
| 3294 key = ToRegister(instr->key()); | 3294 key = ToRegister(instr->key()); |
| 3295 } | 3295 } |
| 3296 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 3296 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
| 3297 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); | 3297 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); |
| 3298 int base_offset = instr->base_offset(); | 3298 int base_offset = instr->base_offset(); |
| 3299 | 3299 |
| 3300 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3300 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
| 3301 elements_kind == FLOAT32_ELEMENTS || | |
| 3302 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
| 3303 elements_kind == FLOAT64_ELEMENTS) { | |
| 3304 DoubleRegister result = ToDoubleRegister(instr->result()); | 3301 DoubleRegister result = ToDoubleRegister(instr->result()); |
| 3305 if (key_is_constant) { | 3302 if (key_is_constant) { |
| 3306 __ Add(scratch0(), external_pointer, constant_key << element_size_shift, | 3303 __ Add(scratch0(), external_pointer, constant_key << element_size_shift, |
| 3307 r0); | 3304 r0); |
| 3308 } else { | 3305 } else { |
| 3309 __ IndexToArrayOffset(r0, key, element_size_shift, key_is_smi); | 3306 __ IndexToArrayOffset(r0, key, element_size_shift, key_is_smi); |
| 3310 __ add(scratch0(), external_pointer, r0); | 3307 __ add(scratch0(), external_pointer, r0); |
| 3311 } | 3308 } |
| 3312 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 3309 if (elements_kind == FLOAT32_ELEMENTS) { |
| 3313 elements_kind == FLOAT32_ELEMENTS) { | |
| 3314 __ lfs(result, MemOperand(scratch0(), base_offset)); | 3310 __ lfs(result, MemOperand(scratch0(), base_offset)); |
| 3315 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS | 3311 } else { // i.e. elements_kind == EXTERNAL_DOUBLE_ELEMENTS |
| 3316 __ lfd(result, MemOperand(scratch0(), base_offset)); | 3312 __ lfd(result, MemOperand(scratch0(), base_offset)); |
| 3317 } | 3313 } |
| 3318 } else { | 3314 } else { |
| 3319 Register result = ToRegister(instr->result()); | 3315 Register result = ToRegister(instr->result()); |
| 3320 MemOperand mem_operand = | 3316 MemOperand mem_operand = |
| 3321 PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi, | 3317 PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi, |
| 3322 constant_key, element_size_shift, base_offset); | 3318 constant_key, element_size_shift, base_offset); |
| 3323 switch (elements_kind) { | 3319 switch (elements_kind) { |
| 3324 case EXTERNAL_INT8_ELEMENTS: | |
| 3325 case INT8_ELEMENTS: | 3320 case INT8_ELEMENTS: |
| 3326 if (key_is_constant) { | 3321 if (key_is_constant) { |
| 3327 __ LoadByte(result, mem_operand, r0); | 3322 __ LoadByte(result, mem_operand, r0); |
| 3328 } else { | 3323 } else { |
| 3329 __ lbzx(result, mem_operand); | 3324 __ lbzx(result, mem_operand); |
| 3330 } | 3325 } |
| 3331 __ extsb(result, result); | 3326 __ extsb(result, result); |
| 3332 break; | 3327 break; |
| 3333 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 3334 case EXTERNAL_UINT8_ELEMENTS: | |
| 3335 case UINT8_ELEMENTS: | 3328 case UINT8_ELEMENTS: |
| 3336 case UINT8_CLAMPED_ELEMENTS: | 3329 case UINT8_CLAMPED_ELEMENTS: |
| 3337 if (key_is_constant) { | 3330 if (key_is_constant) { |
| 3338 __ LoadByte(result, mem_operand, r0); | 3331 __ LoadByte(result, mem_operand, r0); |
| 3339 } else { | 3332 } else { |
| 3340 __ lbzx(result, mem_operand); | 3333 __ lbzx(result, mem_operand); |
| 3341 } | 3334 } |
| 3342 break; | 3335 break; |
| 3343 case EXTERNAL_INT16_ELEMENTS: | |
| 3344 case INT16_ELEMENTS: | 3336 case INT16_ELEMENTS: |
| 3345 if (key_is_constant) { | 3337 if (key_is_constant) { |
| 3346 __ LoadHalfWordArith(result, mem_operand, r0); | 3338 __ LoadHalfWordArith(result, mem_operand, r0); |
| 3347 } else { | 3339 } else { |
| 3348 __ lhax(result, mem_operand); | 3340 __ lhax(result, mem_operand); |
| 3349 } | 3341 } |
| 3350 break; | 3342 break; |
| 3351 case EXTERNAL_UINT16_ELEMENTS: | |
| 3352 case UINT16_ELEMENTS: | 3343 case UINT16_ELEMENTS: |
| 3353 if (key_is_constant) { | 3344 if (key_is_constant) { |
| 3354 __ LoadHalfWord(result, mem_operand, r0); | 3345 __ LoadHalfWord(result, mem_operand, r0); |
| 3355 } else { | 3346 } else { |
| 3356 __ lhzx(result, mem_operand); | 3347 __ lhzx(result, mem_operand); |
| 3357 } | 3348 } |
| 3358 break; | 3349 break; |
| 3359 case EXTERNAL_INT32_ELEMENTS: | |
| 3360 case INT32_ELEMENTS: | 3350 case INT32_ELEMENTS: |
| 3361 if (key_is_constant) { | 3351 if (key_is_constant) { |
| 3362 __ LoadWordArith(result, mem_operand, r0); | 3352 __ LoadWordArith(result, mem_operand, r0); |
| 3363 } else { | 3353 } else { |
| 3364 __ lwax(result, mem_operand); | 3354 __ lwax(result, mem_operand); |
| 3365 } | 3355 } |
| 3366 break; | 3356 break; |
| 3367 case EXTERNAL_UINT32_ELEMENTS: | |
| 3368 case UINT32_ELEMENTS: | 3357 case UINT32_ELEMENTS: |
| 3369 if (key_is_constant) { | 3358 if (key_is_constant) { |
| 3370 __ LoadWord(result, mem_operand, r0); | 3359 __ LoadWord(result, mem_operand, r0); |
| 3371 } else { | 3360 } else { |
| 3372 __ lwzx(result, mem_operand); | 3361 __ lwzx(result, mem_operand); |
| 3373 } | 3362 } |
| 3374 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { | 3363 if (!instr->hydrogen()->CheckFlag(HInstruction::kUint32)) { |
| 3375 __ lis(r0, Operand(SIGN_EXT_IMM16(0x8000))); | 3364 __ lis(r0, Operand(SIGN_EXT_IMM16(0x8000))); |
| 3376 __ cmplw(result, r0); | 3365 __ cmplw(result, r0); |
| 3377 DeoptimizeIf(ge, instr, Deoptimizer::kNegativeValue); | 3366 DeoptimizeIf(ge, instr, Deoptimizer::kNegativeValue); |
| 3378 } | 3367 } |
| 3379 break; | 3368 break; |
| 3380 case FLOAT32_ELEMENTS: | 3369 case FLOAT32_ELEMENTS: |
| 3381 case FLOAT64_ELEMENTS: | 3370 case FLOAT64_ELEMENTS: |
| 3382 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 3383 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 3384 case FAST_HOLEY_DOUBLE_ELEMENTS: | 3371 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 3385 case FAST_HOLEY_ELEMENTS: | 3372 case FAST_HOLEY_ELEMENTS: |
| 3386 case FAST_HOLEY_SMI_ELEMENTS: | 3373 case FAST_HOLEY_SMI_ELEMENTS: |
| 3387 case FAST_DOUBLE_ELEMENTS: | 3374 case FAST_DOUBLE_ELEMENTS: |
| 3388 case FAST_ELEMENTS: | 3375 case FAST_ELEMENTS: |
| 3389 case FAST_SMI_ELEMENTS: | 3376 case FAST_SMI_ELEMENTS: |
| 3390 case DICTIONARY_ELEMENTS: | 3377 case DICTIONARY_ELEMENTS: |
| 3391 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 3378 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3392 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 3379 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 3393 UNREACHABLE(); | 3380 UNREACHABLE(); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3510 __ CmpSmiLiteral(result, Smi::FromInt(Isolate::kArrayProtectorValid), r0); | 3497 __ CmpSmiLiteral(result, Smi::FromInt(Isolate::kArrayProtectorValid), r0); |
| 3511 DeoptimizeIf(ne, instr, Deoptimizer::kHole); | 3498 DeoptimizeIf(ne, instr, Deoptimizer::kHole); |
| 3512 } | 3499 } |
| 3513 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); | 3500 __ LoadRoot(result, Heap::kUndefinedValueRootIndex); |
| 3514 __ bind(&done); | 3501 __ bind(&done); |
| 3515 } | 3502 } |
| 3516 } | 3503 } |
| 3517 | 3504 |
| 3518 | 3505 |
| 3519 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { | 3506 void LCodeGen::DoLoadKeyed(LLoadKeyed* instr) { |
| 3520 if (instr->is_typed_elements()) { | 3507 if (instr->is_fixed_typed_array()) { |
| 3521 DoLoadKeyedExternalArray(instr); | 3508 DoLoadKeyedExternalArray(instr); |
| 3522 } else if (instr->hydrogen()->representation().IsDouble()) { | 3509 } else if (instr->hydrogen()->representation().IsDouble()) { |
| 3523 DoLoadKeyedFixedDoubleArray(instr); | 3510 DoLoadKeyedFixedDoubleArray(instr); |
| 3524 } else { | 3511 } else { |
| 3525 DoLoadKeyedFixedArray(instr); | 3512 DoLoadKeyedFixedArray(instr); |
| 3526 } | 3513 } |
| 3527 } | 3514 } |
| 3528 | 3515 |
| 3529 | 3516 |
| 3530 MemOperand LCodeGen::PrepareKeyedOperand(Register key, Register base, | 3517 MemOperand LCodeGen::PrepareKeyedOperand(Register key, Register base, |
| (...skipping 1033 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4564 if (constant_key & 0xF0000000) { | 4551 if (constant_key & 0xF0000000) { |
| 4565 Abort(kArrayIndexConstantValueTooBig); | 4552 Abort(kArrayIndexConstantValueTooBig); |
| 4566 } | 4553 } |
| 4567 } else { | 4554 } else { |
| 4568 key = ToRegister(instr->key()); | 4555 key = ToRegister(instr->key()); |
| 4569 } | 4556 } |
| 4570 int element_size_shift = ElementsKindToShiftSize(elements_kind); | 4557 int element_size_shift = ElementsKindToShiftSize(elements_kind); |
| 4571 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); | 4558 bool key_is_smi = instr->hydrogen()->key()->representation().IsSmi(); |
| 4572 int base_offset = instr->base_offset(); | 4559 int base_offset = instr->base_offset(); |
| 4573 | 4560 |
| 4574 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4561 if (elements_kind == FLOAT32_ELEMENTS || elements_kind == FLOAT64_ELEMENTS) { |
| 4575 elements_kind == FLOAT32_ELEMENTS || | |
| 4576 elements_kind == EXTERNAL_FLOAT64_ELEMENTS || | |
| 4577 elements_kind == FLOAT64_ELEMENTS) { | |
| 4578 Register address = scratch0(); | 4562 Register address = scratch0(); |
| 4579 DoubleRegister value(ToDoubleRegister(instr->value())); | 4563 DoubleRegister value(ToDoubleRegister(instr->value())); |
| 4580 if (key_is_constant) { | 4564 if (key_is_constant) { |
| 4581 if (constant_key != 0) { | 4565 if (constant_key != 0) { |
| 4582 __ Add(address, external_pointer, constant_key << element_size_shift, | 4566 __ Add(address, external_pointer, constant_key << element_size_shift, |
| 4583 r0); | 4567 r0); |
| 4584 } else { | 4568 } else { |
| 4585 address = external_pointer; | 4569 address = external_pointer; |
| 4586 } | 4570 } |
| 4587 } else { | 4571 } else { |
| 4588 __ IndexToArrayOffset(r0, key, element_size_shift, key_is_smi); | 4572 __ IndexToArrayOffset(r0, key, element_size_shift, key_is_smi); |
| 4589 __ add(address, external_pointer, r0); | 4573 __ add(address, external_pointer, r0); |
| 4590 } | 4574 } |
| 4591 if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || | 4575 if (elements_kind == FLOAT32_ELEMENTS) { |
| 4592 elements_kind == FLOAT32_ELEMENTS) { | |
| 4593 __ frsp(double_scratch0(), value); | 4576 __ frsp(double_scratch0(), value); |
| 4594 __ stfs(double_scratch0(), MemOperand(address, base_offset)); | 4577 __ stfs(double_scratch0(), MemOperand(address, base_offset)); |
| 4595 } else { // Storing doubles, not floats. | 4578 } else { // Storing doubles, not floats. |
| 4596 __ stfd(value, MemOperand(address, base_offset)); | 4579 __ stfd(value, MemOperand(address, base_offset)); |
| 4597 } | 4580 } |
| 4598 } else { | 4581 } else { |
| 4599 Register value(ToRegister(instr->value())); | 4582 Register value(ToRegister(instr->value())); |
| 4600 MemOperand mem_operand = | 4583 MemOperand mem_operand = |
| 4601 PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi, | 4584 PrepareKeyedOperand(key, external_pointer, key_is_constant, key_is_smi, |
| 4602 constant_key, element_size_shift, base_offset); | 4585 constant_key, element_size_shift, base_offset); |
| 4603 switch (elements_kind) { | 4586 switch (elements_kind) { |
| 4604 case EXTERNAL_UINT8_CLAMPED_ELEMENTS: | |
| 4605 case EXTERNAL_INT8_ELEMENTS: | |
| 4606 case EXTERNAL_UINT8_ELEMENTS: | |
| 4607 case UINT8_ELEMENTS: | 4587 case UINT8_ELEMENTS: |
| 4608 case UINT8_CLAMPED_ELEMENTS: | 4588 case UINT8_CLAMPED_ELEMENTS: |
| 4609 case INT8_ELEMENTS: | 4589 case INT8_ELEMENTS: |
| 4610 if (key_is_constant) { | 4590 if (key_is_constant) { |
| 4611 __ StoreByte(value, mem_operand, r0); | 4591 __ StoreByte(value, mem_operand, r0); |
| 4612 } else { | 4592 } else { |
| 4613 __ stbx(value, mem_operand); | 4593 __ stbx(value, mem_operand); |
| 4614 } | 4594 } |
| 4615 break; | 4595 break; |
| 4616 case EXTERNAL_INT16_ELEMENTS: | |
| 4617 case EXTERNAL_UINT16_ELEMENTS: | |
| 4618 case INT16_ELEMENTS: | 4596 case INT16_ELEMENTS: |
| 4619 case UINT16_ELEMENTS: | 4597 case UINT16_ELEMENTS: |
| 4620 if (key_is_constant) { | 4598 if (key_is_constant) { |
| 4621 __ StoreHalfWord(value, mem_operand, r0); | 4599 __ StoreHalfWord(value, mem_operand, r0); |
| 4622 } else { | 4600 } else { |
| 4623 __ sthx(value, mem_operand); | 4601 __ sthx(value, mem_operand); |
| 4624 } | 4602 } |
| 4625 break; | 4603 break; |
| 4626 case EXTERNAL_INT32_ELEMENTS: | |
| 4627 case EXTERNAL_UINT32_ELEMENTS: | |
| 4628 case INT32_ELEMENTS: | 4604 case INT32_ELEMENTS: |
| 4629 case UINT32_ELEMENTS: | 4605 case UINT32_ELEMENTS: |
| 4630 if (key_is_constant) { | 4606 if (key_is_constant) { |
| 4631 __ StoreWord(value, mem_operand, r0); | 4607 __ StoreWord(value, mem_operand, r0); |
| 4632 } else { | 4608 } else { |
| 4633 __ stwx(value, mem_operand); | 4609 __ stwx(value, mem_operand); |
| 4634 } | 4610 } |
| 4635 break; | 4611 break; |
| 4636 case FLOAT32_ELEMENTS: | 4612 case FLOAT32_ELEMENTS: |
| 4637 case FLOAT64_ELEMENTS: | 4613 case FLOAT64_ELEMENTS: |
| 4638 case EXTERNAL_FLOAT32_ELEMENTS: | |
| 4639 case EXTERNAL_FLOAT64_ELEMENTS: | |
| 4640 case FAST_DOUBLE_ELEMENTS: | 4614 case FAST_DOUBLE_ELEMENTS: |
| 4641 case FAST_ELEMENTS: | 4615 case FAST_ELEMENTS: |
| 4642 case FAST_SMI_ELEMENTS: | 4616 case FAST_SMI_ELEMENTS: |
| 4643 case FAST_HOLEY_DOUBLE_ELEMENTS: | 4617 case FAST_HOLEY_DOUBLE_ELEMENTS: |
| 4644 case FAST_HOLEY_ELEMENTS: | 4618 case FAST_HOLEY_ELEMENTS: |
| 4645 case FAST_HOLEY_SMI_ELEMENTS: | 4619 case FAST_HOLEY_SMI_ELEMENTS: |
| 4646 case DICTIONARY_ELEMENTS: | 4620 case DICTIONARY_ELEMENTS: |
| 4647 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: | 4621 case FAST_SLOPPY_ARGUMENTS_ELEMENTS: |
| 4648 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: | 4622 case SLOW_SLOPPY_ARGUMENTS_ELEMENTS: |
| 4649 UNREACHABLE(); | 4623 UNREACHABLE(); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4747 __ Add(key, store_base, offset, r0); | 4721 __ Add(key, store_base, offset, r0); |
| 4748 __ RecordWrite(elements, key, value, GetLinkRegisterState(), kSaveFPRegs, | 4722 __ RecordWrite(elements, key, value, GetLinkRegisterState(), kSaveFPRegs, |
| 4749 EMIT_REMEMBERED_SET, check_needed, | 4723 EMIT_REMEMBERED_SET, check_needed, |
| 4750 hinstr->PointersToHereCheckForValue()); | 4724 hinstr->PointersToHereCheckForValue()); |
| 4751 } | 4725 } |
| 4752 } | 4726 } |
| 4753 | 4727 |
| 4754 | 4728 |
| 4755 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { | 4729 void LCodeGen::DoStoreKeyed(LStoreKeyed* instr) { |
| 4756 // By cases: external, fast double | 4730 // By cases: external, fast double |
| 4757 if (instr->is_typed_elements()) { | 4731 if (instr->is_fixed_typed_array()) { |
| 4758 DoStoreKeyedExternalArray(instr); | 4732 DoStoreKeyedExternalArray(instr); |
| 4759 } else if (instr->hydrogen()->value()->representation().IsDouble()) { | 4733 } else if (instr->hydrogen()->value()->representation().IsDouble()) { |
| 4760 DoStoreKeyedFixedDoubleArray(instr); | 4734 DoStoreKeyedFixedDoubleArray(instr); |
| 4761 } else { | 4735 } else { |
| 4762 DoStoreKeyedFixedArray(instr); | 4736 DoStoreKeyedFixedArray(instr); |
| 4763 } | 4737 } |
| 4764 } | 4738 } |
| 4765 | 4739 |
| 4766 | 4740 |
| 4767 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 4741 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
| (...skipping 1557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6325 __ Push(scope_info); | 6299 __ Push(scope_info); |
| 6326 __ push(ToRegister(instr->function())); | 6300 __ push(ToRegister(instr->function())); |
| 6327 CallRuntime(Runtime::kPushBlockContext, 2, instr); | 6301 CallRuntime(Runtime::kPushBlockContext, 2, instr); |
| 6328 RecordSafepoint(Safepoint::kNoLazyDeopt); | 6302 RecordSafepoint(Safepoint::kNoLazyDeopt); |
| 6329 } | 6303 } |
| 6330 | 6304 |
| 6331 | 6305 |
| 6332 #undef __ | 6306 #undef __ |
| 6333 } // namespace internal | 6307 } // namespace internal |
| 6334 } // namespace v8 | 6308 } // namespace v8 |
| OLD | NEW |