src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/share/vm/opto/library_call.cpp

src/share/vm/opto/library_call.cpp

Print this page
rev 5462 : 8026844: Various Math functions needs intrinsification
Reviewed-by: duke

*** 201,212 **** Node* round_double_node(Node* n); bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_math_native(vmIntrinsics::ID id); bool inline_trig(vmIntrinsics::ID id); bool inline_math(vmIntrinsics::ID id); ! bool inline_math_mathExact(Node* math); bool inline_math_addExact(); bool inline_exp(); bool inline_pow(); void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_min_max(vmIntrinsics::ID id); Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y); --- 201,223 ---- Node* round_double_node(Node* n); bool runtime_math(const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_math_native(vmIntrinsics::ID id); bool inline_trig(vmIntrinsics::ID id); bool inline_math(vmIntrinsics::ID id); ! void inline_math_mathExact(Node* math); bool inline_math_addExact(); + bool inline_math_addExactL(); + bool inline_math_decrementExact(); + bool inline_math_decrementExactL(); + bool inline_math_incrementExact(); + bool inline_math_incrementExactL(); + bool inline_math_multiplyExact(); + bool inline_math_multiplyExactL(); + bool inline_math_negateExact(); + bool inline_math_negateExactL(); + bool inline_math_subtractExact(); + bool inline_math_subtractExactL(); bool inline_exp(); bool inline_pow(); void finish_pow_exp(Node* result, Node* x, Node* y, const TypeFunc* call_type, address funcAddr, const char* funcName); bool inline_min_max(vmIntrinsics::ID id); Node* generate_min_max(vmIntrinsics::ID id, Node* x, Node* y);
*** 505,521 **** case vmIntrinsics::_updateBytesCRC32: case vmIntrinsics::_updateByteBufferCRC32: if (!UseCRC32Intrinsics) return NULL; break; case vmIntrinsics::_addExact: ! if (!Matcher::match_rule_supported(Op_AddExactI)) { ! return NULL; ! } ! if (!UseMathExactIntrinsics) { ! return NULL; ! } break; default: assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); --- 516,552 ---- case vmIntrinsics::_updateBytesCRC32: case vmIntrinsics::_updateByteBufferCRC32: if (!UseCRC32Intrinsics) return NULL; break; + case vmIntrinsics::_incrementExact: case vmIntrinsics::_addExact: ! if (!Matcher::match_rule_supported(Op_AddExactI) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_incrementExactL: ! case vmIntrinsics::_addExactL: ! if (!Matcher::match_rule_supported(Op_AddExactL) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_decrementExact: ! case vmIntrinsics::_subtractExact: ! if (!Matcher::match_rule_supported(Op_SubExactI) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_decrementExactL: ! case vmIntrinsics::_subtractExactL: ! if (!Matcher::match_rule_supported(Op_SubExactL) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_negateExact: ! if (!Matcher::match_rule_supported(Op_NegExactI) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_negateExactL: ! if (!Matcher::match_rule_supported(Op_NegExactL) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_multiplyExact: ! if (!Matcher::match_rule_supported(Op_MulExactI) || !UseMathExactIntrinsics) return NULL; ! break; ! case vmIntrinsics::_multiplyExactL: ! if (!Matcher::match_rule_supported(Op_MulExactL) || !UseMathExactIntrinsics) return NULL; break; default: assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?");
*** 685,694 **** --- 716,736 ---- case vmIntrinsics::_min: case vmIntrinsics::_max: return inline_min_max(intrinsic_id()); case vmIntrinsics::_addExact: return inline_math_addExact(); + case vmIntrinsics::_addExactL: return inline_math_addExactL(); + case vmIntrinsics::_decrementExact: return inline_math_decrementExact(); + case vmIntrinsics::_decrementExactL: return inline_math_decrementExactL(); + case vmIntrinsics::_incrementExact: return inline_math_incrementExact(); + case vmIntrinsics::_incrementExactL: return inline_math_incrementExactL(); + case vmIntrinsics::_multiplyExact: return inline_math_multiplyExact(); + case vmIntrinsics::_multiplyExactL: return inline_math_multiplyExactL(); + case vmIntrinsics::_negateExact: return inline_math_negateExact(); + case vmIntrinsics::_negateExactL: return inline_math_negateExactL(); + case vmIntrinsics::_subtractExact: return inline_math_subtractExact(); + case vmIntrinsics::_subtractExactL: return inline_math_subtractExactL(); case vmIntrinsics::_arraycopy: return inline_arraycopy(); case vmIntrinsics::_compareTo: return inline_string_compareTo(); case vmIntrinsics::_indexOf: return inline_string_indexOf();
*** 1929,1939 **** bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) { set_result(generate_min_max(id, argument(0), argument(1))); return true; } ! bool LibraryCallKit::inline_math_mathExact(Node* math) { Node* result = _gvn.transform( new(C) ProjNode(math, MathExactNode::result_proj_node)); Node* flags = _gvn.transform( new(C) FlagsProjNode(math, MathExactNode::flags_proj_node)); Node* bol = _gvn.transform( new (C) BoolNode(flags, BoolTest::overflow) ); IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN); --- 1971,1988 ---- bool LibraryCallKit::inline_min_max(vmIntrinsics::ID id) { set_result(generate_min_max(id, argument(0), argument(1))); return true; } ! void LibraryCallKit::inline_math_mathExact(Node* math) { ! // If we didn't get the expected opcode it means we have optimized ! // the node to something else and don't need the exception edge. ! if (MathExactNode::is_MathExactOpcode(math->Opcode()) == false) { ! set_result(math); ! return; ! } ! Node* result = _gvn.transform( new(C) ProjNode(math, MathExactNode::result_proj_node)); Node* flags = _gvn.transform( new(C) FlagsProjNode(math, MathExactNode::flags_proj_node)); Node* bol = _gvn.transform( new (C) BoolNode(flags, BoolTest::overflow) ); IfNode* check = create_and_map_if(control(), bol, PROB_UNLIKELY_MAG(3), COUNT_UNKNOWN);
*** 1952,1974 **** Deoptimization::Action_none); } set_control(fast_path); set_result(result); - return true; } bool LibraryCallKit::inline_math_addExact() { Node* arg1 = argument(0); Node* arg2 = argument(1); Node* add = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2) ); ! if (add->Opcode() == Op_AddExactI) { ! return inline_math_mathExact(add); ! } else { ! set_result(add); ! } return true; } Node* LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) { --- 2001,2124 ---- Deoptimization::Action_none); } set_control(fast_path); set_result(result); } bool LibraryCallKit::inline_math_addExact() { Node* arg1 = argument(0); Node* arg2 = argument(1); Node* add = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2) ); ! inline_math_mathExact(add); ! return true; ! } ! ! bool LibraryCallKit::inline_math_addExactL() { ! Node* arg1 = argument(0); // type long ! // argument(1) == TOP ! Node* arg2 = argument(2); // type long ! // argument(4) == TOP ! ! Node* add = _gvn.transform( new(C) AddExactLNode(NULL, arg1, arg2) ); ! inline_math_mathExact(add); ! return true; ! } ! ! bool LibraryCallKit::inline_math_subtractExactL() { ! Node* arg1 = argument(0); // type long ! // argument(1) == TOP ! Node* arg2 = argument(2); // type long ! // argument(4) == TOP ! ! Node* sub = _gvn.transform( new(C) SubExactLNode(NULL, arg1, arg2) ); ! inline_math_mathExact(sub); ! return true; ! } ! ! bool LibraryCallKit::inline_math_subtractExact() { ! Node* arg1 = argument(0); ! Node* arg2 = argument(1); ! ! Node* sub = _gvn.transform( new(C) SubExactINode(NULL, arg1, arg2) ); ! inline_math_mathExact(sub); ! return true; ! } ! ! bool LibraryCallKit::inline_math_negateExact() { ! Node* arg1 = argument(0); ! ! Node* neg = _gvn.transform( new(C) NegExactINode(NULL, arg1)); ! inline_math_mathExact(neg); ! return true; ! } ! ! bool LibraryCallKit::inline_math_negateExactL() { ! Node* arg1 = argument(0); ! // argument(1) == TOP ! ! Node* neg = _gvn.transform( new(C) NegExactLNode(NULL, arg1)); ! inline_math_mathExact(neg); ! return true; ! } ! ! bool LibraryCallKit::inline_math_multiplyExact() { ! Node* arg1 = argument(0); ! Node* arg2 = argument(1); ! ! Node* mul = _gvn.transform( new(C) MulExactINode(NULL, arg1, arg2) ); ! inline_math_mathExact(mul); ! return true; ! } ! ! bool LibraryCallKit::inline_math_multiplyExactL() { ! Node* arg1 = argument(0); ! // argument(1) == TOP ! Node* arg2 = argument(2); ! // argument(3) == TOP ! ! Node* mul = _gvn.transform( new(C) MulExactLNode(NULL, arg1, arg2) ); ! inline_math_mathExact(mul); ! return true; ! } ! ! bool LibraryCallKit::inline_math_incrementExact() { ! Node* arg1 = argument(0); ! Node* arg2 = intcon(1); ! ! Node* inc = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2)); ! inline_math_mathExact(inc); ! return true; ! } ! ! bool LibraryCallKit::inline_math_incrementExactL() { ! Node* arg1 = argument(0); ! // argument(1) == TOP ! Node* arg2 = longcon(1); ! ! Node* inc = _gvn.transform( new(C) AddExactLNode(NULL, arg1, arg2)); ! inline_math_mathExact(inc); ! return true; ! } ! ! bool LibraryCallKit::inline_math_decrementExact() { ! Node* arg1 = argument(0); ! Node* arg2 = intcon(1); ! ! Node* dec = _gvn.transform( new(C) SubExactINode(NULL, arg1, arg2)); ! inline_math_mathExact(dec); ! return true; ! } ! ! bool LibraryCallKit::inline_math_decrementExactL() { ! Node* arg1 = argument(0); ! // argument(1) == TOP ! Node* arg2 = longcon(1); ! ! Node* dec = _gvn.transform( new(C) SubExactLNode(NULL, arg1, arg2)); ! inline_math_mathExact(dec); return true; } Node* LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File