mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-27 06:45:07 +02:00
8187684: Intrinsify Math.multiplyHigh(long, long)
Reviewed-by: kvn, aph, lucy
This commit is contained in:
parent
f651176392
commit
949f677957
4 changed files with 13 additions and 0 deletions
|
@ -781,6 +781,7 @@
|
||||||
do_name(decrementExact_name,"decrementExact") \
|
do_name(decrementExact_name,"decrementExact") \
|
||||||
do_name(incrementExact_name,"incrementExact") \
|
do_name(incrementExact_name,"incrementExact") \
|
||||||
do_name(multiplyExact_name,"multiplyExact") \
|
do_name(multiplyExact_name,"multiplyExact") \
|
||||||
|
do_name(multiplyHigh_name,"multiplyHigh") \
|
||||||
do_name(negateExact_name,"negateExact") \
|
do_name(negateExact_name,"negateExact") \
|
||||||
do_name(subtractExact_name,"subtractExact") \
|
do_name(subtractExact_name,"subtractExact") \
|
||||||
do_name(fma_name, "fma") \
|
do_name(fma_name, "fma") \
|
||||||
|
@ -805,6 +806,7 @@
|
||||||
do_intrinsic(_incrementExactL, java_lang_Math, incrementExact_name, long_long_signature, F_S) \
|
do_intrinsic(_incrementExactL, java_lang_Math, incrementExact_name, long_long_signature, F_S) \
|
||||||
do_intrinsic(_multiplyExactI, java_lang_Math, multiplyExact_name, int2_int_signature, F_S) \
|
do_intrinsic(_multiplyExactI, java_lang_Math, multiplyExact_name, int2_int_signature, F_S) \
|
||||||
do_intrinsic(_multiplyExactL, java_lang_Math, multiplyExact_name, long2_long_signature, F_S) \
|
do_intrinsic(_multiplyExactL, java_lang_Math, multiplyExact_name, long2_long_signature, F_S) \
|
||||||
|
do_intrinsic(_multiplyHigh, java_lang_Math, multiplyHigh_name, long2_long_signature, F_S) \
|
||||||
do_intrinsic(_negateExactI, java_lang_Math, negateExact_name, int_int_signature, F_S) \
|
do_intrinsic(_negateExactI, java_lang_Math, negateExact_name, int_int_signature, F_S) \
|
||||||
do_intrinsic(_negateExactL, java_lang_Math, negateExact_name, long_long_signature, F_S) \
|
do_intrinsic(_negateExactL, java_lang_Math, negateExact_name, long_long_signature, F_S) \
|
||||||
do_intrinsic(_subtractExactI, java_lang_Math, subtractExact_name, int2_int_signature, F_S) \
|
do_intrinsic(_subtractExactI, java_lang_Math, subtractExact_name, int2_int_signature, F_S) \
|
||||||
|
|
|
@ -410,6 +410,9 @@ bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virt
|
||||||
case vmIntrinsics::_multiplyExactL:
|
case vmIntrinsics::_multiplyExactL:
|
||||||
if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
|
if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
|
||||||
break;
|
break;
|
||||||
|
case vmIntrinsics::_multiplyHigh:
|
||||||
|
if (!Matcher::match_rule_supported(Op_MulHiL)) return false;
|
||||||
|
break;
|
||||||
case vmIntrinsics::_getCallerClass:
|
case vmIntrinsics::_getCallerClass:
|
||||||
if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
|
if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -231,6 +231,7 @@ class LibraryCallKit : public GraphKit {
|
||||||
bool inline_math_addExactL(bool is_increment);
|
bool inline_math_addExactL(bool is_increment);
|
||||||
bool inline_math_multiplyExactI();
|
bool inline_math_multiplyExactI();
|
||||||
bool inline_math_multiplyExactL();
|
bool inline_math_multiplyExactL();
|
||||||
|
bool inline_math_multiplyHigh();
|
||||||
bool inline_math_negateExactI();
|
bool inline_math_negateExactI();
|
||||||
bool inline_math_negateExactL();
|
bool inline_math_negateExactL();
|
||||||
bool inline_math_subtractExactI(bool is_decrement);
|
bool inline_math_subtractExactI(bool is_decrement);
|
||||||
|
@ -549,6 +550,7 @@ bool LibraryCallKit::try_to_inline(int predicate) {
|
||||||
case vmIntrinsics::_incrementExactL: return inline_math_addExactL(true /* increment */);
|
case vmIntrinsics::_incrementExactL: return inline_math_addExactL(true /* increment */);
|
||||||
case vmIntrinsics::_multiplyExactI: return inline_math_multiplyExactI();
|
case vmIntrinsics::_multiplyExactI: return inline_math_multiplyExactI();
|
||||||
case vmIntrinsics::_multiplyExactL: return inline_math_multiplyExactL();
|
case vmIntrinsics::_multiplyExactL: return inline_math_multiplyExactL();
|
||||||
|
case vmIntrinsics::_multiplyHigh: return inline_math_multiplyHigh();
|
||||||
case vmIntrinsics::_negateExactI: return inline_math_negateExactI();
|
case vmIntrinsics::_negateExactI: return inline_math_negateExactI();
|
||||||
case vmIntrinsics::_negateExactL: return inline_math_negateExactL();
|
case vmIntrinsics::_negateExactL: return inline_math_negateExactL();
|
||||||
case vmIntrinsics::_subtractExactI: return inline_math_subtractExactI(false /* subtract */);
|
case vmIntrinsics::_subtractExactI: return inline_math_subtractExactI(false /* subtract */);
|
||||||
|
@ -1897,6 +1899,11 @@ bool LibraryCallKit::inline_math_multiplyExactL() {
|
||||||
return inline_math_overflow<OverflowMulLNode>(argument(0), argument(2));
|
return inline_math_overflow<OverflowMulLNode>(argument(0), argument(2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool LibraryCallKit::inline_math_multiplyHigh() {
|
||||||
|
set_result(_gvn.transform(new MulHiLNode(argument(0), argument(2))));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Node*
|
Node*
|
||||||
LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
|
LibraryCallKit::generate_min_max(vmIntrinsics::ID id, Node* x0, Node* y0) {
|
||||||
// These are the candidate return value:
|
// These are the candidate return value:
|
||||||
|
|
|
@ -1094,6 +1094,7 @@ public final class Math {
|
||||||
* @return the result
|
* @return the result
|
||||||
* @since 9
|
* @since 9
|
||||||
*/
|
*/
|
||||||
|
@HotSpotIntrinsicCandidate
|
||||||
public static long multiplyHigh(long x, long y) {
|
public static long multiplyHigh(long x, long y) {
|
||||||
if (x < 0 || y < 0) {
|
if (x < 0 || y < 0) {
|
||||||
// Use technique from section 8-2 of Henry S. Warren, Jr.,
|
// Use technique from section 8-2 of Henry S. Warren, Jr.,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue