src/cpu/x86/vm/stubGenerator_x86_64.cpp

changeset 8307
daaf806995b3
parent 7816
5f8824f56f39
child 8318
ea7ac121a5d3
equal deleted inserted replaced
8306:81adfb064a4f 8307:daaf806995b3
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
3985 &StubRoutines::_safefetchN_continuation_pc); 4086 &StubRoutines::_safefetchN_continuation_pc);
3986 #ifdef COMPILER2 4087 #ifdef COMPILER2
3987 if (UseMultiplyToLenIntrinsic) { 4088 if (UseMultiplyToLenIntrinsic) {
3988 StubRoutines::_multiplyToLen = generate_multiplyToLen(); 4089 StubRoutines::_multiplyToLen = generate_multiplyToLen();
3989 } 4090 }
4091 if (UseSquareToLenIntrinsic) {
4092 StubRoutines::_squareToLen = generate_squareToLen();
4093 }
4094 if (UseMulAddIntrinsic) {
4095 StubRoutines::_mulAdd = generate_mulAdd();
4096 }
3990 #endif 4097 #endif
3991 } 4098 }
3992 4099
3993 public: 4100 public:
3994 StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) { 4101 StubGenerator(CodeBuffer* code, bool all) : StubCodeGenerator(code) {

mercurial