hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp
changeset 35146 9ebfec283f56
parent 35135 dd2ce9021031
child 35154 a9b3c1984a01
equal deleted inserted replaced
35145:a4ffa2fa7f4d 35146:9ebfec283f56
  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