< prev index next >

src/share/vm/interpreter/abstractInterpreter.cpp

Print this page




 107 
 108 
 109 //------------------------------------------------------------------------------------------------------------------------
 110 // Entry points
 111 
 112 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
 113   // Abstract method?
 114   if (m->is_abstract()) return abstract;
 115 
 116   // Method handle primitive?
 117   if (m->is_method_handle_intrinsic()) {
 118     vmIntrinsics::ID id = m->intrinsic_id();
 119     assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
 120     MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
 121                                     ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
 122     assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
 123     return kind;
 124   }
 125 
 126 #ifndef CC_INTERP
 127   if (UseCRC32Intrinsics && m->is_native()) {
 128     // Use optimized stub code for CRC32 native methods.
 129     switch (m->intrinsic_id()) {

 130       case vmIntrinsics::_updateCRC32            : return java_util_zip_CRC32_update;
 131       case vmIntrinsics::_updateBytesCRC32       : return java_util_zip_CRC32_updateBytes;
 132       case vmIntrinsics::_updateByteBufferCRC32  : return java_util_zip_CRC32_updateByteBuffer;
 133     }
 134   }
 135   if (UseCRC32CIntrinsics) {
 136     // Use optimized stub code for CRC32C methods.
 137     switch (m->intrinsic_id()) {
 138       case vmIntrinsics::_updateBytesCRC32C             : return java_util_zip_CRC32C_updateBytes;
 139       case vmIntrinsics::_updateDirectByteBufferCRC32C  : return java_util_zip_CRC32C_updateDirectByteBuffer;
 140     }
 141   }
 142 
 143   switch(m->intrinsic_id()) {
 144   case vmIntrinsics::_intBitsToFloat:      return java_lang_Float_intBitsToFloat;
 145   case vmIntrinsics::_floatToRawIntBits:   return java_lang_Float_floatToRawIntBits;
 146   case vmIntrinsics::_longBitsToDouble:    return java_lang_Double_longBitsToDouble;
 147   case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
 148   }
 149 
 150 #endif // CC_INTERP
 151 
 152   // Native method?
 153   // Note: This test must come _before_ the test for intrinsic
 154   //       methods. See also comments below.
 155   if (m->is_native()) {
 156     assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
 157     return m->is_synchronized() ? native_synchronized : native;
 158   }
 159 
 160   // Synchronized?
 161   if (m->is_synchronized()) {
 162     return zerolocals_synchronized;
 163   }
 164 
 165   if (RegisterFinalizersAtInit && m->code_size() == 1 &&
 166       m->intrinsic_id() == vmIntrinsics::_Object_init) {
 167     // We need to execute the special return bytecode to check for
 168     // finalizer registration so create a normal frame.
 169     return zerolocals;


 172   // Empty method?
 173   if (m->is_empty_method()) {
 174     return empty;
 175   }
 176 
 177   // Special intrinsic method?
 178   // Note: This test must come _after_ the test for native methods,
 179   //       otherwise we will run into problems with JDK 1.2, see also
 180   //       TemplateInterpreterGenerator::generate_method_entry() for
 181   //       for details.
 182   switch (m->intrinsic_id()) {
 183     case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
 184     case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
 185     case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
 186     case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
 187     case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
 188     case vmIntrinsics::_dlog  : return java_lang_math_log  ;
 189     case vmIntrinsics::_dlog10: return java_lang_math_log10;
 190     case vmIntrinsics::_dpow  : return java_lang_math_pow  ;
 191     case vmIntrinsics::_dexp  : return java_lang_math_exp  ;


 192 
 193     case vmIntrinsics::_Reference_get:
 194                                 return java_lang_ref_reference_get;
 195   }
 196 
 197   if (UseFMA) {
 198     switch (m->intrinsic_id()) {
 199       case vmIntrinsics::_fmaD: return java_lang_math_fmaD;
 200       case vmIntrinsics::_fmaF: return java_lang_math_fmaF;
 201     }
 202   }
 203 
 204   // Accessor method?
 205   if (m->is_getter()) {
 206     // TODO: We should have used ::is_accessor above, but fast accessors in Zero expect only getters.
 207     // See CppInterpreter::accessor_entry in cppInterpreter_zero.cpp. This should be fixed in Zero,
 208     // then the call above updated to ::is_accessor
 209     assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
 210     return accessor;
 211   }
 212 
 213   // Note: for now: zero locals for all non-empty methods
 214   return zerolocals;
 215 }
 216 
 217 #if INCLUDE_CDS
 218 
 219 address AbstractInterpreter::get_trampoline_code_buffer(AbstractInterpreter::MethodKind kind) {
 220   const size_t trampoline_size = SharedRuntime::trampoline_size();
 221   address addr = MetaspaceShared::cds_i2i_entry_code_buffers((size_t)(AbstractInterpreter::number_of_method_entries) * trampoline_size);




 107 
 108 
 109 //------------------------------------------------------------------------------------------------------------------------
 110 // Entry points
 111 
 112 AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
 113   // Abstract method?
 114   if (m->is_abstract()) return abstract;
 115 
 116   // Method handle primitive?
 117   if (m->is_method_handle_intrinsic()) {
 118     vmIntrinsics::ID id = m->intrinsic_id();
 119     assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
 120     MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
 121                                     ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
 122     assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
 123     return kind;
 124   }
 125 
 126 #ifndef CC_INTERP


 127   switch (m->intrinsic_id()) {
 128     // Use optimized stub code for CRC32 native methods.
 129     case vmIntrinsics::_updateCRC32            : return java_util_zip_CRC32_update;
 130     case vmIntrinsics::_updateBytesCRC32       : return java_util_zip_CRC32_updateBytes;
 131     case vmIntrinsics::_updateByteBufferCRC32  : return java_util_zip_CRC32_updateByteBuffer;



 132     // Use optimized stub code for CRC32C methods.

 133     case vmIntrinsics::_updateBytesCRC32C             : return java_util_zip_CRC32C_updateBytes;
 134     case vmIntrinsics::_updateDirectByteBufferCRC32C  : return java_util_zip_CRC32C_updateDirectByteBuffer;




 135     case vmIntrinsics::_intBitsToFloat:      return java_lang_Float_intBitsToFloat;
 136     case vmIntrinsics::_floatToRawIntBits:   return java_lang_Float_floatToRawIntBits;
 137     case vmIntrinsics::_longBitsToDouble:    return java_lang_Double_longBitsToDouble;
 138     case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
 139   }

 140 #endif // CC_INTERP
 141 
 142   // Native method?
 143   // Note: This test must come _before_ the test for intrinsic
 144   //       methods. See also comments below.
 145   if (m->is_native()) {
 146     assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
 147     return m->is_synchronized() ? native_synchronized : native;
 148   }
 149 
 150   // Synchronized?
 151   if (m->is_synchronized()) {
 152     return zerolocals_synchronized;
 153   }
 154 
 155   if (RegisterFinalizersAtInit && m->code_size() == 1 &&
 156       m->intrinsic_id() == vmIntrinsics::_Object_init) {
 157     // We need to execute the special return bytecode to check for
 158     // finalizer registration so create a normal frame.
 159     return zerolocals;


 162   // Empty method?
 163   if (m->is_empty_method()) {
 164     return empty;
 165   }
 166 
 167   // Special intrinsic method?
 168   // Note: This test must come _after_ the test for native methods,
 169   //       otherwise we will run into problems with JDK 1.2, see also
 170   //       TemplateInterpreterGenerator::generate_method_entry() for
 171   //       for details.
 172   switch (m->intrinsic_id()) {
 173     case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
 174     case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
 175     case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
 176     case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
 177     case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
 178     case vmIntrinsics::_dlog  : return java_lang_math_log  ;
 179     case vmIntrinsics::_dlog10: return java_lang_math_log10;
 180     case vmIntrinsics::_dpow  : return java_lang_math_pow  ;
 181     case vmIntrinsics::_dexp  : return java_lang_math_exp  ;
 182     case vmIntrinsics::_fmaD  : return java_lang_math_fmaD ;
 183     case vmIntrinsics::_fmaF  : return java_lang_math_fmaF ;
 184 
 185     case vmIntrinsics::_Reference_get:
 186                                 return java_lang_ref_reference_get;







 187   }
 188 
 189   // Accessor method?
 190   if (m->is_getter()) {
 191     // TODO: We should have used ::is_accessor above, but fast accessors in Zero expect only getters.
 192     // See CppInterpreter::accessor_entry in cppInterpreter_zero.cpp. This should be fixed in Zero,
 193     // then the call above updated to ::is_accessor
 194     assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
 195     return accessor;
 196   }
 197 
 198   // Note: for now: zero locals for all non-empty methods
 199   return zerolocals;
 200 }
 201 
 202 #if INCLUDE_CDS
 203 
 204 address AbstractInterpreter::get_trampoline_code_buffer(AbstractInterpreter::MethodKind kind) {
 205   const size_t trampoline_size = SharedRuntime::trampoline_size();
 206   address addr = MetaspaceShared::cds_i2i_entry_code_buffers((size_t)(AbstractInterpreter::number_of_method_entries) * trampoline_size);


< prev index next >