hotspot/src/share/vm/interpreter/abstractInterpreter.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 35479 62c12ca7a45e
child 41323 ddd5600d4762
permissions -rw-r--r--
8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive Summary: This optimization reduces the size of the RW region of the CDS archive. It also reduces the amount of pages in the RW region that are actually written into during runtime. Reviewed-by: dlong, iklam, jiangli Contributed-by: ioi.lam@oracle.com, calvin.cheung@oracle.com, goetz.lindenmaier@sap.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
31620
53be635ad49c 8087333: Optionally Pre-Generate the HotSpot Template Interpreter
bdelsart
parents: 25950
diff changeset
     2
 * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4564
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4564
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4564
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    25
#include "precompiled.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14294
diff changeset
    26
#include "asm/macroAssembler.hpp"
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14294
diff changeset
    27
#include "asm/macroAssembler.inline.hpp"
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
    28
#include "compiler/disassembler.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    29
#include "interpreter/bytecodeHistogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    30
#include "interpreter/bytecodeInterpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    31
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    32
#include "interpreter/interpreterRuntime.hpp"
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    33
#include "interpreter/interp_masm.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    34
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    35
#include "memory/allocation.inline.hpp"
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
    36
#include "memory/metaspaceShared.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    37
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    38
#include "oops/arrayOop.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    39
#include "oops/methodData.hpp"
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    40
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    41
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    42
#include "prims/forte.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    43
#include "prims/jvmtiExport.hpp"
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
    44
