< prev index next >

src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

Print this page

        

*** 807,818 **** void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); ! if (x->id() == vmIntrinsics::_dexp) { ! do_ExpIntrinsic(x); return; } LIRItem value(x->argument_at(0), this); --- 807,818 ---- void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); ! if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog) { ! do_LibmIntrinsic(x); return; } LIRItem value(x->argument_at(0), this);
*** 820,830 **** if (UseSSE >= 2) { switch(x->id()) { case vmIntrinsics::_dsin: case vmIntrinsics::_dcos: case vmIntrinsics::_dtan: - case vmIntrinsics::_dlog: case vmIntrinsics::_dlog10: case vmIntrinsics::_dpow: use_fpu = true; } } else { --- 820,829 ----
*** 871,892 **** case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break; case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break; case vmIntrinsics::_dsin: __ sin (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dcos: __ cos (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; - case vmIntrinsics::_dlog: __ log (calc_input, calc_result, tmp1); break; case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break; case vmIntrinsics::_dpow: __ pow (calc_input, calc_input2, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break; default: ShouldNotReachHere(); } if (use_fpu) { __ move(calc_result, x->operand()); } } ! void LIRGenerator::do_ExpIntrinsic(Intrinsic* x) { LIRItem value(x->argument_at(0), this); value.set_destroys_register(); LIR_Opr calc_result = rlock_result(x); LIR_Opr result_reg = result_register_for(x->type()); --- 870,890 ---- case vmIntrinsics::_dabs: __ abs (calc_input, calc_result, LIR_OprFact::illegalOpr); break; case vmIntrinsics::_dsqrt: __ sqrt (calc_input, calc_result, LIR_OprFact::illegalOpr); break; case vmIntrinsics::_dsin: __ sin (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dcos: __ cos (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break; case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break; case vmIntrinsics::_dpow: __ pow (calc_input, calc_input2, calc_result, tmp1, tmp2, FrameMap::rax_opr, FrameMap::rcx_opr, FrameMap::rdx_opr); break; default: ShouldNotReachHere(); } if (use_fpu) { __ move(calc_result, x->operand()); } } ! void LIRGenerator::do_LibmIntrinsic(Intrinsic* x) { LIRItem value(x->argument_at(0), this); value.set_destroys_register(); LIR_Opr calc_result = rlock_result(x); LIR_Opr result_reg = result_register_for(x->type());
*** 898,914 **** --- 896,932 ---- value.load_item_force(cc->at(0)); #ifndef _LP64 LIR_Opr tmp = FrameMap::fpu0_double_opr; result_reg = tmp; + switch(x->id()) { + case vmIntrinsics::_dexp: if (VM_Version::supports_sse2()) { __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args()); } else { __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dexp), getThreadTemp(), result_reg, cc->args()); } + break; + case vmIntrinsics::_dlog: + if (VM_Version::supports_sse2()) { + __ call_runtime_leaf(StubRoutines::dlog(), getThreadTemp(), result_reg, cc->args()); + } + else { + __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog), getThreadTemp(), result_reg, cc->args()); + } + break; + default: ShouldNotReachHere(); + } #else + switch (x->id()) { + case vmIntrinsics::_dexp: __ call_runtime_leaf(StubRoutines::dexp(), getThreadTemp(), result_reg, cc->args()); + break; + case vmIntrinsics::_dlog: + __ call_runtime_leaf(StubRoutines::dlog(), getThreadTemp(), result_reg, cc->args()); + break; + } #endif __ move(result_reg, calc_result); } void LIRGenerator::do_ArrayCopy(Intrinsic* x) {
< prev index next >