< prev index next >
src/hotspot/share/opto/library_call.cpp
Print this page
rev 53028 : 8212043: Add floating-point Math.min/max intrinsics
Summary: Floating-point Math.min() and Math.max() intrinsics are enabled on AArch64 platform
Reviewed-by: adinn, aph
*** 323,332 ****
--- 323,333 ----
bool inline_montgomeryMultiply();
bool inline_montgomerySquare();
bool inline_vectorizedMismatch();
bool inline_fma(vmIntrinsics::ID id);
bool inline_character_compare(vmIntrinsics::ID id);
+ bool inline_fp_min_max(vmIntrinsics::ID id);
bool inline_profileBoolean();
bool inline_isCompileConstant();
void clear_upper_avx() {
#ifdef X86
*** 872,881 ****
--- 873,888 ----
case vmIntrinsics::_isLowerCase:
case vmIntrinsics::_isUpperCase:
case vmIntrinsics::_isWhitespace:
return inline_character_compare(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) {
*** 6586,6595 ****
--- 6593,6638 ----
set_result(_gvn.transform(n));
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 >