3741 __ ret(0); |
3741 __ ret(0); |
3742 |
3742 |
3743 return start; |
3743 return start; |
3744 } |
3744 } |
3745 |
3745 |
|
3746 /** |
|
3747 * Arguments: |
|
3748 * |
|
3749 // Input: |
|
3750 // c_rarg0 - x address |
|
3751 // c_rarg1 - x length |
|
3752 // c_rarg2 - z address |
|
3753 // c_rarg3 - z lenth |
|
3754 * |
|
3755 */ |
|
3756 address generate_squareToLen() { |
|
3757 |
|
3758 __ align(CodeEntryAlignment); |
|
3759 StubCodeMark mark(this, "StubRoutines", "squareToLen"); |
|
3760 |
|
3761 address start = __ pc(); |
|
3762 // Win64: rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...) |
|
3763 // Unix: rdi, rsi, rdx, rcx (c_rarg0, c_rarg1, ...) |
|
3764 const Register x = rdi; |
|
3765 const Register len = rsi; |
|
3766 const Register z = r8; |
|
3767 const Register zlen = rcx; |
|
3768 |
|
3769 const Register tmp1 = r12; |
|
3770 const Register tmp2 = r13; |
|
3771 const Register tmp3 = r14; |
|
3772 const Register tmp4 = r15; |
|
3773 const Register tmp5 = rbx; |
|
3774 |
|
3775 BLOCK_COMMENT("Entry:"); |
|
3776 __ enter(); // required for proper stackwalking of RuntimeStub frame |
|
3777 |
|
3778 setup_arg_regs(4); // x => rdi, len => rsi, z => rdx |
|
3779 // zlen => rcx |
|
3780 // r9 and r10 may be used to save non-volatile registers |
|
3781 __ movptr(r8, rdx); |
|
3782 __ square_to_len(x, len, z, zlen, tmp1, tmp2, tmp3, tmp4, tmp5, rdx, rax); |
|
3783 |
|
3784 restore_arg_regs(); |
|
3785 |
|
3786 __ leave(); // required for proper stackwalking of RuntimeStub frame |
|
3787 __ ret(0); |
|
3788 |
|
3789 return start; |
|
3790 } |
|
3791 |
|
3792 /** |
|
3793 * Arguments: |
|
3794 * |
|
3795 * Input: |
|
3796 * c_rarg0 - out address |
|
3797 * c_rarg1 - in address |
|
3798 * c_rarg2 - offset |
|
3799 * c_rarg3 - len |
|
3800 * not Win64 |
|
3801 * c_rarg4 - k |
|
3802 * Win64 |
|
3803 * rsp+40 - k |
|
3804 */ |
|
3805 address generate_mulAdd() { |
|
3806 __ align(CodeEntryAlignment); |
|
3807 StubCodeMark mark(this, "StubRoutines", "mulAdd"); |
|
3808 |
|
3809 address start = __ pc(); |
|
3810 // Win64: rcx, rdx, r8, r9 (c_rarg0, c_rarg1, ...) |
|
3811 // Unix: rdi, rsi, rdx, rcx, r8, r9 (c_rarg0, c_rarg1, ...) |
|
3812 const Register out = rdi; |
|
3813 const Register in = rsi; |
|
3814 const Register offset = r11; |
|
3815 const Register len = rcx; |
|
3816 const Register k = r8; |
|
3817 |
|
3818 // Next registers will be saved on stack in mul_add(). |
|
3819 const Register tmp1 = r12; |
|
3820 const Register tmp2 = r13; |
|
3821 const Register tmp3 = r14; |
|
3822 const Register tmp4 = r15; |
|
3823 const Register tmp5 = rbx; |
|
3824 |
|
3825 BLOCK_COMMENT("Entry:"); |
|
3826 __ enter(); // required for proper stackwalking of RuntimeStub frame |
|
3827 |
|
3828 setup_arg_regs(4); // out => rdi, in => rsi, offset => rdx |
|
3829 // len => rcx, k => r8 |
|
3830 // r9 and r10 may be used to save non-volatile registers |
|
3831 #ifdef _WIN64 |
|
3832 // last argument is on stack on Win64 |
|
3833 __ movl(k, Address(rsp, 6 * wordSize)); |
|
3834 #endif |
|
3835 __ movptr(r11, rdx); // move offset in rdx to offset(r11) |
|
3836 __ mul_add(out, in, offset, len, k, tmp1, tmp2, tmp3, tmp4, tmp5, rdx, rax); |
|
3837 |
|
3838 restore_arg_regs(); |
|
3839 |
|
3840 __ leave(); // required for proper stackwalking of RuntimeStub frame |
|
3841 __ ret(0); |
|
3842 |
|
3843 return start; |
|
3844 } |
|
3845 |
|
3846 |
3746 #undef __ |
3847 #undef __ |
3747 #define __ masm-> |
3848 #define __ masm-> |
3748 |
3849 |
3749 // Continuation point for throwing of implicit exceptions that are |
3850 // Continuation point for throwing of implicit exceptions that are |
3750 // not handled in the current activation. Fabricates an exception |
3851 // not handled in the current activation. Fabricates an exception |