619 case vmIntrinsics::_intBitsToFloat: 620 case vmIntrinsics::_doubleToRawLongBits: 621 case vmIntrinsics::_doubleToLongBits: 622 case vmIntrinsics::_longBitsToDouble: 623 return inline_fp_conversions(intrinsic_id()); 624 625 case vmIntrinsics::_numberOfLeadingZeros_i: 626 case vmIntrinsics::_numberOfLeadingZeros_l: 627 return inline_numberOfLeadingZeros(intrinsic_id()); 628 629 case vmIntrinsics::_numberOfTrailingZeros_i: 630 case vmIntrinsics::_numberOfTrailingZeros_l: 631 return inline_numberOfTrailingZeros(intrinsic_id()); 632 633 case vmIntrinsics::_bitCount_i: 634 case vmIntrinsics::_bitCount_l: 635 return inline_bitCount(intrinsic_id()); 636 637 case vmIntrinsics::_reverseBytes_i: 638 case vmIntrinsics::_reverseBytes_l: 639 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); 640 641 case vmIntrinsics::_get_AtomicLong: 642 return inline_native_AtomicLong_get(); 643 case vmIntrinsics::_attemptUpdate: 644 return inline_native_AtomicLong_attemptUpdate(); 645 646 case vmIntrinsics::_getCallerClass: 647 return inline_native_Reflection_getCallerClass(); 648 649 default: 650 // If you get here, it may be that someone has added a new intrinsic 651 // to the list in vmSymbols.hpp without implementing it here. 652 #ifndef PRODUCT 653 if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) { 654 tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)", 655 vmIntrinsics::name_at(intrinsic_id()), intrinsic_id()); 656 } 657 #endif 658 return false; 1993 // inline int Integer.bitCount(int) 1994 // inline int Long.bitCount(long) 1995 bool LibraryCallKit::inline_bitCount(vmIntrinsics::ID id) { 1996 assert(id == vmIntrinsics::_bitCount_i || id == vmIntrinsics::_bitCount_l, "not bitCount"); 1997 if (id == vmIntrinsics::_bitCount_i && !Matcher::has_match_rule(Op_PopCountI)) return false; 1998 if (id == vmIntrinsics::_bitCount_l && !Matcher::has_match_rule(Op_PopCountL)) return false; 1999 _sp += arg_size(); // restore stack pointer 2000 switch (id) { 2001 case vmIntrinsics::_bitCount_i: 2002 push(_gvn.transform(new (C, 2) PopCountINode(pop()))); 2003 break; 2004 case vmIntrinsics::_bitCount_l: 2005 push(_gvn.transform(new (C, 2) PopCountLNode(pop_pair()))); 2006 break; 2007 default: 2008 ShouldNotReachHere(); 2009 } 2010 return true; 2011 } 2012 2013 //----------------------------inline_reverseBytes_int/long------------------- 2014 // inline Integer.reverseBytes(int) 2015 // inline Long.reverseBytes(long) 2016 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { 2017 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l, "not reverse Bytes"); 2018 if (id == vmIntrinsics::_reverseBytes_i && !Matcher::has_match_rule(Op_ReverseBytesI)) return false; 2019 if (id == vmIntrinsics::_reverseBytes_l && !Matcher::has_match_rule(Op_ReverseBytesL)) return false; 2020 _sp += arg_size(); // restore stack pointer 2021 switch (id) { 2022 case vmIntrinsics::_reverseBytes_i: 2023 push(_gvn.transform(new (C, 2) ReverseBytesINode(0, pop()))); 2024 break; 2025 case vmIntrinsics::_reverseBytes_l: 2026 push_pair(_gvn.transform(new (C, 2) ReverseBytesLNode(0, pop_pair()))); 2027 break; 2028 default: 2029 ; 2030 } 2031 return true; 2032 } 2033 2034 //----------------------------inline_unsafe_access---------------------------- 2035 2036 const static BasicType T_ADDRESS_HOLDER = T_LONG; 2037 2038 // Interpret Unsafe.fieldOffset cookies correctly: 2039 extern jlong Unsafe_field_offset_to_byte_offset(jlong field_offset); 2040 2041 bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile) { 2042 if (callee()->is_static()) return false; // caller must have the capability! 2043 2044 #ifndef PRODUCT 2045 { 2046 ResourceMark rm; 2047 // Check the signatures. | 619 case vmIntrinsics::_intBitsToFloat: 620 case vmIntrinsics::_doubleToRawLongBits: 621 case vmIntrinsics::_doubleToLongBits: 622 case vmIntrinsics::_longBitsToDouble: 623 return inline_fp_conversions(intrinsic_id()); 624 625 case vmIntrinsics::_numberOfLeadingZeros_i: 626 case vmIntrinsics::_numberOfLeadingZeros_l: 627 return inline_numberOfLeadingZeros(intrinsic_id()); 628 629 case vmIntrinsics::_numberOfTrailingZeros_i: 630 case vmIntrinsics::_numberOfTrailingZeros_l: 631 return inline_numberOfTrailingZeros(intrinsic_id()); 632 633 case vmIntrinsics::_bitCount_i: 634 case vmIntrinsics::_bitCount_l: 635 return inline_bitCount(intrinsic_id()); 636 637 case vmIntrinsics::_reverseBytes_i: 638 case vmIntrinsics::_reverseBytes_l: 639 case vmIntrinsics::_reverseBytes_s: 640 case vmIntrinsics::_reverseBytes_c: 641 return inline_reverseBytes((vmIntrinsics::ID) intrinsic_id()); 642 643 case vmIntrinsics::_get_AtomicLong: 644 return inline_native_AtomicLong_get(); 645 case vmIntrinsics::_attemptUpdate: 646 return inline_native_AtomicLong_attemptUpdate(); 647 648 case vmIntrinsics::_getCallerClass: 649 return inline_native_Reflection_getCallerClass(); 650 651 default: 652 // If you get here, it may be that someone has added a new intrinsic 653 // to the list in vmSymbols.hpp without implementing it here. 654 #ifndef PRODUCT 655 if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) { 656 tty->print_cr("*** Warning: Unimplemented intrinsic %s(%d)", 657 vmIntrinsics::name_at(intrinsic_id()), intrinsic_id()); 658 } 659 #endif 660 return false; 1995 // inline int Integer.bitCount(int) 1996 // inline int Long.bitCount(long) 1997 bool LibraryCallKit::inline_bitCount(vmIntrinsics::ID id) { 1998 assert(id == vmIntrinsics::_bitCount_i || id == vmIntrinsics::_bitCount_l, "not bitCount"); 1999 if (id == vmIntrinsics::_bitCount_i && !Matcher::has_match_rule(Op_PopCountI)) return false; 2000 if (id == vmIntrinsics::_bitCount_l && !Matcher::has_match_rule(Op_PopCountL)) return false; 2001 _sp += arg_size(); // restore stack pointer 2002 switch (id) { 2003 case vmIntrinsics::_bitCount_i: 2004 push(_gvn.transform(new (C, 2) PopCountINode(pop()))); 2005 break; 2006 case vmIntrinsics::_bitCount_l: 2007 push(_gvn.transform(new (C, 2) PopCountLNode(pop_pair()))); 2008 break; 2009 default: 2010 ShouldNotReachHere(); 2011 } 2012 return true; 2013 } 2014 2015 //----------------------------inline_reverseBytes_int/long/char/short------------------- 2016 // inline Integer.reverseBytes(int) 2017 // inline Long.reverseBytes(long) 2018 // inline Character.reverseBytes(char) 2019 // inline Short.reverseBytes(short) 2020 bool LibraryCallKit::inline_reverseBytes(vmIntrinsics::ID id) { 2021 assert(id == vmIntrinsics::_reverseBytes_i || id == vmIntrinsics::_reverseBytes_l || 2022 id == vmIntrinsics::_reverseBytes_c || id == vmIntrinsics::_reverseBytes_s, 2023 "not reverse Bytes"); 2024 if (id == vmIntrinsics::_reverseBytes_i && !Matcher::has_match_rule(Op_ReverseBytesI)) return false; 2025 if (id == vmIntrinsics::_reverseBytes_l && !Matcher::has_match_rule(Op_ReverseBytesL)) return false; 2026 if (id == vmIntrinsics::_reverseBytes_c && !Matcher::has_match_rule(Op_ReverseBytesC)) return false; 2027 if (id == vmIntrinsics::_reverseBytes_s && !Matcher::has_match_rule(Op_ReverseBytesS)) return false; 2028 _sp += arg_size(); // restore stack pointer 2029 switch (id) { 2030 case vmIntrinsics::_reverseBytes_i: 2031 push(_gvn.transform(new (C, 2) ReverseBytesINode(0, pop()))); 2032 break; 2033 case vmIntrinsics::_reverseBytes_l: 2034 push_pair(_gvn.transform(new (C, 2) ReverseBytesLNode(0, pop_pair()))); 2035 break; 2036 case vmIntrinsics::_reverseBytes_c: 2037 push(_gvn.transform(new (C, 2) ReverseBytesCNode(0, pop()))); 2038 break; 2039 case vmIntrinsics::_reverseBytes_s: 2040 push(_gvn.transform(new (C, 2) ReverseBytesSNode(0, pop()))); 2041 break; 2042 default: 2043 ; 2044 } 2045 return true; 2046 } 2047 2048 //----------------------------inline_unsafe_access---------------------------- 2049 2050 const static BasicType T_ADDRESS_HOLDER = T_LONG; 2051 2052 // Interpret Unsafe.fieldOffset cookies correctly: 2053 extern jlong Unsafe_field_offset_to_byte_offset(jlong field_offset); 2054 2055 bool LibraryCallKit::inline_unsafe_access(bool is_native_ptr, bool is_store, BasicType type, bool is_volatile) { 2056 if (callee()->is_static()) return false; // caller must have the capability! 2057 2058 #ifndef PRODUCT 2059 { 2060 ResourceMark rm; 2061 // Check the signatures. |