#include "prims/methodHandles.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    45
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    46
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    47
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    48
#include "runtime/timer.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
# define __ _masm->
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
//------------------------------------------------------------------------------------------------------------------------
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    53
// Implementation of platform independent aspects of Interpreter
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
void AbstractInterpreter::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  if (_code != NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  // make sure 'imported' classes are initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  if (PrintBytecodeHistogram)                                BytecodeHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  if (PrintBytecodePairHistogram)                            BytecodePairHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  InvocationCounter::reinitialize(DelayCompilationDuringStartup);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
void AbstractInterpreter::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  tty->print_cr("Interpreter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  tty->print_cr("code size        = %6dK bytes", (int)_code->used_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  tty->print_cr("total space      = %6dK bytes", (int)_code->total_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  tty->print_cr("wasted space     = %6dK bytes", (int)_code->available_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  tty->print_cr("# of codelets    = %6d"      , _code->number_of_stubs());
31620
53be635ad49c 8087333: Optionally Pre-Generate the HotSpot Template Interpreter
bdelsart
parents: 25950
diff changeset
    77
  if (_code->number_of_stubs() != 0) {
53be635ad49c 8087333: Optionally Pre-Generate the HotSpot Template Interpreter
bdelsart
parents: 25950
diff changeset
    78
    tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
53be635ad49c 8087333: Optionally Pre-Generate the HotSpot Template Interpreter
bdelsart
parents: 25950
diff changeset
    79
    tty->cr();
53be635ad49c 8087333: Optionally Pre-Generate the HotSpot Template Interpreter
bdelsart
parents: 25950
diff changeset
    80
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  _code->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
// Implementation of interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
StubQueue* AbstractInterpreter::_code                                       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
bool       AbstractInterpreter::_notice_safepoints                          = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
address    AbstractInterpreter::_rethrow_exception_entry                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
address    AbstractInterpreter::_native_entry_begin                         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
address    AbstractInterpreter::_native_entry_end                           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
address    AbstractInterpreter::_slow_signature_handler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
address    AbstractInterpreter::_entry_table            [AbstractInterpreter::number_of_method_entries];
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
    98
address    AbstractInterpreter::_cds_entry_table        [AbstractInterpreter::number_of_method_entries];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
address    AbstractInterpreter::_native_abi_to_tosca    [AbstractInterpreter::number_of_result_handlers];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// Generation of complete interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  _masm                      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
// Entry points
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  // Abstract method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  if (m->is_abstract()) return abstract;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   116
  // Method handle primitive?
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   117
  if (m->is_method_handle_intrinsic()) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   118
    vmIntrinsics::ID id = m->intrinsic_id();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   119
    assert(MethodHandles::is_signature_polymorphic(id), "must match an intrinsic");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   120
    MethodKind kind = (MethodKind)( method_handle_invoke_FIRST +
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   121
                                    ((int)id - vmIntrinsics::FIRST_MH_SIG_POLY) );
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   122
    assert(kind <= method_handle_invoke_LAST, "parallel enum ranges");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   123
    return kind;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   124
  }
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   125
18507
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   126
#ifndef CC_INTERP
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   127
  if (UseCRC32Intrinsics && m->is_native()) {
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   128
    // Use optimized stub code for CRC32 native methods.
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   129
    switch (m->intrinsic_id()) {
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   130
      case vmIntrinsics::_updateCRC32            : return java_util_zip_CRC32_update;
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   131
      case vmIntrinsics::_updateBytesCRC32       : return java_util_zip_CRC32_updateBytes;
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   132
      case vmIntrinsics::_updateByteBufferCRC32  : return java_util_zip_CRC32_updateByteBuffer;
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   133
    }
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   134
  }
33066
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   135
  if (UseCRC32CIntrinsics) {
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   136
    // Use optimized stub code for CRC32C methods.
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   137
    switch (m->intrinsic_id()) {
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   138
      case vmIntrinsics::_updateBytesCRC32C             : return java_util_zip_CRC32C_updateBytes;
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   139
      case vmIntrinsics::_updateDirectByteBufferCRC32C  : return java_util_zip_CRC32C_updateDirectByteBuffer;
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   140
    }
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   141
  }
32391
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   142
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   143
  switch(m->intrinsic_id()) {
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   144
  case vmIntrinsics::_intBitsToFloat:      return java_lang_Float_intBitsToFloat;
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   145
  case vmIntrinsics::_floatToRawIntBits:   return java_lang_Float_floatToRawIntBits;
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   146
  case vmIntrinsics::_longBitsToDouble:    return java_lang_Double_longBitsToDouble;
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   147
  case vmIntrinsics::_doubleToRawLongBits: return java_lang_Double_doubleToRawLongBits;
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   148
  }
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   149
01e2f5e916c7 8076373: In 32-bit VM interpreter and compiled code process NaN values differently
zmajo
parents: 31620
diff changeset
   150
#endif // CC_INTERP
18507
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   151
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  // Native method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  // Note: This test must come _before_ the test for intrinsic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  //       methods. See also comments below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  if (m->is_native()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   156
    assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
    return m->is_synchronized() ? native_synchronized : native;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  // Synchronized?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  if (m->is_synchronized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
    return zerolocals_synchronized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  if (RegisterFinalizersAtInit && m->code_size() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
      m->intrinsic_id() == vmIntrinsics::_Object_init) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
    // We need to execute the special return bytecode to check for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    // finalizer registration so create a normal frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  // Empty method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  if (m->is_empty_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    return empty;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // Special intrinsic method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  // Note: This test must come _after_ the test for native methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  //       otherwise we will run into problems with JDK 1.2, see also
35214
d86005e0b4c2 8074457: Remove the non-Zero CPP Interpreter
coleenp
parents: 35201
diff changeset
   180
  //       TemplateInterpreterGenerator::generate_method_entry() for
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  //       for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  switch (m->intrinsic_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
    case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
    case vmIntrinsics::_dlog  : return java_lang_math_log  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
    case vmIntrinsics::_dlog10: return java_lang_math_log10;
12739
09f26b73ae66 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 9176
diff changeset
   190
    case vmIntrinsics::_dpow  : return java_lang_math_pow  ;
09f26b73ae66 7133857: exp() and pow() should use the x87 ISA on x86
roland
parents: 9176
diff changeset
   191
    case vmIntrinsics::_dexp  : return java_lang_math_exp  ;
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   192
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   193
    case vmIntrinsics::_Reference_get:
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   194
                                return java_lang_ref_reference_get;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   195
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   196
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   197
  // Accessor method?
34169
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33198
diff changeset
   198
  if (m->is_getter()) {
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33198
diff changeset
   199
    // TODO: We should have used ::is_accessor above, but fast accessors in Zero expect only getters.
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33198
diff changeset
   200
    // See CppInterpreter::accessor_entry in cppInterpreter_zero.cpp. This should be fixed in Zero,
b0b7187852b7 8140650: Method::is_accessor should cover getters and setters for all types
shade
parents: 33198
diff changeset
   201
    // then the call above updated to ::is_accessor
9176
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   202
    assert(m->size_of_parameters() == 1, "fast code for accessors assumes parameter size = 1");
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   203
    return accessor;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // Note: for now: zero locals for all non-empty methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   210
#if INCLUDE_CDS
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   211
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   212
address AbstractInterpreter::get_trampoline_code_buffer(AbstractInterpreter::MethodKind kind) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   213
  const size_t trampoline_size = SharedRuntime::trampoline_size();
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   214
  address addr = MetaspaceShared::cds_i2i_entry_code_buffers((size_t)(AbstractInterpreter::number_of_method_entries) * trampoline_size);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   215
  addr += (size_t)(kind) * trampoline_size;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   216
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   217
  return addr;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   218
}
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   219
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   220
void AbstractInterpreter::update_cds_entry_table(AbstractInterpreter::MethodKind kind) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   221
  if (DumpSharedSpaces || UseSharedSpaces) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   222
    address trampoline = get_trampoline_code_buffer(kind);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   223
    _cds_entry_table[kind] = trampoline;
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   224
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   225
    CodeBuffer buffer(trampoline, (int)(SharedRuntime::trampoline_size()));
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   226
    MacroAssembler _masm(&buffer);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   227
    SharedRuntime::generate_trampoline(&_masm, _entry_table[kind]);
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   228
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   229
    if (PrintInterpreter) {
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   230
      Disassembler::decode(buffer.insts_begin(), buffer.insts_end());
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   231
    }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   232
  }
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   233
}
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   234
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   235
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   237
void AbstractInterpreter::set_entry_for_kind(AbstractInterpreter::MethodKind kind, address entry) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   238
  assert(kind >= method_handle_invoke_FIRST &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   239
         kind <= method_handle_invoke_LAST, "late initialization only for MH entry points");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   240
  assert(_entry_table[kind] == _entry_table[abstract], "previous value must be AME entry");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   241
  _entry_table[kind] = entry;
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   242
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   243
  update_cds_entry_table(kind);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   244
}
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   245
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
// Return true if the interpreter can prove that the given bytecode has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
// not yet been executed (in Java semantics, not in actual operation).
33593
60764a78fa5c 8140274: methodHandles and constantPoolHandles should be passed as const references
coleenp
parents: 33198
diff changeset
   248
