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 2483 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2494 DeoptimizeIf(below_equal, instr->environment()); | 2494 DeoptimizeIf(below_equal, instr->environment()); |
2495 | 2495 |
2496 // There are two words between the frame pointer and the last argument. | 2496 // There are two words between the frame pointer and the last argument. |
2497 // Subtracting from length accounts for one of them add one more. | 2497 // Subtracting from length accounts for one of them add one more. |
2498 __ movq(result, Operand(arguments, length, times_pointer_size, kPointerSize)); | 2498 __ movq(result, Operand(arguments, length, times_pointer_size, kPointerSize)); |
2499 } | 2499 } |
2500 | 2500 |
2501 | 2501 |
2502 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { | 2502 void LCodeGen::DoLoadKeyedFastElement(LLoadKeyedFastElement* instr) { |
2503 Register result = ToRegister(instr->result()); | 2503 Register result = ToRegister(instr->result()); |
2504 | 2504 LOperand* key = instr->key(); |
2505 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | 2505 if (!key->IsConstantOperand()) { |
2506 // Sign extend key because it could be a 32 bit negative value | 2506 Register key_reg = ToRegister(key); |
2507 // and the dehoisted address computation happens in 64 bits. | 2507 if (instr->hydrogen()->key()->representation().IsTagged()) { |
2508 Register key_reg = ToRegister(instr->key()); | 2508 __ SmiToInteger64(key_reg, key_reg); |
2509 __ movsxlq(key_reg, key_reg); | 2509 } else if (instr->hydrogen()->IsDehoisted()) { |
| 2510 // Sign extend key because it could be a 32 bit negative value |
| 2511 // and the dehoisted address computation happens in 64 bits |
| 2512 __ movsxlq(key_reg, key_reg); |
| 2513 } |
2510 } | 2514 } |
2511 | 2515 |
2512 // Load the result. | 2516 // Load the result. |
2513 __ movq(result, | 2517 __ movq(result, |
2514 BuildFastArrayOperand(instr->elements(), | 2518 BuildFastArrayOperand(instr->elements(), |
2515 instr->key(), | 2519 key, |
2516 FAST_ELEMENTS, | 2520 FAST_ELEMENTS, |
2517 FixedArray::kHeaderSize - kHeapObjectTag, | 2521 FixedArray::kHeaderSize - kHeapObjectTag, |
2518 instr->additional_index())); | 2522 instr->additional_index())); |
2519 | 2523 |
2520 // Check for the hole value. | 2524 // Check for the hole value. |
2521 if (instr->hydrogen()->RequiresHoleCheck()) { | 2525 if (instr->hydrogen()->RequiresHoleCheck()) { |
2522 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { | 2526 if (IsFastSmiElementsKind(instr->hydrogen()->elements_kind())) { |
2523 Condition smi = __ CheckSmi(result); | 2527 Condition smi = __ CheckSmi(result); |
2524 DeoptimizeIf(NegateCondition(smi), instr->environment()); | 2528 DeoptimizeIf(NegateCondition(smi), instr->environment()); |
2525 } else { | 2529 } else { |
2526 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); | 2530 __ CompareRoot(result, Heap::kTheHoleValueRootIndex); |
2527 DeoptimizeIf(equal, instr->environment()); | 2531 DeoptimizeIf(equal, instr->environment()); |
2528 } | 2532 } |
2529 } | 2533 } |
2530 } | 2534 } |
2531 | 2535 |
2532 | 2536 |
2533 void LCodeGen::DoLoadKeyedFastDoubleElement( | 2537 void LCodeGen::DoLoadKeyedFastDoubleElement( |
2534 LLoadKeyedFastDoubleElement* instr) { | 2538 LLoadKeyedFastDoubleElement* instr) { |
2535 XMMRegister result(ToDoubleRegister(instr->result())); | 2539 XMMRegister result(ToDoubleRegister(instr->result())); |
2536 | 2540 LOperand* key = instr->key(); |
2537 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | 2541 if (!key->IsConstantOperand()) { |
2538 // Sign extend key because it could be a 32 bit negative value | 2542 Register key_reg = ToRegister(key); |
2539 // and the dehoisted address computation happens in 64 bits | 2543 if (instr->hydrogen()->key()->representation().IsTagged()) { |
2540 Register key_reg = ToRegister(instr->key()); | 2544 __ SmiToInteger64(key_reg, key_reg); |
2541 __ movsxlq(key_reg, key_reg); | 2545 } else if (instr->hydrogen()->IsDehoisted()) { |
| 2546 // Sign extend key because it could be a 32 bit negative value |
| 2547 // and the dehoisted address computation happens in 64 bits |
| 2548 __ movsxlq(key_reg, key_reg); |
| 2549 } |
2542 } | 2550 } |
2543 | 2551 |
2544 if (instr->hydrogen()->RequiresHoleCheck()) { | 2552 if (instr->hydrogen()->RequiresHoleCheck()) { |
2545 int offset = FixedDoubleArray::kHeaderSize - kHeapObjectTag + | 2553 int offset = FixedDoubleArray::kHeaderSize - kHeapObjectTag + |
2546 sizeof(kHoleNanLower32); | 2554 sizeof(kHoleNanLower32); |
2547 Operand hole_check_operand = BuildFastArrayOperand( | 2555 Operand hole_check_operand = BuildFastArrayOperand( |
2548 instr->elements(), | 2556 instr->elements(), |
2549 instr->key(), | 2557 key, |
2550 FAST_DOUBLE_ELEMENTS, | 2558 FAST_DOUBLE_ELEMENTS, |
2551 offset, | 2559 offset, |
2552 instr->additional_index()); | 2560 instr->additional_index()); |
2553 __ cmpl(hole_check_operand, Immediate(kHoleNanUpper32)); | 2561 __ cmpl(hole_check_operand, Immediate(kHoleNanUpper32)); |
2554 DeoptimizeIf(equal, instr->environment()); | 2562 DeoptimizeIf(equal, instr->environment()); |
2555 } | 2563 } |
2556 | 2564 |
2557 Operand double_load_operand = BuildFastArrayOperand( | 2565 Operand double_load_operand = BuildFastArrayOperand( |
2558 instr->elements(), | 2566 instr->elements(), |
2559 instr->key(), | 2567 key, |
2560 FAST_DOUBLE_ELEMENTS, | 2568 FAST_DOUBLE_ELEMENTS, |
2561 FixedDoubleArray::kHeaderSize - kHeapObjectTag, | 2569 FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
2562 instr->additional_index()); | 2570 instr->additional_index()); |
2563 __ movsd(result, double_load_operand); | 2571 __ movsd(result, double_load_operand); |
2564 } | 2572 } |
2565 | 2573 |
2566 | 2574 |
2567 Operand LCodeGen::BuildFastArrayOperand( | 2575 Operand LCodeGen::BuildFastArrayOperand( |
2568 LOperand* elements_pointer, | 2576 LOperand* elements_pointer, |
2569 LOperand* key, | 2577 LOperand* key, |
(...skipping 16 matching lines...) Expand all Loading... |
2586 ToRegister(key), | 2594 ToRegister(key), |
2587 scale_factor, | 2595 scale_factor, |
2588 offset + (additional_index << shift_size)); | 2596 offset + (additional_index << shift_size)); |
2589 } | 2597 } |
2590 } | 2598 } |
2591 | 2599 |
2592 | 2600 |
2593 void LCodeGen::DoLoadKeyedSpecializedArrayElement( | 2601 void LCodeGen::DoLoadKeyedSpecializedArrayElement( |
2594 LLoadKeyedSpecializedArrayElement* instr) { | 2602 LLoadKeyedSpecializedArrayElement* instr) { |
2595 ElementsKind elements_kind = instr->elements_kind(); | 2603 ElementsKind elements_kind = instr->elements_kind(); |
2596 Operand operand(BuildFastArrayOperand(instr->external_pointer(), | 2604 LOperand* key = instr->key(); |
2597 instr->key(), | 2605 if (!key->IsConstantOperand()) { |
2598 elements_kind, | 2606 Register key_reg = ToRegister(key); |
2599 0, | 2607 if (instr->hydrogen()->key()->representation().IsTagged()) { |
2600 instr->additional_index())); | 2608 __ SmiToInteger64(key_reg, key_reg); |
2601 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | 2609 } else if (instr->hydrogen()->IsDehoisted()) { |
2602 // Sign extend key because it could be a 32 bit negative value | 2610 // Sign extend key because it could be a 32 bit negative value |
2603 // and the dehoisted address computation happens in 64 bits | 2611 // and the dehoisted address computation happens in 64 bits |
2604 Register key_reg = ToRegister(instr->key()); | 2612 __ movsxlq(key_reg, key_reg); |
2605 __ movsxlq(key_reg, key_reg); | 2613 } |
2606 } | 2614 } |
| 2615 Operand operand(BuildFastArrayOperand( |
| 2616 instr->external_pointer(), |
| 2617 key, |
| 2618 elements_kind, |
| 2619 0, |
| 2620 instr->additional_index())); |
2607 | 2621 |
2608 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { | 2622 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
2609 XMMRegister result(ToDoubleRegister(instr->result())); | 2623 XMMRegister result(ToDoubleRegister(instr->result())); |
2610 __ movss(result, operand); | 2624 __ movss(result, operand); |
2611 __ cvtss2sd(result, result); | 2625 __ cvtss2sd(result, result); |
2612 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 2626 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
2613 __ movsd(ToDoubleRegister(instr->result()), operand); | 2627 __ movsd(ToDoubleRegister(instr->result()), operand); |
2614 } else { | 2628 } else { |
2615 Register result(ToRegister(instr->result())); | 2629 Register result(ToRegister(instr->result())); |
2616 switch (elements_kind) { | 2630 switch (elements_kind) { |
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3529 Handle<Code> ic = (instr->strict_mode_flag() == kStrictMode) | 3543 Handle<Code> ic = (instr->strict_mode_flag() == kStrictMode) |
3530 ? isolate()->builtins()->StoreIC_Initialize_Strict() | 3544 ? isolate()->builtins()->StoreIC_Initialize_Strict() |
3531 : isolate()->builtins()->StoreIC_Initialize(); | 3545 : isolate()->builtins()->StoreIC_Initialize(); |
3532 CallCode(ic, RelocInfo::CODE_TARGET, instr); | 3546 CallCode(ic, RelocInfo::CODE_TARGET, instr); |
3533 } | 3547 } |
3534 | 3548 |
3535 | 3549 |
3536 void LCodeGen::DoStoreKeyedSpecializedArrayElement( | 3550 void LCodeGen::DoStoreKeyedSpecializedArrayElement( |
3537 LStoreKeyedSpecializedArrayElement* instr) { | 3551 LStoreKeyedSpecializedArrayElement* instr) { |
3538 ElementsKind elements_kind = instr->elements_kind(); | 3552 ElementsKind elements_kind = instr->elements_kind(); |
3539 Operand operand(BuildFastArrayOperand(instr->external_pointer(), | 3553 LOperand* key = instr->key(); |
3540 instr->key(), | 3554 if (!key->IsConstantOperand()) { |
3541 elements_kind, | 3555 Register key_reg = ToRegister(key); |
3542 0, | 3556 if (instr->hydrogen()->key()->representation().IsTagged()) { |
3543 instr->additional_index())); | 3557 __ SmiToInteger64(key_reg, key_reg); |
3544 | 3558 } else if (instr->hydrogen()->IsDehoisted()) { |
3545 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | 3559 // Sign extend key because it could be a 32 bit negative value |
3546 // Sign extend key because it could be a 32 bit negative value | 3560 // and the dehoisted address computation happens in 64 bits |
3547 // and the dehoisted address computation happens in 64 bits | 3561 __ movsxlq(key_reg, key_reg); |
3548 Register key_reg = ToRegister(instr->key()); | 3562 } |
3549 __ movsxlq(key_reg, key_reg); | |
3550 } | 3563 } |
| 3564 Operand operand(BuildFastArrayOperand( |
| 3565 instr->external_pointer(), |
| 3566 key, |
| 3567 elements_kind, |
| 3568 0, |
| 3569 instr->additional_index())); |
3551 | 3570 |
3552 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { | 3571 if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) { |
3553 XMMRegister value(ToDoubleRegister(instr->value())); | 3572 XMMRegister value(ToDoubleRegister(instr->value())); |
3554 __ cvtsd2ss(value, value); | 3573 __ cvtsd2ss(value, value); |
3555 __ movss(operand, value); | 3574 __ movss(operand, value); |
3556 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { | 3575 } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { |
3557 __ movsd(operand, ToDoubleRegister(instr->value())); | 3576 __ movsd(operand, ToDoubleRegister(instr->value())); |
3558 } else { | 3577 } else { |
3559 Register value(ToRegister(instr->value())); | 3578 Register value(ToRegister(instr->value())); |
3560 switch (elements_kind) { | 3579 switch (elements_kind) { |
(...skipping 23 matching lines...) Expand all Loading... |
3584 UNREACHABLE(); | 3603 UNREACHABLE(); |
3585 break; | 3604 break; |
3586 } | 3605 } |
3587 } | 3606 } |
3588 } | 3607 } |
3589 | 3608 |
3590 | 3609 |
3591 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { | 3610 void LCodeGen::DoBoundsCheck(LBoundsCheck* instr) { |
3592 if (instr->length()->IsRegister()) { | 3611 if (instr->length()->IsRegister()) { |
3593 Register reg = ToRegister(instr->length()); | 3612 Register reg = ToRegister(instr->length()); |
3594 if (FLAG_debug_code) { | 3613 if (FLAG_debug_code && |
| 3614 !instr->hydrogen()->index()->representation().IsTagged()) { |
3595 __ AbortIfNotZeroExtended(reg); | 3615 __ AbortIfNotZeroExtended(reg); |
3596 } | 3616 } |
3597 if (instr->index()->IsConstantOperand()) { | 3617 if (instr->index()->IsConstantOperand()) { |
3598 __ cmpq(reg, | 3618 __ cmpq(reg, |
3599 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); | 3619 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); |
3600 } else { | 3620 } else { |
3601 Register reg2 = ToRegister(instr->index()); | 3621 Register reg2 = ToRegister(instr->index()); |
3602 if (FLAG_debug_code) { | 3622 if (FLAG_debug_code && |
| 3623 !instr->hydrogen()->index()->representation().IsTagged()) { |
3603 __ AbortIfNotZeroExtended(reg2); | 3624 __ AbortIfNotZeroExtended(reg2); |
3604 } | 3625 } |
3605 __ cmpq(reg, reg2); | 3626 __ cmpq(reg, reg2); |
3606 } | 3627 } |
3607 } else { | 3628 } else { |
3608 if (instr->index()->IsConstantOperand()) { | 3629 if (instr->index()->IsConstantOperand()) { |
3609 __ cmpq(ToOperand(instr->length()), | 3630 __ cmpq(ToOperand(instr->length()), |
3610 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); | 3631 Immediate(ToInteger32(LConstantOperand::cast(instr->index())))); |
3611 } else { | 3632 } else { |
3612 __ cmpq(ToOperand(instr->length()), ToRegister(instr->index())); | 3633 __ cmpq(ToOperand(instr->length()), ToRegister(instr->index())); |
3613 } | 3634 } |
3614 } | 3635 } |
3615 DeoptimizeIf(below_equal, instr->environment()); | 3636 DeoptimizeIf(below_equal, instr->environment()); |
3616 } | 3637 } |
3617 | 3638 |
3618 | 3639 |
3619 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { | 3640 void LCodeGen::DoStoreKeyedFastElement(LStoreKeyedFastElement* instr) { |
3620 Register value = ToRegister(instr->value()); | 3641 Register value = ToRegister(instr->value()); |
3621 Register elements = ToRegister(instr->object()); | 3642 Register elements = ToRegister(instr->object()); |
3622 Register key = instr->key()->IsRegister() ? ToRegister(instr->key()) : no_reg; | 3643 LOperand* key = instr->key(); |
| 3644 if (!key->IsConstantOperand()) { |
| 3645 Register key_reg = ToRegister(key); |
| 3646 if (instr->hydrogen()->key()->representation().IsTagged()) { |
| 3647 __ SmiToInteger64(key_reg, key_reg); |
| 3648 } else if (instr->hydrogen()->IsDehoisted()) { |
| 3649 // Sign extend key because it could be a 32 bit negative value |
| 3650 // and the dehoisted address computation happens in 64 bits |
| 3651 __ movsxlq(key_reg, key_reg); |
| 3652 } |
| 3653 } |
3623 | 3654 |
3624 Operand operand = | 3655 Operand operand = |
3625 BuildFastArrayOperand(instr->object(), | 3656 BuildFastArrayOperand(instr->object(), |
3626 instr->key(), | 3657 key, |
3627 FAST_ELEMENTS, | 3658 FAST_ELEMENTS, |
3628 FixedArray::kHeaderSize - kHeapObjectTag, | 3659 FixedArray::kHeaderSize - kHeapObjectTag, |
3629 instr->additional_index()); | 3660 instr->additional_index()); |
3630 | 3661 |
3631 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | |
3632 // Sign extend key because it could be a 32 bit negative value | |
3633 // and the dehoisted address computation happens in 64 bits | |
3634 Register key_reg = ToRegister(instr->key()); | |
3635 __ movsxlq(key_reg, key_reg); | |
3636 } | |
3637 | |
3638 __ movq(operand, value); | |
3639 | |
3640 if (instr->hydrogen()->NeedsWriteBarrier()) { | 3662 if (instr->hydrogen()->NeedsWriteBarrier()) { |
3641 ASSERT(!instr->key()->IsConstantOperand()); | 3663 ASSERT(!instr->key()->IsConstantOperand()); |
3642 HType type = instr->hydrogen()->value()->type(); | 3664 HType type = instr->hydrogen()->value()->type(); |
3643 SmiCheck check_needed = | 3665 SmiCheck check_needed = |
3644 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 3666 type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
3645 // Compute address of modified element and store it into key register. | 3667 // Compute address of modified element and store it into key register. |
3646 __ lea(key, operand); | 3668 Register key_reg(ToRegister(key)); |
| 3669 __ lea(key_reg, operand); |
| 3670 __ movq(Operand(key_reg, 0), value); |
3647 __ RecordWrite(elements, | 3671 __ RecordWrite(elements, |
3648 key, | 3672 key_reg, |
3649 value, | 3673 value, |
3650 kSaveFPRegs, | 3674 kSaveFPRegs, |
3651 EMIT_REMEMBERED_SET, | 3675 EMIT_REMEMBERED_SET, |
3652 check_needed); | 3676 check_needed); |
| 3677 } else { |
| 3678 __ movq(operand, value); |
3653 } | 3679 } |
3654 } | 3680 } |
3655 | 3681 |
3656 | 3682 |
3657 void LCodeGen::DoStoreKeyedFastDoubleElement( | 3683 void LCodeGen::DoStoreKeyedFastDoubleElement( |
3658 LStoreKeyedFastDoubleElement* instr) { | 3684 LStoreKeyedFastDoubleElement* instr) { |
3659 XMMRegister value = ToDoubleRegister(instr->value()); | 3685 XMMRegister value = ToDoubleRegister(instr->value()); |
| 3686 LOperand* key = instr->key(); |
| 3687 if (!key->IsConstantOperand()) { |
| 3688 Register key_reg = ToRegister(key); |
| 3689 if (instr->hydrogen()->key()->representation().IsTagged()) { |
| 3690 __ SmiToInteger64(key_reg, key_reg); |
| 3691 } else if (instr->hydrogen()->IsDehoisted()) { |
| 3692 // Sign extend key because it could be a 32 bit negative value |
| 3693 // and the dehoisted address computation happens in 64 bits |
| 3694 __ movsxlq(key_reg, key_reg); |
| 3695 } |
| 3696 } |
3660 | 3697 |
3661 if (instr->NeedsCanonicalization()) { | 3698 if (instr->NeedsCanonicalization()) { |
3662 Label have_value; | 3699 Label have_value; |
3663 | 3700 |
3664 __ ucomisd(value, value); | 3701 __ ucomisd(value, value); |
3665 __ j(parity_odd, &have_value); // NaN. | 3702 __ j(parity_odd, &have_value); // NaN. |
3666 | 3703 |
3667 __ Set(kScratchRegister, BitCast<uint64_t>( | 3704 __ Set(kScratchRegister, BitCast<uint64_t>( |
3668 FixedDoubleArray::canonical_not_the_hole_nan_as_double())); | 3705 FixedDoubleArray::canonical_not_the_hole_nan_as_double())); |
3669 __ movq(value, kScratchRegister); | 3706 __ movq(value, kScratchRegister); |
3670 | 3707 |
3671 __ bind(&have_value); | 3708 __ bind(&have_value); |
3672 } | 3709 } |
3673 | 3710 |
3674 Operand double_store_operand = BuildFastArrayOperand( | 3711 Operand double_store_operand = BuildFastArrayOperand( |
3675 instr->elements(), | 3712 instr->elements(), |
3676 instr->key(), | 3713 key, |
3677 FAST_DOUBLE_ELEMENTS, | 3714 FAST_DOUBLE_ELEMENTS, |
3678 FixedDoubleArray::kHeaderSize - kHeapObjectTag, | 3715 FixedDoubleArray::kHeaderSize - kHeapObjectTag, |
3679 instr->additional_index()); | 3716 instr->additional_index()); |
3680 | 3717 |
3681 if (instr->hydrogen()->IsDehoisted() && !instr->key()->IsConstantOperand()) { | |
3682 // Sign extend key because it could be a 32 bit negative value | |
3683 // and the dehoisted address computation happens in 64 bits | |
3684 Register key_reg = ToRegister(instr->key()); | |
3685 __ movsxlq(key_reg, key_reg); | |
3686 } | |
3687 | |
3688 __ movsd(double_store_operand, value); | 3718 __ movsd(double_store_operand, value); |
3689 } | 3719 } |
3690 | 3720 |
3691 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { | 3721 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { |
3692 ASSERT(ToRegister(instr->object()).is(rdx)); | 3722 ASSERT(ToRegister(instr->object()).is(rdx)); |
3693 ASSERT(ToRegister(instr->key()).is(rcx)); | 3723 ASSERT(ToRegister(instr->key()).is(rcx)); |
3694 ASSERT(ToRegister(instr->value()).is(rax)); | 3724 ASSERT(ToRegister(instr->value()).is(rax)); |
3695 | 3725 |
3696 Handle<Code> ic = (instr->strict_mode_flag() == kStrictMode) | 3726 Handle<Code> ic = (instr->strict_mode_flag() == kStrictMode) |
3697 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() | 3727 ? isolate()->builtins()->KeyedStoreIC_Initialize_Strict() |
(...skipping 1347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5045 FixedArray::kHeaderSize - kPointerSize)); | 5075 FixedArray::kHeaderSize - kPointerSize)); |
5046 __ bind(&done); | 5076 __ bind(&done); |
5047 } | 5077 } |
5048 | 5078 |
5049 | 5079 |
5050 #undef __ | 5080 #undef __ |
5051 | 5081 |
5052 } } // namespace v8::internal | 5082 } } // namespace v8::internal |
5053 | 5083 |
5054 #endif // V8_TARGET_ARCH_X64 | 5084 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |