< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
rev 52233 : 8212043: Add floating-point Math.min/max intrinsics
Summary: Floating-point Math.min() and Math.max() intrinsics are enabled on AArch64 platform
Reviewed-by: duke
@@ -322,10 +322,11 @@
bool inline_mulAdd();
bool inline_montgomeryMultiply();
bool inline_montgomerySquare();
bool inline_vectorizedMismatch();
bool inline_fma(vmIntrinsics::ID id);
+ bool inline_fp_min_max(vmIntrinsics::ID id);
bool inline_profileBoolean();
bool inline_isCompileConstant();
void clear_upper_avx() {
#ifdef X86
@@ -865,10 +866,16 @@
case vmIntrinsics::_fmaD:
case vmIntrinsics::_fmaF:
return inline_fma(intrinsic_id());
+ case vmIntrinsics::_maxF:
+ case vmIntrinsics::_minF:
+ case vmIntrinsics::_maxD:
+ case vmIntrinsics::_minD:
+ return inline_fp_min_max(intrinsic_id());
+
default:
// If you get here, it may be that someone has added a new intrinsic
// to the list in vmSymbols.hpp without implementing it here.
#ifndef PRODUCT
if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) {
@@ -6553,10 +6560,46 @@
}
set_result(result);
return true;
}
+//------------------------------inline_fp_min_max------------------------------
+bool LibraryCallKit::inline_fp_min_max(vmIntrinsics::ID id) {
+ Node *a = NULL;
+ Node *b = NULL;
+ Node *n = NULL;
+ switch (id) {
+ case vmIntrinsics::_maxF:
+ case vmIntrinsics::_minF:
+ assert(callee()->signature()->size() == 2, "minF/maxF has 2 parameters of size 1 each.");
+ a = argument(0);
+ b = argument(1);
+ break;
+ case vmIntrinsics::_maxD:
+ case vmIntrinsics::_minD:
+ assert(callee()->signature()->size() == 4, "minD/maxD has 2 parameters of size 2 each.");
+ a = round_double_node(argument(0));
+ b = round_double_node(argument(2));
+ break;
+ default:
+ fatal_unexpected_iid(id);
+ break;
+ }
+ if (a->is_Con() || b->is_Con()) {
+ return false;
+ }
+ switch (id) {
+ case vmIntrinsics::_maxF: n = new MaxFNode(a, b); break;
+ case vmIntrinsics::_minF: n = new MinFNode(a, b); break;
+ case vmIntrinsics::_maxD: n = new MaxDNode(a, b); break;
+ case vmIntrinsics::_minD: n = new MinDNode(a, b); break;
+ default: fatal_unexpected_iid(id); break;
+ }
+ set_result(_gvn.transform(n));
+ return true;
+}
+
bool LibraryCallKit::inline_profileBoolean() {
Node* counts = argument(1);
const TypeAryPtr* ary = NULL;
ciArray* aobj = NULL;
if (counts->is_Con()
< prev index next >