bool AbstractInterpreter::is_not_reached(const methodHandle& method, int bci) {
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   249
  Bytecodes::Code code = method()->code_at(bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   251
  if (!Bytecodes::must_rewrite(code)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    // might have been reached
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  // the bytecode might not be rewritten if the method is an accessor, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  address ientry = method->interpreter_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
      ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
    return false;  // interpreter does not run this method!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // otherwise, we can be sure this bytecode has never been executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
void AbstractInterpreter::print_method_kind(MethodKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  switch (kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    case zerolocals             : tty->print("zerolocals"             ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    case native                 : tty->print("native"                 ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    case native_synchronized    : tty->print("native_synchronized"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    case empty                  : tty->print("empty"                  ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
    case accessor               : tty->print("accessor"               ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    case abstract               : tty->print("abstract"               ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
    case java_lang_math_sin     : tty->print("java_lang_math_sin"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
    case java_lang_math_cos     : tty->print("java_lang_math_cos"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
    case java_lang_math_tan     : tty->print("java_lang_math_tan"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
    case java_lang_math_abs     : tty->print("java_lang_math_abs"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
    case java_lang_math_sqrt    : tty->print("java_lang_math_sqrt"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
    case java_lang_math_log     : tty->print("java_lang_math_log"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
    case java_lang_math_log10   : tty->print("java_lang_math_log10"   ); break;
18507
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   284
    case java_util_zip_CRC32_update           : tty->print("java_util_zip_CRC32_update"); break;
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   285
    case java_util_zip_CRC32_updateBytes      : tty->print("java_util_zip_CRC32_updateBytes"); break;
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   286
    case java_util_zip_CRC32_updateByteBuffer : tty->print("java_util_zip_CRC32_updateByteBuffer"); break;
33066
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   287
    case java_util_zip_CRC32C_updateBytes     : tty->print("java_util_zip_CRC32C_updateBytes"); break;
d98eab8215c4 8134553: CRC32C implementations for x86/x64 targets
kvn
parents: 32391
diff changeset
   288
    case java_util_zip_CRC32C_updateDirectByteBuffer: tty->print("java_util_zip_CRC32C_updateDirectByteByffer"); break;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   289
    default:
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   290
      if (kind >= method_handle_invoke_FIRST &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   291
          kind <= method_handle_invoke_LAST) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   292
        const char* kind_name = vmIntrinsics::name_at(method_handle_intrinsic(kind));
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   293
        if (kind_name[0] == '_')  kind_name = &kind_name[1];  // '_invokeExact' => 'invokeExact'
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   294
        tty->print("method_handle_%s", kind_name);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   295
        break;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   296
      }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   297
      ShouldNotReachHere();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   298
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
// Deoptimization support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   307
/**
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   308
 * If a deoptimization happens, this function returns the point of next bytecode to continue execution.
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   309
 */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   310
address AbstractInterpreter::deopt_continue_after_entry(Method* method, address bcp, int callee_parameters, bool is_top_frame) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  assert(method->contains(bcp), "just checkin'");
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   312
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   313
  // Get the original and rewritten bytecode.
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   314
  Bytecodes::Code code = Bytecodes::java_code_at(method, bcp);
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   315
  assert(!Interpreter::bytecode_should_reexecute(code), "should not reexecute");
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   316
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   317
  const int bci = method->bci_from(bcp);
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   318
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // compute continuation length
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   320
  const int length = Bytecodes::length_at(method, bcp);
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   321
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // compute result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  BasicType type = T_ILLEGAL;
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   324
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    case Bytecodes::_invokevirtual  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    case Bytecodes::_invokespecial  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    case Bytecodes::_invokestatic   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    case Bytecodes::_invokeinterface: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
      Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
      ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   333
      type = Bytecode_invoke(mh, bci).result_type();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
      // since the cache entry might not be initialized:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
      // (NOT needed for the old calling convension)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
      if (!is_top_frame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
        int index = Bytes::get_native_u2(bcp+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
        method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   343
   case Bytecodes::_invokedynamic: {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   344
      Thread *thread = Thread::current();
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   345
      ResourceMark rm(thread);
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   346
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   347
      type = Bytecode_invoke(mh, bci).result_type();
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   348
      // since the cache entry might not be initialized:
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   349
      // (NOT needed for the old calling convension)
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   350
      if (!is_top_frame) {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   351
        int index = Bytes::get_native_u4(bcp+1);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   352
        method->constants()->invokedynamic_cp_cache_entry_at(index)->set_parameter_size(callee_parameters);
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   353
      }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   354
      break;
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   355
    }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   356
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
    case Bytecodes::_ldc   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
    case Bytecodes::_ldc_w : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
    case Bytecodes::_ldc2_w:
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   360
      {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   361
        Thread *thread = Thread::current();
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   362
        ResourceMark rm(thread);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   363
        methodHandle mh(thread, method);
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   364
        type = Bytecode_loadconstant(mh, bci).result_type();
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   365
        break;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   366
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
      type = Bytecodes::result_type(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  // return entry point for computed continuation state & bytecode length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
  return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
    is_top_frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
    ? Interpreter::deopt_entry (as_TosState(type), length)
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   377
    : Interpreter::return_entry(as_TosState(type), length, code);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   380
// If deoptimization happens, this function returns the point where the interpreter reexecutes
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   381
// the bytecode.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   382
// Note: Bytecodes::_athrow is a special case in that it does not return
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   383
//       Interpreter::deopt_entry(vtos, 0) like others
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   384
address AbstractInterpreter::deopt_reexecute_entry(Method* method, address bcp) {
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   385
  assert(method->contains(bcp), "just checkin'");
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   386
  Bytecodes::Code code   = Bytecodes::java_code_at(method, bcp);
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 33070
diff changeset
   387
#if defined(COMPILER1) || INCLUDE_JVMCI
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   388
  if(code == Bytecodes::_athrow ) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   389
    return Interpreter::rethrow_exception_entry();
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   390
  }
33160
c59f1676d27e 8136421: JEP 243: Java-Level JVM Compiler Interface
twisti
parents: 33070
diff changeset
   391
#endif /* COMPILER1 || INCLUDE_JVMCI */
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   392
  return Interpreter::deopt_entry(vtos, 0);
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   393
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   394
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   395
// If deoptimization happens, the interpreter should reexecute these bytecodes.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   396
// This function mainly helps the compilers to set up the reexecute bit.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   397
bool AbstractInterpreter::bytecode_should_reexecute(Bytecodes::Code code) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   398
  switch (code) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   399
    case Bytecodes::_lookupswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   400
    case Bytecodes::_tableswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   401
    case Bytecodes::_fast_binaryswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   402
    case Bytecodes::_fast_linearswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   403
    // recompute condtional expression folded into _if<cond>
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   404
    case Bytecodes::_lcmp      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   405
    case Bytecodes::_fcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   406
    case Bytecodes::_fcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   407
    case Bytecodes::_dcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   408
    case Bytecodes::_dcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   409
    case Bytecodes::_ifnull    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   410
    case Bytecodes::_ifnonnull :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   411
    case Bytecodes::_goto      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   412
    case Bytecodes::_goto_w    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   413
    case Bytecodes::_ifeq      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   414
    case Bytecodes::_ifne      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   415
    case Bytecodes::_iflt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   416
    case Bytecodes::_ifge      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   417
    case Bytecodes::_ifgt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   418
    case Bytecodes::_ifle      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   419
    case Bytecodes::_if_icmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   420
    case Bytecodes::_if_icmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   421
    case Bytecodes::_if_icmplt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   422
    case Bytecodes::_if_icmpge :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   423
    case Bytecodes::_if_icmpgt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   424
    case Bytecodes::_if_icmple :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   425
    case Bytecodes::_if_acmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   426
    case Bytecodes::_if_acmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   427
    // special cases
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   428
    case Bytecodes::_getfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   429
    case Bytecodes::_putfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   430
    case Bytecodes::_getstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   431
    case Bytecodes::_putstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   432
    case Bytecodes::_aastore   :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   433
#ifdef COMPILER1
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   434
    //special case of reexecution
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   435
    case Bytecodes::_athrow    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   436
#endif
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   437
      return true;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   438
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   439
    default:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   440
      return false;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   441
  }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   442
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   443
35479
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35214
diff changeset
   444
void AbstractInterpreter::initialize_method_handle_entries() {
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35214
diff changeset
   445
  // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate:
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35214
diff changeset
   446
  for (int i = method_handle_invoke_FIRST; i <= method_handle_invoke_LAST; i++) {
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35214
diff changeset
   447
    MethodKind kind = (MethodKind) i;
62c12ca7a45e 8146410: Interpreter functions are declared and defined in the wrong files
coleenp
parents: 35214
diff changeset
   448
    _entry_table[kind] = _entry_table[Interpreter::abstract];
37439
e8970711113b 8145221: Use trampolines for i2i and i2c entries in Methods that are stored in CDS archive
ccheung
parents: 35479
diff changeset
   449
    Interpreter::update_cds_entry_table(kind);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
}