hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
changeset 35540 e001ad24dcdb
parent 35537 bed5e2dc57a1
child 36555 4f37fd7a5a09
equal deleted inserted replaced
35539:9a687b686976 35540:e001ad24dcdb
  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