hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp
changeset 33089 f4e956ed8b43
parent 24933 c16c7a4ac386
child 33465 6063f28a6efb
child 33589 7cbd1b2c139b
equal deleted inserted replaced
33088:34fe49ecee13 33089:f4e956ed8b43
   806 }
   806 }
   807 
   807 
   808 
   808 
   809 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
   809 void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
   810   assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type");
   810   assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type");
       
   811 
       
   812   if (x->id() == vmIntrinsics::_dexp) {
       
   813     do_ExpIntrinsic(x);
       
   814     return;
       
   815   }
       
   816 
   811   LIRItem value(x->argument_at(0), this);
   817   LIRItem value(x->argument_at(0), this);
   812 
   818 
   813   bool use_fpu = false;
   819   bool use_fpu = false;
   814   if (UseSSE >= 2) {
   820   if (UseSSE >= 2) {
   815     switch(x->id()) {
   821     switch(x->id()) {
   816       case vmIntrinsics::_dsin:
   822       case vmIntrinsics::_dsin:
   817       case vmIntrinsics::_dcos:
   823       case vmIntrinsics::_dcos:
   818       case vmIntrinsics::_dtan:
   824       case vmIntrinsics::_dtan:
   819       case vmIntrinsics::_dlog:
   825       case vmIntrinsics::_dlog:
   820       case vmIntrinsics::_dlog10:
   826       case vmIntrinsics::_dlog10:
   821       case vmIntrinsics::_dexp:
       
   822       case vmIntrinsics::_dpow:
   827       case vmIntrinsics::_dpow:
   823         use_fpu = true;
   828         use_fpu = true;
   824     }
   829     }
   825   } else {
   830   } else {
   826     value.set_destroys_register();
   831     value.set_destroys_register();
   868     case vmIntrinsics::_dsin:   __ sin  (calc_input, calc_result, tmp1, tmp2);              break;
   873     case vmIntrinsics::_dsin:   __ sin  (calc_input, calc_result, tmp1, tmp2);              break;
   869     case vmIntrinsics::_dcos:   __ cos  (calc_input, calc_result, tmp1, tmp2);              break;
   874     case vmIntrinsics::_dcos:   __ cos  (calc_input, calc_result, tmp1, tmp2);              break;
   870     case vmIntrinsics::_dtan:   __ tan  (calc_input, calc_result, tmp1, tmp2);              break;
   875     case vmIntrinsics::_dtan:   __ tan  (calc_input, calc_result, tmp1, tmp2);              break;
   871     case vmIntrinsics::_dlog:   __ log  (calc_input, calc_result, tmp1);                    break;
   876     case vmIntrinsics::_dlog:   __ log  (calc_input, calc_result, tmp1);                    break;
   872     case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1);                    break;
   877     case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1);                    break;
   873     case vmIntrinsics::_dexp:   __ exp  (calc_input, calc_result,              tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break;
       
   874     case vmIntrinsics::_dpow:   __ pow  (calc_input, calc_input2, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break;
   878     case vmIntrinsics::_dpow:   __ pow  (calc_input, calc_input2, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break;
   875     default:                    ShouldNotReachHere();
   879     default:                    ShouldNotReachHere();
   876   }
   880   }
   877 
   881 
   878   if (use_fpu) {
   882   if (use_fpu) {
   879     __ move(calc_result, x->operand());
   883     __ move(calc_result, x->operand());
   880   }
   884   }
   881 }
   885 }
   882 
   886 
       
   887 void LIRGenerator::do_ExpIntrinsic(Intrinsic* x) {
       
   888   LIRItem value(x->argument_at(0), this);
       
   889   value.set_destroys_register();
       
   890 
       
   891   LIR_Opr calc_result = rlock_result(x);
       
   892   LIR_Opr result_reg = result_register_for(x->type());
       
   893 
       
   894   BasicTypeList signature(1);
       
   895   signature.append(T_DOUBLE);
       
   896   CallingConvention* cc = frame_map()->c_calling_convention(&signature);
       
   897 
       
   898   value.load_item_force(cc->at(0));
       
   899 
       
   900 #ifndef _LP64
       
   901   LIR_Opr tmp = FrameMap::fpu0_double_opr;
       
   902   result_reg = tmp;
       
   903   if (VM_Version::supports_sse2()) {
       
   904     __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args());
       
   905   } else {
       
   906     __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dexp), getThreadTemp(), result_reg, cc->args());
       
   907   }
       
   908 #else
       
   909   __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args());
       
   910 #endif
       
   911   __ move(result_reg, calc_result);
       
   912 }
   883 
   913 
   884 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
   914 void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
   885   assert(x->number_of_arguments() == 5, "wrong type");
   915   assert(x->number_of_arguments() == 5, "wrong type");
   886 
   916 
   887   // Make all state_for calls early since they can emit code
   917   // Make all state_for calls early since they can emit code