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 |