3023 __ fstp_d(Address(rsp, 0)); |
3023 __ fstp_d(Address(rsp, 0)); |
3024 __ movdbl(xmm0, Address(rsp, 0)); |
3024 __ movdbl(xmm0, Address(rsp, 0)); |
3025 __ addq(rsp, 8); |
3025 __ addq(rsp, 8); |
3026 __ ret(0); |
3026 __ ret(0); |
3027 } |
3027 } |
3028 { |
|
3029 StubCodeMark mark(this, "StubRoutines", "pow"); |
|
3030 StubRoutines::_intrinsic_pow = (double (*)(double,double)) __ pc(); |
|
3031 |
|
3032 __ subq(rsp, 8); |
|
3033 __ movdbl(Address(rsp, 0), xmm1); |
|
3034 __ fld_d(Address(rsp, 0)); |
|
3035 __ movdbl(Address(rsp, 0), xmm0); |
|
3036 __ fld_d(Address(rsp, 0)); |
|
3037 __ pow_with_fallback(0); |
|
3038 __ fstp_d(Address(rsp, 0)); |
|
3039 __ movdbl(xmm0, Address(rsp, 0)); |
|
3040 __ addq(rsp, 8); |
|
3041 __ ret(0); |
|
3042 } |
|
3043 } |
3028 } |
3044 |
3029 |
3045 // AES intrinsic stubs |
3030 // AES intrinsic stubs |
3046 enum {AESBlockSize = 16}; |
3031 enum {AESBlockSize = 16}; |
3047 |
3032 |
4281 |
4266 |
4282 return start; |
4267 return start; |
4283 |
4268 |
4284 } |
4269 } |
4285 |
4270 |
|
4271 address generate_libmPow() { |
|
4272 address start = __ pc(); |
|
4273 |
|
4274 const XMMRegister x0 = xmm0; |
|
4275 const XMMRegister x1 = xmm1; |
|
4276 const XMMRegister x2 = xmm2; |
|
4277 const XMMRegister x3 = xmm3; |
|
4278 |
|
4279 const XMMRegister x4 = xmm4; |
|
4280 const XMMRegister x5 = xmm5; |
|
4281 const XMMRegister x6 = xmm6; |
|
4282 const XMMRegister x7 = xmm7; |
|
4283 |
|
4284 const Register tmp1 = r8; |
|
4285 const Register tmp2 = r9; |
|
4286 const Register tmp3 = r10; |
|
4287 const Register tmp4 = r11; |
|
4288 |
|
4289 BLOCK_COMMENT("Entry:"); |
|
4290 __ enter(); // required for proper stackwalking of RuntimeStub frame |
|
4291 |
|
4292 #ifdef _WIN64 |
|
4293 // save the xmm registers which must be preserved 6-7 |
|
4294 __ subptr(rsp, 4 * wordSize); |
|
4295 __ movdqu(Address(rsp, 0), xmm6); |
|
4296 __ movdqu(Address(rsp, 2 * wordSize), xmm7); |
|
4297 #endif |
|
4298 __ fast_pow(x0, x1, x2, x3, x4, x5, x6, x7, rax, rcx, rdx, tmp1, tmp2, tmp3, tmp4); |
|
4299 |
|
4300 #ifdef _WIN64 |
|
4301 // restore xmm regs belonging to calling function |
|
4302 __ movdqu(xmm6, Address(rsp, 0)); |
|
4303 __ movdqu(xmm7, Address(rsp, 2 * wordSize)); |
|
4304 __ addptr(rsp, 4 * wordSize); |
|
4305 #endif |
|
4306 |
|
4307 __ leave(); // required for proper stackwalking of RuntimeStub frame |
|
4308 __ ret(0); |
|
4309 |
|
4310 return start; |
|
4311 |
|
4312 } |
4286 |
4313 |
4287 #undef __ |
4314 #undef __ |
4288 #define __ masm-> |
4315 #define __ masm-> |
4289 |
4316 |
4290 // Continuation point for throwing of implicit exceptions that are |
4317 // Continuation point for throwing of implicit exceptions that are |
4476 StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C(supports_clmul); |
4503 StubRoutines::_updateBytesCRC32C = generate_updateBytesCRC32C(supports_clmul); |
4477 } |
4504 } |
4478 if (VM_Version::supports_sse2()) { |
4505 if (VM_Version::supports_sse2()) { |
4479 StubRoutines::_dexp = generate_libmExp(); |
4506 StubRoutines::_dexp = generate_libmExp(); |
4480 StubRoutines::_dlog = generate_libmLog(); |
4507 StubRoutines::_dlog = generate_libmLog(); |
|
4508 StubRoutines::_dpow = generate_libmPow(); |
4481 } |
4509 } |
4482 } |
4510 } |
4483 |
4511 |
4484 void generate_all() { |
4512 void generate_all() { |
4485 // Generates all stubs and initializes the entry points |
4513 // Generates all stubs and initializes the entry points |