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 5513 : 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,219 ----
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_addExactI(bool is_increment);
! bool inline_math_addExactL(bool is_increment);
! bool inline_math_multiplyExactI();
! bool inline_math_multiplyExactL();
! bool inline_math_negateExactI();
! bool inline_math_negateExactL();
! bool inline_math_subtractExactI(bool is_decrement);
! bool inline_math_subtractExactL(bool is_decrement);
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?");
--- 512,548 ----
case vmIntrinsics::_updateBytesCRC32:
case vmIntrinsics::_updateByteBufferCRC32:
if (!UseCRC32Intrinsics) return NULL;
break;
! case vmIntrinsics::_incrementExactI:
! case vmIntrinsics::_addExactI:
! 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::_decrementExactI:
! case vmIntrinsics::_subtractExactI:
! 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::_negateExactI:
! 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::_multiplyExactI:
! 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?");
*** 684,694 ****
case vmIntrinsics::_dpow: return inline_math_native(intrinsic_id());
case vmIntrinsics::_min:
case vmIntrinsics::_max: return inline_min_max(intrinsic_id());
! case vmIntrinsics::_addExact: return inline_math_addExact();
case vmIntrinsics::_arraycopy: return inline_arraycopy();
case vmIntrinsics::_compareTo: return inline_string_compareTo();
case vmIntrinsics::_indexOf: return inline_string_indexOf();
--- 711,732 ----
case vmIntrinsics::_dpow: return inline_math_native(intrinsic_id());
case vmIntrinsics::_min:
case vmIntrinsics::_max: return inline_min_max(intrinsic_id());
! case vmIntrinsics::_addExactI: return inline_math_addExactI(false /* add */);
! case vmIntrinsics::_addExactL: return inline_math_addExactL(false /* add */);
! case vmIntrinsics::_decrementExactI: return inline_math_subtractExactI(true /* decrement */);
! case vmIntrinsics::_decrementExactL: return inline_math_subtractExactL(true /* decrement */);
! case vmIntrinsics::_incrementExactI: return inline_math_addExactI(true /* increment */);
! case vmIntrinsics::_incrementExactL: return inline_math_addExactL(true /* increment */);
! case vmIntrinsics::_multiplyExactI: return inline_math_multiplyExactI();
! case vmIntrinsics::_multiplyExactL: return inline_math_multiplyExactL();
! case vmIntrinsics::_negateExactI: return inline_math_negateExactI();
! case vmIntrinsics::_negateExactL: return inline_math_negateExactL();
! case vmIntrinsics::_subtractExactI: return inline_math_subtractExactI(false /* subtract */);
! case vmIntrinsics::_subtractExactL: return inline_math_subtractExactL(false /* subtract */);
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);
--- 1967,1984 ----
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 (!math->is_MathExact()) {
! 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) {
--- 1997,2106 ----
Deoptimization::Action_none);
}
set_control(fast_path);
set_result(result);
}
! bool LibraryCallKit::inline_math_addExactI(bool is_increment) {
Node* arg1 = argument(0);
! Node* arg2 = NULL;
!
! if (is_increment) {
! arg2 = intcon(1);
! } else {
! arg2 = argument(1);
! }
Node* add = _gvn.transform( new(C) AddExactINode(NULL, arg1, arg2) );
! inline_math_mathExact(add);
! return true;
! }
!
! bool LibraryCallKit::inline_math_addExactL(bool is_increment) {
! Node* arg1 = argument(0); // type long
! // argument(1) == TOP
! Node* arg2 = NULL;
!
! if (is_increment) {
! arg2 = longcon(1);
! } else {
! arg2 = argument(2); // type long
! // argument(3) == TOP
! }
!
! Node* add = _gvn.transform(new(C) AddExactLNode(NULL, arg1, arg2));
! inline_math_mathExact(add);
! return true;
! }
!
! bool LibraryCallKit::inline_math_subtractExactI(bool is_decrement) {
! Node* arg1 = argument(0);
! Node* arg2 = NULL;
!
! if (is_decrement) {
! arg2 = intcon(1);
} else {
! arg2 = argument(1);
}
+
+ Node* sub = _gvn.transform(new(C) SubExactINode(NULL, arg1, arg2));
+ inline_math_mathExact(sub);
+ return true;
+ }
+
+ bool LibraryCallKit::inline_math_subtractExactL(bool is_decrement) {
+ Node* arg1 = argument(0); // type long
+ // argument(1) == TOP
+ Node* arg2 = NULL;
+
+ if (is_decrement) {
+ arg2 = longcon(1);
+ } else {
+ Node* arg2 = argument(2); // type long
+ // argument(3) == TOP
+ }
+
+ Node* sub = _gvn.transform(new(C) SubExactLNode(NULL, arg1, arg2));
+ inline_math_mathExact(sub);
+ return true;
+ }
+
+ bool LibraryCallKit::inline_math_negateExactI() {
+ 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_multiplyExactI() {
+ 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;
}
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