2985 __ movdbl(xmm0, Address(rsp, 0)); |
2985 __ movdbl(xmm0, Address(rsp, 0)); |
2986 __ addq(rsp, 8); |
2986 __ addq(rsp, 8); |
2987 __ ret(0); |
2987 __ ret(0); |
2988 } |
2988 } |
2989 { |
2989 { |
2990 StubCodeMark mark(this, "StubRoutines", "sin"); |
|
2991 StubRoutines::_intrinsic_sin = (double (*)(double)) __ pc(); |
|
2992 |
|
2993 __ subq(rsp, 8); |
|
2994 __ movdbl(Address(rsp, 0), xmm0); |
|
2995 __ fld_d(Address(rsp, 0)); |
|
2996 __ trigfunc('s'); |
|
2997 __ fstp_d(Address(rsp, 0)); |
|
2998 __ movdbl(xmm0, Address(rsp, 0)); |
|
2999 __ addq(rsp, 8); |
|
3000 __ ret(0); |
|
3001 } |
|
3002 { |
|
3003 StubCodeMark mark(this, "StubRoutines", "cos"); |
|
3004 StubRoutines::_intrinsic_cos = (double (*)(double)) __ pc(); |
|
3005 |
|
3006 __ subq(rsp, 8); |
|
3007 __ movdbl(Address(rsp, 0), xmm0); |
|
3008 __ fld_d(Address(rsp, 0)); |
|
3009 __ trigfunc('c'); |
|
3010 __ fstp_d(Address(rsp, 0)); |
|
3011 __ movdbl(xmm0, Address(rsp, 0)); |
|
3012 __ addq(rsp, 8); |
|
3013 __ ret(0); |
|
3014 } |
|
3015 { |
|
3016 StubCodeMark mark(this, "StubRoutines", "tan"); |
2990 StubCodeMark mark(this, "StubRoutines", "tan"); |
3017 StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc(); |
2991 StubRoutines::_intrinsic_tan = (double (*)(double)) __ pc(); |
3018 |
2992 |
3019 __ subq(rsp, 8); |
2993 __ subq(rsp, 8); |
3020 __ movdbl(Address(rsp, 0), xmm0); |
2994 __ movdbl(Address(rsp, 0), xmm0); |
4652 |
4626 |
4653 return start; |
4627 return start; |
4654 |
4628 |
4655 } |
4629 } |
4656 |
4630 |
|
4631 address generate_libmSin() { |
|
4632 address start = __ pc(); |
|
4633 |
|
4634 const XMMRegister x0 = xmm0; |
|
4635 const XMMRegister x1 = xmm1; |
|
4636 const XMMRegister x2 = xmm2; |
|
4637 const XMMRegister x3 = xmm3; |
|
4638 |
|
4639 const XMMRegister x4 = xmm4; |
|
4640 const XMMRegister x5 = xmm5; |
|
4641 const XMMRegister x6 = xmm6; |
|
4642 const XMMRegister x7 = xmm7; |
|
4643 |
|
4644 const Register tmp1 = r8; |
|
4645 const Register tmp2 = r9; |
|
4646 const Register tmp3 = r10; |
|
4647 const Register tmp4 = r11; |
|
4648 |
|
4649 BLOCK_COMMENT("Entry:"); |
|
4650 __ enter(); // required for proper stackwalking of RuntimeStub frame |
|
4651 |
|
4652 #ifdef _WIN64 |
|
4653 // save the xmm registers which must be preserved 6-7 |
|
4654 __ subptr(rsp, 4 * wordSize); |
|
4655 __ movdqu(Address(rsp, 0), xmm6); |
|
4656 __ movdqu(Address(rsp, 2 * wordSize), xmm7); |
|
4657 #endif |
|
4658 __ fast_sin(x0, x1, x2, x3, x4, x5, x6, x7, rax, rbx, rcx, rdx, tmp1, tmp2, tmp3, tmp4); |
|
4659 |
|
4660 #ifdef _WIN64 |
|
4661 // restore xmm regs belonging to calling function |
|
4662 __ movdqu(xmm6, Address(rsp, 0)); |
|
4663 __ movdqu(xmm7, Address(rsp, 2 * wordSize)); |
|
4664 __ addptr(rsp, 4 * wordSize); |
|
4665 #endif |
|
4666 |
|
4667 __ leave(); // required for proper stackwalking of RuntimeStub frame |
|
4668 __ ret(0); |
|
4669 |
|
4670 return start; |
|
4671 |
|
4672 } |
|
4673 |
|
4674 address generate_libmCos() { |
|
4675 address start = __ pc(); |
|
4676 |
|
4677 const XMMRegister x0 = xmm0; |
|
4678 const XMMRegister x1 = xmm1; |
|
4679 const XMMRegister x2 = xmm2; |
|
4680 const XMMRegister x3 = xmm3; |
|
4681 |
|
4682 const XMMRegister x4 = xmm4; |
|
4683 const XMMRegister x5 = xmm5; |
|
4684 const XMMRegister x6 = xmm6; |
|
4685 const XMMRegister x7 = xmm7; |
|
4686 |
|
4687 const Register tmp1 = r8; |
|
4688 const Register tmp2 = r9; |
|
4689 const Register tmp3 = r10; |
|
4690 const Register tmp4 = r11; |
|
4691 |
|
4692 BLOCK_COMMENT("Entry:"); |
|
4693 __ enter(); // required for proper stackwalking of RuntimeStub frame |
|
4694 |
|
4695 #ifdef _WIN64 |
|
4696 // save the xmm registers which must be preserved 6-7 |
|
4697 __ subptr(rsp, 4 * wordSize); |
|
4698 __ movdqu(Address(rsp, 0), xmm6); |
|
4699 __ movdqu(Address(rsp, 2 * wordSize), xmm7); |
|
4700 #endif |
|
4701 __ fast_cos(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4); |
|
4702 |
|
4703 #ifdef _WIN64 |
|
4704 // restore xmm regs belonging to calling function |
|
4705 __ movdqu(xmm6, Address(rsp, 0)); |
|
4706 __ movdqu(xmm7, Address(rsp, 2 * wordSize)); |
|
4707 __ addptr(rsp, 4 * wordSize); |
|
4708 #endif |
|
4709 |
|
4710 __ leave(); // required for proper stackwalking of RuntimeStub frame |
|
4711 __ ret(0); |
|
4712 |
|
4713 return start; |
|
4714 |
|
4715 } |
|
4716 |
4657 #undef __ |
4717 #undef __ |
4658 #define __ masm-> |
4718 #define __ masm-> |
4659 |
4719 |
4660 // Continuation point for throwing of implicit exceptions that are |
4720 // Continuation point for throwing of implicit exceptions that are |
4661 // not handled in the current activation. Fabricates an exception |
4721 // not handled in the current activation. Fabricates an exception |
4847 } |
4907 } |
4848 if (VM_Version::supports_sse2()) { |
4908 if (VM_Version::supports_sse2()) { |
4849 StubRoutines::_dexp = generate_libmExp(); |
4909 StubRoutines::_dexp = generate_libmExp(); |
4850 StubRoutines::_dlog = generate_libmLog(); |
4910 StubRoutines::_dlog = generate_libmLog(); |
4851 StubRoutines::_dpow = generate_libmPow(); |
4911 StubRoutines::_dpow = generate_libmPow(); |
|
4912 if (UseLibmSinIntrinsic) { |
|
4913 StubRoutines::_dsin = generate_libmSin(); |
|
4914 } |
|
4915 if (UseLibmCosIntrinsic) { |
|
4916 StubRoutines::_dcos = generate_libmCos(); |
|
4917 } |
4852 } |
4918 } |
4853 } |
4919 } |
4854 |
4920 |
4855 void generate_all() { |
4921 void generate_all() { |
4856 // Generates all stubs and initializes the entry points |
4922 // Generates all stubs and initializes the entry points |