Skip to content

Commit 05f8a6f

Browse files
Mohamed IssaSandhya Viswanathan
authored andcommitted
8360559: Optimize Math.sinh for x86 64 bit platforms
Reviewed-by: sviswanathan, sparasa
1 parent b5f450a commit 05f8a6f

26 files changed

+742
-3
lines changed

src/hotspot/cpu/arm/templateInterpreterGenerator_arm.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,7 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
174174
break;
175175
case Interpreter::java_lang_math_fmaD:
176176
case Interpreter::java_lang_math_fmaF:
177+
case Interpreter::java_lang_math_sinh:
177178
case Interpreter::java_lang_math_tanh:
178179
case Interpreter::java_lang_math_cbrt:
179180
// TODO: Implement intrinsic

src/hotspot/cpu/ppc/templateInterpreterGenerator_ppc.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1089,6 +1089,7 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
10891089
case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
10901090
case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
10911091
case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
1092+
case Interpreter::java_lang_math_sinh : /* run interpreted */ break;
10921093
case Interpreter::java_lang_math_tanh : /* run interpreted */ break;
10931094
case Interpreter::java_lang_math_cbrt : /* run interpreted */ break;
10941095
case Interpreter::java_lang_math_abs : /* run interpreted */ break;

src/hotspot/cpu/s390/templateInterpreterGenerator_s390.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1239,6 +1239,7 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
12391239
case Interpreter::java_lang_math_sin : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dsin); break;
12401240
case Interpreter::java_lang_math_cos : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dcos); break;
12411241
case Interpreter::java_lang_math_tan : runtime_entry = CAST_FROM_FN_PTR(address, SharedRuntime::dtan); break;
1242+
case Interpreter::java_lang_math_sinh : /* run interpreted */ break;
12421243
case Interpreter::java_lang_math_tanh : /* run interpreted */ break;
12431244
case Interpreter::java_lang_math_cbrt : /* run interpreted */ break;
12441245
case Interpreter::java_lang_math_abs : /* run interpreted */ break;

src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,8 @@ void LIRGenerator::do_MathIntrinsic(Intrinsic* x) {
720720
if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog ||
721721
x->id() == vmIntrinsics::_dpow || x->id() == vmIntrinsics::_dcos ||
722722
x->id() == vmIntrinsics::_dsin || x->id() == vmIntrinsics::_dtan ||
723-
x->id() == vmIntrinsics::_dlog10 || x->id() == vmIntrinsics::_dtanh ||
724-
x->id() == vmIntrinsics::_dcbrt
723+
x->id() == vmIntrinsics::_dlog10 || x->id() == vmIntrinsics::_dsinh ||
724+
x->id() == vmIntrinsics::_dtanh || x->id() == vmIntrinsics::_dcbrt
725725
) {
726726
do_LibmIntrinsic(x);
727727
return;
@@ -835,6 +835,12 @@ void LIRGenerator::do_LibmIntrinsic(Intrinsic* x) {
835835
__ call_runtime_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::dtan), getThreadTemp(), result_reg, cc->args());
836836
}
837837
break;
838+
case vmIntrinsics::_dsinh:
839+
assert(StubRoutines::dsinh() != nullptr, "sinh intrinsic not found");
840+
if (StubRoutines::dsinh() != nullptr) {
841+
__ call_runtime_leaf(StubRoutines::dsinh(), getThreadTemp(), result_reg, cc->args());
842+
}
843+
break;
838844
case vmIntrinsics::_dtanh:
839845
assert(StubRoutines::dtanh() != nullptr, "tanh intrinsic not found");
840846
if (StubRoutines::dtanh() != nullptr) {

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3689,6 +3689,9 @@ void StubGenerator::generate_libm_stubs() {
36893689
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtan)) {
36903690
StubRoutines::_dtan = generate_libmTan(); // from stubGenerator_x86_64_tan.cpp
36913691
}
3692+
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dsinh)) {
3693+
StubRoutines::_dsinh = generate_libmSinh(); // from stubGenerator_x86_64_sinh.cpp
3694+
}
36923695
if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtanh)) {
36933696
StubRoutines::_dtanh = generate_libmTanh(); // from stubGenerator_x86_64_tanh.cpp
36943697
}

src/hotspot/cpu/x86/stubGenerator_x86_64.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,7 @@ class StubGenerator: public StubCodeGenerator {
555555
address generate_libmSin();
556556
address generate_libmCos();
557557
address generate_libmTan();
558+
address generate_libmSinh();
558559
address generate_libmTanh();
559560
address generate_libmCbrt();
560561
address generate_libmExp();

src/hotspot/cpu/x86/stubGenerator_x86_64_sinh.cpp

Lines changed: 525 additions & 0 deletions
Large diffs are not rendered by default.

src/hotspot/cpu/x86/templateInterpreterGenerator_x86_64.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,13 @@ address TemplateInterpreterGenerator::generate_math_entry(AbstractInterpreter::M
464464
} else {
465465
__ call_VM_leaf0(CAST_FROM_FN_PTR(address, SharedRuntime::dtan));
466466
}
467+
} else if (kind == Interpreter::java_lang_math_sinh) {
468+
if (StubRoutines::dsinh() != nullptr) {
469+
__ movdbl(xmm0, Address(rsp, wordSize));
470+
__ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::dsinh())));
471+
} else {
472+
return nullptr; // Fallback to default implementation
473+
}
467474
} else if (kind == Interpreter::java_lang_math_tanh) {
468475
if (StubRoutines::dtanh() != nullptr) {
469476
__ movdbl(xmm0, Address(rsp, wordSize));

src/hotspot/share/c1/c1_Compiler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,7 @@ bool Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
166166
case vmIntrinsics::_dcos:
167167
case vmIntrinsics::_dtan:
168168
#if defined(AMD64)
169+
case vmIntrinsics::_dsinh:
169170
case vmIntrinsics::_dtanh:
170171
case vmIntrinsics::_dcbrt:
171172
#endif

src/hotspot/share/c1/c1_GraphBuilder.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3296,6 +3296,7 @@ GraphBuilder::GraphBuilder(Compilation* compilation, IRScope* scope)
32963296
case vmIntrinsics::_dsin : // fall through
32973297
case vmIntrinsics::_dcos : // fall through
32983298
case vmIntrinsics::_dtan : // fall through
3299+
case vmIntrinsics::_dsinh : // fall through
32993300
case vmIntrinsics::_dtanh : // fall through
33003301
case vmIntrinsics::_dcbrt : // fall through
33013302
case vmIntrinsics::_dlog : // fall through

0 commit comments

Comments
 (0)