src/share/vm/opto/library_call.cpp

Print this page




 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.