hotspot/src/share/vm/interpreter/interpreter.cpp
changeset 35214 d86005e0b4c2
parent 35201 996db89f378e
child 35479 62c12ca7a45e
equal deleted inserted replaced
35211:3771329165d4 35214:d86005e0b4c2
    27 #include "asm/macroAssembler.inline.hpp"
    27 #include "asm/macroAssembler.inline.hpp"
    28 #include "compiler/disassembler.hpp"
    28 #include "compiler/disassembler.hpp"
    29 #include "interpreter/bytecodeHistogram.hpp"
    29 #include "interpreter/bytecodeHistogram.hpp"
    30 #include "interpreter/bytecodeInterpreter.hpp"
    30 #include "interpreter/bytecodeInterpreter.hpp"
    31 #include "interpreter/interpreter.hpp"
    31 #include "interpreter/interpreter.hpp"
    32 #include "interpreter/interpreterGenerator.hpp"
       
    33 #include "interpreter/interpreterRuntime.hpp"
    32 #include "interpreter/interpreterRuntime.hpp"
    34 #include "interpreter/interp_masm.hpp"
    33 #include "interpreter/interp_masm.hpp"
    35 #include "interpreter/templateTable.hpp"
    34 #include "interpreter/templateTable.hpp"
    36 #include "memory/allocation.inline.hpp"
    35 #include "memory/allocation.inline.hpp"
    37 #include "memory/resourceArea.hpp"
    36 #include "memory/resourceArea.hpp"
   280   }
   279   }
   281 
   280 
   282   // Special intrinsic method?
   281   // Special intrinsic method?
   283   // Note: This test must come _after_ the test for native methods,
   282   // Note: This test must come _after_ the test for native methods,
   284   //       otherwise we will run into problems with JDK 1.2, see also
   283   //       otherwise we will run into problems with JDK 1.2, see also
   285   //       InterpreterGenerator::generate_method_entry() for
   284   //       TemplateInterpreterGenerator::generate_method_entry() for
   286   //       for details.
   285   //       for details.
   287   switch (m->intrinsic_id()) {
   286   switch (m->intrinsic_id()) {
   288     case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
   287     case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
   289     case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
   288     case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
   290     case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
   289     case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
   546   for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
   545   for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
   547     Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
   546     Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
   548     Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
   547     Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
   549   }
   548   }
   550 }
   549 }
   551 
       
   552 // Generate method entries
       
   553 address InterpreterGenerator::generate_method_entry(
       
   554                                         AbstractInterpreter::MethodKind kind) {
       
   555   // determine code generation flags
       
   556   bool native = false;
       
   557   bool synchronized = false;
       
   558   address entry_point = NULL;
       
   559 
       
   560   switch (kind) {
       
   561   case Interpreter::zerolocals             :                                          break;
       
   562   case Interpreter::zerolocals_synchronized:                synchronized = true;      break;
       
   563   case Interpreter::native                 : native = true;                           break;
       
   564   case Interpreter::native_synchronized    : native = true; synchronized = true;      break;
       
   565   case Interpreter::empty                  : entry_point = generate_empty_entry();    break;
       
   566   case Interpreter::accessor               : entry_point = generate_accessor_entry(); break;
       
   567   case Interpreter::abstract               : entry_point = generate_abstract_entry(); break;
       
   568 
       
   569   case Interpreter::java_lang_math_sin     : // fall thru
       
   570   case Interpreter::java_lang_math_cos     : // fall thru
       
   571   case Interpreter::java_lang_math_tan     : // fall thru
       
   572   case Interpreter::java_lang_math_abs     : // fall thru
       
   573   case Interpreter::java_lang_math_log     : // fall thru
       
   574   case Interpreter::java_lang_math_log10   : // fall thru
       
   575   case Interpreter::java_lang_math_sqrt    : // fall thru
       
   576   case Interpreter::java_lang_math_pow     : // fall thru
       
   577   case Interpreter::java_lang_math_exp     : entry_point = generate_math_entry(kind);      break;
       
   578   case Interpreter::java_lang_ref_reference_get
       
   579                                            : entry_point = generate_Reference_get_entry(); break;
       
   580 #ifndef CC_INTERP
       
   581   case Interpreter::java_util_zip_CRC32_update
       
   582                                            : native = true; entry_point = generate_CRC32_update_entry();  break;
       
   583   case Interpreter::java_util_zip_CRC32_updateBytes
       
   584                                            : // fall thru
       
   585   case Interpreter::java_util_zip_CRC32_updateByteBuffer
       
   586                                            : native = true; entry_point = generate_CRC32_updateBytes_entry(kind); break;
       
   587   case Interpreter::java_util_zip_CRC32C_updateBytes
       
   588                                            : // fall thru
       
   589   case Interpreter::java_util_zip_CRC32C_updateDirectByteBuffer
       
   590                                            : entry_point = generate_CRC32C_updateBytes_entry(kind); break;
       
   591 #if defined(TARGET_ARCH_x86) && !defined(_LP64)
       
   592   // On x86_32 platforms, a special entry is generated for the following four methods.
       
   593   // On other platforms the normal entry is used to enter these methods.
       
   594   case Interpreter::java_lang_Float_intBitsToFloat
       
   595                                            : native = true; entry_point = generate_Float_intBitsToFloat_entry(); break;
       
   596   case Interpreter::java_lang_Float_floatToRawIntBits
       
   597                                            : native = true; entry_point = generate_Float_floatToRawIntBits_entry(); break;
       
   598   case Interpreter::java_lang_Double_longBitsToDouble
       
   599                                            : native = true; entry_point = generate_Double_longBitsToDouble_entry(); break;
       
   600   case Interpreter::java_lang_Double_doubleToRawLongBits
       
   601                                            : native = true; entry_point = generate_Double_doubleToRawLongBits_entry(); break;
       
   602 #else
       
   603   case Interpreter::java_lang_Float_intBitsToFloat:
       
   604   case Interpreter::java_lang_Float_floatToRawIntBits:
       
   605   case Interpreter::java_lang_Double_longBitsToDouble:
       
   606   case Interpreter::java_lang_Double_doubleToRawLongBits:
       
   607     native = true;
       
   608     break;
       
   609 #endif // defined(TARGET_ARCH_x86) && !defined(_LP64)
       
   610 #endif // CC_INTERP
       
   611   default:
       
   612     fatal("unexpected method kind: %d", kind);
       
   613     break;
       
   614   }
       
   615 
       
   616   if (entry_point) {
       
   617     return entry_point;
       
   618   }
       
   619 
       
   620   // We expect the normal and native entry points to be generated first so we can reuse them.
       
   621   if (native) {
       
   622     entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::native_synchronized : Interpreter::native);
       
   623     if (entry_point == NULL) {
       
   624       entry_point = generate_native_entry(synchronized);
       
   625     }
       
   626   } else {
       
   627     entry_point = Interpreter::entry_for_kind(synchronized ? Interpreter::zerolocals_synchronized : Interpreter::zerolocals);
       
   628     if (entry_point == NULL) {
       
   629       entry_point = generate_normal_entry(synchronized);
       
   630     }
       
   631   }
       
   632 
       
   633   return entry_point;
       
   634 }