OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 3446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3457 // Need to perform int-to-float conversion. | 3457 // Need to perform int-to-float conversion. |
3458 __ cvtlsi2ss(xmm0, rdx); | 3458 __ cvtlsi2ss(xmm0, rdx); |
3459 __ movss(Operand(rbx, rdi, times_4, 0), xmm0); | 3459 __ movss(Operand(rbx, rdi, times_4, 0), xmm0); |
3460 break; | 3460 break; |
3461 case EXTERNAL_DOUBLE_ELEMENTS: | 3461 case EXTERNAL_DOUBLE_ELEMENTS: |
3462 // Need to perform int-to-float conversion. | 3462 // Need to perform int-to-float conversion. |
3463 __ cvtlsi2sd(xmm0, rdx); | 3463 __ cvtlsi2sd(xmm0, rdx); |
3464 __ movsd(Operand(rbx, rdi, times_8, 0), xmm0); | 3464 __ movsd(Operand(rbx, rdi, times_8, 0), xmm0); |
3465 break; | 3465 break; |
3466 case FAST_ELEMENTS: | 3466 case FAST_ELEMENTS: |
| 3467 case FAST_SMI_ONLY_ELEMENTS: |
3467 case FAST_DOUBLE_ELEMENTS: | 3468 case FAST_DOUBLE_ELEMENTS: |
3468 case DICTIONARY_ELEMENTS: | 3469 case DICTIONARY_ELEMENTS: |
3469 case NON_STRICT_ARGUMENTS_ELEMENTS: | 3470 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3470 UNREACHABLE(); | 3471 UNREACHABLE(); |
3471 break; | 3472 break; |
3472 } | 3473 } |
3473 __ ret(0); | 3474 __ ret(0); |
3474 | 3475 |
3475 // TODO(danno): handle heap number -> pixel array conversion | 3476 // TODO(danno): handle heap number -> pixel array conversion |
3476 if (elements_kind != EXTERNAL_PIXEL_ELEMENTS) { | 3477 if (elements_kind != EXTERNAL_PIXEL_ELEMENTS) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3524 case EXTERNAL_UNSIGNED_INT_ELEMENTS: | 3525 case EXTERNAL_UNSIGNED_INT_ELEMENTS: |
3525 // Convert to int64, so that NaN and infinities become | 3526 // Convert to int64, so that NaN and infinities become |
3526 // 0x8000000000000000, which is zero mod 2^32. | 3527 // 0x8000000000000000, which is zero mod 2^32. |
3527 __ cvttsd2siq(rdx, xmm0); | 3528 __ cvttsd2siq(rdx, xmm0); |
3528 __ movl(Operand(rbx, rdi, times_4, 0), rdx); | 3529 __ movl(Operand(rbx, rdi, times_4, 0), rdx); |
3529 break; | 3530 break; |
3530 case EXTERNAL_PIXEL_ELEMENTS: | 3531 case EXTERNAL_PIXEL_ELEMENTS: |
3531 case EXTERNAL_FLOAT_ELEMENTS: | 3532 case EXTERNAL_FLOAT_ELEMENTS: |
3532 case EXTERNAL_DOUBLE_ELEMENTS: | 3533 case EXTERNAL_DOUBLE_ELEMENTS: |
3533 case FAST_ELEMENTS: | 3534 case FAST_ELEMENTS: |
| 3535 case FAST_SMI_ONLY_ELEMENTS: |
3534 case FAST_DOUBLE_ELEMENTS: | 3536 case FAST_DOUBLE_ELEMENTS: |
3535 case DICTIONARY_ELEMENTS: | 3537 case DICTIONARY_ELEMENTS: |
3536 case NON_STRICT_ARGUMENTS_ELEMENTS: | 3538 case NON_STRICT_ARGUMENTS_ELEMENTS: |
3537 UNREACHABLE(); | 3539 UNREACHABLE(); |
3538 break; | 3540 break; |
3539 } | 3541 } |
3540 __ ret(0); | 3542 __ ret(0); |
3541 } | 3543 } |
3542 } | 3544 } |
3543 | 3545 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3655 masm->isolate()->builtins()->KeyedLoadIC_Slow(); | 3657 masm->isolate()->builtins()->KeyedLoadIC_Slow(); |
3656 __ jmp(slow_ic, RelocInfo::CODE_TARGET); | 3658 __ jmp(slow_ic, RelocInfo::CODE_TARGET); |
3657 | 3659 |
3658 __ bind(&miss_force_generic); | 3660 __ bind(&miss_force_generic); |
3659 Handle<Code> miss_ic = | 3661 Handle<Code> miss_ic = |
3660 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); | 3662 masm->isolate()->builtins()->KeyedLoadIC_MissForceGeneric(); |
3661 __ jmp(miss_ic, RelocInfo::CODE_TARGET); | 3663 __ jmp(miss_ic, RelocInfo::CODE_TARGET); |
3662 } | 3664 } |
3663 | 3665 |
3664 | 3666 |
3665 void KeyedStoreStubCompiler::GenerateStoreFastElement(MacroAssembler* masm, | 3667 void KeyedStoreStubCompiler::GenerateStoreFastElement( |
3666 bool is_js_array) { | 3668 MacroAssembler* masm, |
| 3669 bool is_js_array, |
| 3670 ElementsKind elements_kind) { |
3667 // ----------- S t a t e ------------- | 3671 // ----------- S t a t e ------------- |
3668 // -- rax : value | 3672 // -- rax : value |
3669 // -- rcx : key | 3673 // -- rcx : key |
3670 // -- rdx : receiver | 3674 // -- rdx : receiver |
3671 // -- rsp[0] : return address | 3675 // -- rsp[0] : return address |
3672 // ----------------------------------- | 3676 // ----------------------------------- |
3673 Label miss_force_generic; | 3677 Label miss_force_generic; |
3674 | 3678 |
3675 // This stub is meant to be tail-jumped to, the receiver must already | 3679 // This stub is meant to be tail-jumped to, the receiver must already |
3676 // have been verified by the caller to not be a smi. | 3680 // have been verified by the caller to not be a smi. |
(...skipping 16 matching lines...) Expand all Loading... |
3693 __ j(above_equal, &miss_force_generic); | 3697 __ j(above_equal, &miss_force_generic); |
3694 } | 3698 } |
3695 | 3699 |
3696 // Do the store and update the write barrier. | 3700 // Do the store and update the write barrier. |
3697 __ SmiToInteger32(rcx, rcx); | 3701 __ SmiToInteger32(rcx, rcx); |
3698 __ lea(rcx, | 3702 __ lea(rcx, |
3699 FieldOperand(rdi, rcx, times_pointer_size, FixedArray::kHeaderSize)); | 3703 FieldOperand(rdi, rcx, times_pointer_size, FixedArray::kHeaderSize)); |
3700 __ movq(Operand(rcx, 0), rax); | 3704 __ movq(Operand(rcx, 0), rax); |
3701 // Make sure to preserve the value in register rax. | 3705 // Make sure to preserve the value in register rax. |
3702 __ movq(rdx, rax); | 3706 __ movq(rdx, rax); |
| 3707 ASSERT(elements_kind == FAST_ELEMENTS); |
3703 __ RecordWrite(rdi, rcx, rdx, kDontSaveFPRegs); | 3708 __ RecordWrite(rdi, rcx, rdx, kDontSaveFPRegs); |
3704 | 3709 |
3705 // Done. | 3710 // Done. |
3706 __ ret(0); | 3711 __ ret(0); |
3707 | 3712 |
3708 // Handle store cache miss. | 3713 // Handle store cache miss. |
3709 __ bind(&miss_force_generic); | 3714 __ bind(&miss_force_generic); |
3710 Handle<Code> ic_force_generic = | 3715 Handle<Code> ic_force_generic = |
3711 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 3716 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
3712 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); | 3717 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3796 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); | 3801 masm->isolate()->builtins()->KeyedStoreIC_MissForceGeneric(); |
3797 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); | 3802 __ jmp(ic_force_generic, RelocInfo::CODE_TARGET); |
3798 } | 3803 } |
3799 | 3804 |
3800 | 3805 |
3801 #undef __ | 3806 #undef __ |
3802 | 3807 |
3803 } } // namespace v8::internal | 3808 } } // namespace v8::internal |
3804 | 3809 |
3805 #endif // V8_TARGET_ARCH_X64 | 3810 #endif // V8_TARGET_ARCH_X64 |
OLD | NEW |