--- a/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Mar 30 17:04:14 2016 +0200
+++ b/hotspot/src/cpu/x86/vm/c1_LIRGenerator_x86.cpp Wed Apr 06 10:29:26 2016 -0700
@@ -812,7 +812,8 @@
if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog ||
x->id() == vmIntrinsics::_dpow || x->id() == vmIntrinsics::_dcos ||
- x->id() == vmIntrinsics::_dsin) {
+ x->id() == vmIntrinsics::_dsin || x->id() == vmIntrinsics::_dtan ||
+ x->id() == vmIntrinsics::_dlog10) {
do_LibmIntrinsic(x);
return;
}
@@ -820,58 +821,17 @@
LIRItem value(x->argument_at(0), this);
bool use_fpu = false;
- if (UseSSE >= 2) {
- switch(x->id()) {
- case vmIntrinsics::_dtan:
- case vmIntrinsics::_dlog10:
- use_fpu = true;
- break;
- }
- } else {
+ if (UseSSE < 2) {
value.set_destroys_register();
}
-
value.load_item();
LIR_Opr calc_input = value.result();
- LIR_Opr calc_input2 = NULL;
- if (x->id() == vmIntrinsics::_dpow) {
- LIRItem extra_arg(x->argument_at(1), this);
- if (UseSSE < 2) {
- extra_arg.set_destroys_register();
- }
- extra_arg.load_item();
- calc_input2 = extra_arg.result();
- }
LIR_Opr calc_result = rlock_result(x);
- // sin, cos, pow and exp need two free fpu stack slots, so register
- // two temporary operands
- LIR_Opr tmp1 = FrameMap::caller_save_fpu_reg_at(0);
- LIR_Opr tmp2 = FrameMap::caller_save_fpu_reg_at(1);
-
- if (use_fpu) {
- LIR_Opr tmp = FrameMap::fpu0_double_opr;
- int tmp_start = 1;
- if (calc_input2 != NULL) {
- __ move(calc_input2, tmp);
- tmp_start = 2;
- calc_input2 = tmp;
- }
- __ move(calc_input, tmp);
-
- calc_input = tmp;
- calc_result = tmp;
-
- tmp1 = FrameMap::caller_save_fpu_reg_at(tmp_start);
- tmp2 = FrameMap::caller_save_fpu_reg_at(tmp_start + 1);
- }
-
switch(x->id()) {
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::_dtan: __ tan (calc_input, calc_result, tmp1, tmp2); break;
- case vmIntrinsics::_dlog10: __ log10(calc_input, calc_result, tmp1); break;
default: ShouldNotReachHere();
}
@@ -912,21 +872,28 @@
result_reg = tmp;
switch(x->id()) {
case vmIntrinsics::_dexp:
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dexp() != NULL) {
__ 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()) {
+ if (StubRoutines::dlog() != NULL) {
__ 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;
+ case vmIntrinsics::_dlog10:
+ if (StubRoutines::dlog10() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dlog10(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
case vmIntrinsics::_dpow:
- if (VM_Version::supports_sse2()) {
+ if (StubRoutines::dpow() != NULL) {
__ call_runtime_leaf(StubRoutines::dpow(), getThreadTemp(), result_reg, cc->args());
} else {
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dpow), getThreadTemp(), result_reg, cc->args());
@@ -946,18 +913,44 @@
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), getThreadTemp(), result_reg, cc->args());
}
break;
+ case vmIntrinsics::_dtan:
+ if (StubRoutines::dtan() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dtan(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), 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());
+ if (StubRoutines::dexp() != NULL) {
+ __ 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 (StubRoutines::dlog() != NULL) {
__ 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;
+ case vmIntrinsics::_dlog10:
+ if (StubRoutines::dlog10() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dlog10(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dlog10), getThreadTemp(), result_reg, cc->args());
+ }
break;
case vmIntrinsics::_dpow:
+ if (StubRoutines::dpow() != NULL) {
__ call_runtime_leaf(StubRoutines::dpow(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dpow), getThreadTemp(), result_reg, cc->args());
+ }
break;
case vmIntrinsics::_dsin:
if (StubRoutines::dsin() != NULL) {
@@ -973,6 +966,13 @@
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dcos), getThreadTemp(), result_reg, cc->args());
}
break;
+ case vmIntrinsics::_dtan:
+ if (StubRoutines::dtan() != NULL) {
+ __ call_runtime_leaf(StubRoutines::dtan(), getThreadTemp(), result_reg, cc->args());
+ } else {
+ __ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), getThreadTemp(), result_reg, cc->args());
+ }
+ break;
default: ShouldNotReachHere();
}
#endif // _LP64