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