< 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 >