hotspot/src/share/vm/interpreter/interpreter.cpp
author coleenp
Tue, 12 Aug 2014 10:48:55 -0400
changeset 25950 b5c40ed1d349
parent 25715 d5a8dbdc5150
child 31620 53be635ad49c
permissions -rw-r--r--
8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero Summary: These options have been long disabled in Xmixed mode because they prevent these small methods from being inlined and are subject to bit rot, and we don't need more macro assembler code to maintain and change if the constant pool cache format changes. Reviewed-by: simonis, kvn
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 21198
diff changeset
     2
 * Copyright (c) 1997, 2014, 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"
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 14294
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"
25950
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
    32
#include "interpreter/interpreterGenerator.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    33
#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
    34
#include "interpreter/interp_masm.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    35
#include "interpreter/templateTable.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6176
diff changeset
    36
#include "memory/allocation.inline.hpp"
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
// Implementation of InterpreterCodelet
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
void InterpreterCodelet::initialize(const char* description, Bytecodes::Code bytecode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  _description       = description;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  _bytecode          = bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
void InterpreterCodelet::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    66
void InterpreterCodelet::print_on(outputStream* st) const {
13887
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
    67
  ttyLocker ttyl;
89b873bcc55b 7200163: add CodeComments functionality to assember stubs
kvn
parents: 13728
diff changeset
    68
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  if (PrintInterpreter) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    70
    st->cr();
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    71
    st->print_cr("----------------------------------------------------------------------");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    74
  if (description() != NULL) st->print("%s  ", description());
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    75
  if (bytecode()    >= 0   ) st->print("%d %s  ", bytecode(), Bytecodes::name(bytecode()));
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    76
  st->print_cr("[" INTPTR_FORMAT ", " INTPTR_FORMAT "]  %d bytes",
24424
2658d7834c6e 8037816: Fix for 8036122 breaks build with Xcode5/clang
drchase
parents: 21198
diff changeset
    77
                p2i(code_begin()), p2i(code_end()), code_size());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  if (PrintInterpreter) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5924
diff changeset
    80
    st->cr();
16368
713209c45a82 8008555: Debugging code in compiled method sometimes leaks memory
roland
parents: 14626
diff changeset
    81
    Disassembler::decode(code_begin(), code_end(), st, DEBUG_ONLY(_strings) NOT_DEBUG(CodeStrings()));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    85
CodeletMark::CodeletMark(InterpreterMacroAssembler*& masm,
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    86
                         const char* description,
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    87
                         Bytecodes::Code bytecode) :
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    88
  _clet((InterpreterCodelet*)AbstractInterpreter::code()->request(codelet_size())),
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    89
  _cb(_clet->code_begin(), _clet->code_size()) {
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    90
  // Request all space (add some slack for Codelet data).
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    91
  assert(_clet != NULL, "we checked not enough space already");
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    92
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    93
  // Initialize Codelet attributes.
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    94
  _clet->initialize(description, bytecode);
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    95
  // Create assembler for code generation.
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    96
  masm = new InterpreterMacroAssembler(&_cb);
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    97
  _masm = &masm;
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    98
}
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
    99
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   100
CodeletMark::~CodeletMark() {
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   101
  // Align so printing shows nop's instead of random code at the end (Codelets are aligned).
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   102
  (*_masm)->align(wordSize);
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   103
  // Make sure all code is in code buffer.
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   104
  (*_masm)->flush();
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   105
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   106
  // Commit Codelet.
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   107
  AbstractInterpreter::code()->commit((*_masm)->code()->pure_insts_size(), (*_masm)->code()->strings());
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   108
  // Make sure nobody can use _masm outside a CodeletMark lifespan.
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   109
  *_masm = NULL;
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   110
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
//------------------------------------------------------------------------------------------------------------------------
25715
d5a8dbdc5150 8049325: Introduce and clean up umbrella headers for the files in the cpu subdirectories.
goetz
parents: 24424
diff changeset
   113
// Implementation of platform independent aspects of Interpreter
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
void AbstractInterpreter::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  if (_code != NULL) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  // make sure 'imported' classes are initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  if (CountBytecodes || TraceBytecodes || StopInterpreterAt) BytecodeCounter::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  if (PrintBytecodeHistogram)                                BytecodeHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  if (PrintBytecodePairHistogram)                            BytecodePairHistogram::reset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  InvocationCounter::reinitialize(DelayCompilationDuringStartup);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
void AbstractInterpreter::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  tty->print_cr("Interpreter");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  tty->print_cr("code size        = %6dK bytes", (int)_code->used_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  tty->print_cr("total space      = %6dK bytes", (int)_code->total_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  tty->print_cr("wasted space     = %6dK bytes", (int)_code->available_space()/1024);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  tty->print_cr("# of codelets    = %6d"      , _code->number_of_stubs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  tty->print_cr("avg codelet size = %6d bytes", _code->used_space() / _code->number_of_stubs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  _code->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  tty->print_cr("----------------------------------------------------------------------");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
void interpreter_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
  Interpreter::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  if (TraceBytecodes) BytecodeTracer::set_closure(BytecodeTracer::std_closure());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  // need to hit every safepoint in order to call zapping routine
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  // register the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  Forte::register_stub(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    "Interpreter",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
    AbstractInterpreter::code()->code_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
    AbstractInterpreter::code()->code_end()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  );
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  // notify JVMTI profiler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  if (JvmtiExport::should_post_dynamic_code_generated()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
    JvmtiExport::post_dynamic_code_generated("Interpreter",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
                                             AbstractInterpreter::code()->code_start(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
                                             AbstractInterpreter::code()->code_end());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
// Implementation of interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
StubQueue* AbstractInterpreter::_code                                       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
bool       AbstractInterpreter::_notice_safepoints                          = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
address    AbstractInterpreter::_rethrow_exception_entry                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
address    AbstractInterpreter::_native_entry_begin                         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
address    AbstractInterpreter::_native_entry_end                           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
address    AbstractInterpreter::_slow_signature_handler;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
address    AbstractInterpreter::_entry_table            [AbstractInterpreter::number_of_method_entries];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
address    AbstractInterpreter::_native_abi_to_tosca    [AbstractInterpreter::number_of_result_handlers];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
// Generation of complete interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
AbstractInterpreterGenerator::AbstractInterpreterGenerator(StubQueue* _code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  _masm                      = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
static const BasicType types[Interpreter::number_of_result_handlers] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  T_BOOLEAN,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  T_CHAR   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  T_BYTE   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  T_SHORT  ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  T_INT    ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  T_LONG   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  T_VOID   ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  T_FLOAT  ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  T_DOUBLE ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  T_OBJECT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
void AbstractInterpreterGenerator::generate_all() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  { CodeletMark cm(_masm, "slow signature handler");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    Interpreter::_slow_signature_handler = generate_slow_signature_handler();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
// Entry points
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
AbstractInterpreter::MethodKind AbstractInterpreter::method_kind(methodHandle m) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // Abstract method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  if (m->is_abstract()) return abstract;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   216
  // Method handle primitive?
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   217
  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
   218
    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
   219
    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
   220
    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
   221
                                    ((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
   222
    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
   223
    return kind;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   224
  }
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   225
18507
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   226
#ifndef CC_INTERP
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   227
  if (UseCRC32Intrinsics && m->is_native()) {
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   228
    // 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
   229
    switch (m->intrinsic_id()) {
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   230
      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
   231
      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
   232
      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
   233
    }
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   234
  }
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   235
#endif
61bfc8995bb3 7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents: 16368
diff changeset
   236
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
  // Native method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  // Note: This test must come _before_ the test for intrinsic
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  //       methods. See also comments below.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  if (m->is_native()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   241
    assert(!m->is_method_handle_intrinsic(), "overlapping bits here, watch out");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
    return m->is_synchronized() ? native_synchronized : native;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Synchronized?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  if (m->is_synchronized()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    return zerolocals_synchronized;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  if (RegisterFinalizersAtInit && m->code_size() == 1 &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
      m->intrinsic_id() == vmIntrinsics::_Object_init) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
    // We need to execute the special return bytecode to check for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
    // finalizer registration so create a normal frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
    return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // Empty method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  if (m->is_empty_method()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
    return empty;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  // Special intrinsic method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  // Note: This test must come _after_ the test for native methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  //       otherwise we will run into problems with JDK 1.2, see also
25950
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   265
  //       InterpreterGenerator::generate_method_entry() for
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  //       for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  switch (m->intrinsic_id()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
    case vmIntrinsics::_dsin  : return java_lang_math_sin  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    case vmIntrinsics::_dcos  : return java_lang_math_cos  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    case vmIntrinsics::_dtan  : return java_lang_math_tan  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
    case vmIntrinsics::_dabs  : return java_lang_math_abs  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
    case vmIntrinsics::_dsqrt : return java_lang_math_sqrt ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
    case vmIntrinsics::_dlog  : return java_lang_math_log  ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
    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
   275
    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
   276
    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
   277
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   278
    case vmIntrinsics::_Reference_get:
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   279
                                return java_lang_ref_reference_get;
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   280
  }
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   281
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   282
  // Accessor method?
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   283
  if (m->is_accessor()) {
42d9d1010f38 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 8076
diff changeset
   284
    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
   285
    return accessor;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  // Note: for now: zero locals for all non-empty methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  return zerolocals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   293
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
   294
  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
   295
         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
   296
  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
   297
  _entry_table[kind] = entry;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   298
}
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   299
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   300
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
// Return true if the interpreter can prove that the given bytecode has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
// not yet been executed (in Java semantics, not in actual operation).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
bool AbstractInterpreter::is_not_reached(methodHandle method, int bci) {
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   304
  Bytecodes::Code code = method()->code_at(bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   306
  if (!Bytecodes::must_rewrite(code)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
    // might have been reached
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  // the bytecode might not be rewritten if the method is an accessor, etc.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  address ientry = method->interpreter_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  if (ientry != entry_for_kind(AbstractInterpreter::zerolocals) &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
      ientry != entry_for_kind(AbstractInterpreter::zerolocals_synchronized))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
    return false;  // interpreter does not run this method!
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  // otherwise, we can be sure this bytecode has never been executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
void AbstractInterpreter::print_method_kind(MethodKind kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
  switch (kind) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    case zerolocals             : tty->print("zerolocals"             ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
    case zerolocals_synchronized: tty->print("zerolocals_synchronized"); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
    case native                 : tty->print("native"                 ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
    case native_synchronized    : tty->print("native_synchronized"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    case empty                  : tty->print("empty"                  ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    case accessor               : tty->print("accessor"               ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    case abstract               : tty->print("abstract"               ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    case java_lang_math_sin     : tty->print("java_lang_math_sin"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    case java_lang_math_cos     : tty->print("java_lang_math_cos"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
    case java_lang_math_tan     : tty->print("java_lang_math_tan"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    case java_lang_math_abs     : tty->print("java_lang_math_abs"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    case java_lang_math_sqrt    : tty->print("java_lang_math_sqrt"    ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    case java_lang_math_log     : tty->print("java_lang_math_log"     ); break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    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
   339
    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
   340
    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
   341
    case java_util_zip_CRC32_updateByteBuffer : tty->print("java_util_zip_CRC32_updateByteBuffer"); break;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   342
    default:
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   343
      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
   344
          kind <= method_handle_invoke_LAST) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   345
        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
   346
        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
   347
        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
   348
        break;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   349
      }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   350
      ShouldNotReachHere();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 12739
diff changeset
   351
      break;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
//------------------------------------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
// Deoptimization support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   360
/**
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   361
 * 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
   362
 */
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   363
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
   364
  assert(method->contains(bcp), "just checkin'");
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   365
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   366
  // Get the original and rewritten bytecode.
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   367
  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
   368
  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
   369
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   370
  const int bci = method->bci_from(bcp);
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   371
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  // compute continuation length
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   373
  const int length = Bytecodes::length_at(method, bcp);
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   374
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  // compute result type
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
  BasicType type = T_ILLEGAL;
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   377
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
    case Bytecodes::_invokevirtual  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
    case Bytecodes::_invokespecial  :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
    case Bytecodes::_invokestatic   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
    case Bytecodes::_invokeinterface: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
      Thread *thread = Thread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
      ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   386
      type = Bytecode_invoke(mh, bci).result_type();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
      // since the cache entry might not be initialized:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
      // (NOT needed for the old calling convension)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
      if (!is_top_frame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   390
        int index = Bytes::get_native_u2(bcp+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
        method->constants()->cache()->entry_at(index)->set_parameter_size(callee_parameters);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   396
   case Bytecodes::_invokedynamic: {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   397
      Thread *thread = Thread::current();
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   398
      ResourceMark rm(thread);
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   399
      methodHandle mh(thread, method);
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7913
diff changeset
   400
      type = Bytecode_invoke(mh, bci).result_type();
4429
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   401
      // since the cache entry might not be initialized:
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   402
      // (NOT needed for the old calling convension)
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   403
      if (!is_top_frame) {
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   404
        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
   405
        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
   406
      }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   407
      break;
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   408
    }
d7eb4e2099aa 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 3600
diff changeset
   409
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
    case Bytecodes::_ldc   :
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
    case Bytecodes::_ldc_w : // fall through
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
    case Bytecodes::_ldc2_w:
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   413
      {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   414
        Thread *thread = Thread::current();
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   415
        ResourceMark rm(thread);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   416
        methodHandle mh(thread, method);
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   417
        type = Bytecode_loadconstant(mh, bci).result_type();
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   418
        break;
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5702
diff changeset
   419
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
      type = Bytecodes::result_type(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  // return entry point for computed continuation state & bytecode length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
    is_top_frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    ? Interpreter::deopt_entry (as_TosState(type), length)
21198
dd647e8d1d72 8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents: 18507
diff changeset
   430
    : Interpreter::return_entry(as_TosState(type), length, code);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
3600
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   433
// 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
   434
// the bytecode.
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   435
// 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
   436
//       Interpreter::deopt_entry(vtos, 0) like others
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   437
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
   438
  assert(method->contains(bcp), "just checkin'");
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7397
diff changeset
   439
  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
   440
#ifdef COMPILER1
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   441
  if(code == Bytecodes::_athrow ) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   442
    return Interpreter::rethrow_exception_entry();
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   443
  }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   444
#endif /* COMPILER1 */
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   445
  return Interpreter::deopt_entry(vtos, 0);
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   446
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   447
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   448
// 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
   449
// 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
   450
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
   451
  switch (code) {
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   452
    case Bytecodes::_lookupswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   453
    case Bytecodes::_tableswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   454
    case Bytecodes::_fast_binaryswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   455
    case Bytecodes::_fast_linearswitch:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   456
    // recompute condtional expression folded into _if<cond>
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   457
    case Bytecodes::_lcmp      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   458
    case Bytecodes::_fcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   459
    case Bytecodes::_fcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   460
    case Bytecodes::_dcmpl     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   461
    case Bytecodes::_dcmpg     :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   462
    case Bytecodes::_ifnull    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   463
    case Bytecodes::_ifnonnull :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   464
    case Bytecodes::_goto      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   465
    case Bytecodes::_goto_w    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   466
    case Bytecodes::_ifeq      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   467
    case Bytecodes::_ifne      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   468
    case Bytecodes::_iflt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   469
    case Bytecodes::_ifge      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   470
    case Bytecodes::_ifgt      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   471
    case Bytecodes::_ifle      :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   472
    case Bytecodes::_if_icmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   473
    case Bytecodes::_if_icmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   474
    case Bytecodes::_if_icmplt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   475
    case Bytecodes::_if_icmpge :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   476
    case Bytecodes::_if_icmpgt :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   477
    case Bytecodes::_if_icmple :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   478
    case Bytecodes::_if_acmpeq :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   479
    case Bytecodes::_if_acmpne :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   480
    // special cases
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   481
    case Bytecodes::_getfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   482
    case Bytecodes::_putfield  :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   483
    case Bytecodes::_getstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   484
    case Bytecodes::_putstatic :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   485
    case Bytecodes::_aastore   :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   486
#ifdef COMPILER1
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   487
    //special case of reexecution
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   488
    case Bytecodes::_athrow    :
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   489
#endif
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   490
      return true;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   491
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   492
    default:
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   493
      return false;
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   494
  }
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   495
}
27aa4477d039 6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents: 2534
diff changeset
   496
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  // Quick & dirty stack overflow checking: bang the stack & handle trap.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  // Note that we do the banging after the frame is setup, since the exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
  // handling code expects to find a valid interpreter frame on the stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
  // Doing the banging earlier fails if the caller frame is not an interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  // frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
  // (Also, the exception throwing code expects to unlock any synchronized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
  // method receiever, so do the banging after locking the receiver.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
  // Bang each page in the shadow zone. We can't assume it's been done for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
  // an interpreter frame with greater than a page of locals, so each page
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
  // needs to be checked.  Only true for non-native.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  if (UseStackBanging) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
    const int start_page = native_call ? StackShadowPages : 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    const int page_size = os::vm_page_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    for (int pages = start_page; pages <= StackShadowPages ; pages++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
      __ bang_stack_with_offset(pages*page_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
}
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   517
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   518
void AbstractInterpreterGenerator::initialize_method_handle_entries() {
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   519
  // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate:
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   520
  for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) {
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   521
    Interpreter::MethodKind kind = (Interpreter::MethodKind) i;
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   522
    Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract];
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   523
  }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13887
diff changeset
   524
}
25950
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   525
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   526
// Generate method entries
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   527
address InterpreterGenerator::generate_method_entry(
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   528
                                        AbstractInterpreter::MethodKind kind) {
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   529
  // determine code generation flags
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   530
  bool synchronized = false;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   531
  address entry_point = NULL;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   532
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   533
  switch (kind) {
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   534
  case Interpreter::zerolocals             :                                                      break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   535
  case Interpreter::zerolocals_synchronized: synchronized = true;                                 break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   536
  case Interpreter::native                 : entry_point = generate_native_entry(false); break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   537
  case Interpreter::native_synchronized    : entry_point = generate_native_entry(true);  break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   538
  case Interpreter::empty                  : entry_point = generate_empty_entry(); break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   539
  case Interpreter::accessor               : entry_point = generate_accessor_entry(); break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   540
  case Interpreter::abstract               : entry_point = generate_abstract_entry();    break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   541
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   542
  case Interpreter::java_lang_math_sin     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   543
  case Interpreter::java_lang_math_cos     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   544
  case Interpreter::java_lang_math_tan     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   545
  case Interpreter::java_lang_math_abs     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   546
  case Interpreter::java_lang_math_log     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   547
  case Interpreter::java_lang_math_log10   : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   548
  case Interpreter::java_lang_math_sqrt    : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   549
  case Interpreter::java_lang_math_pow     : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   550
  case Interpreter::java_lang_math_exp     : entry_point = generate_math_entry(kind);      break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   551
  case Interpreter::java_lang_ref_reference_get
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   552
                                           : entry_point = generate_Reference_get_entry(); break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   553
#ifndef CC_INTERP
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   554
  case Interpreter::java_util_zip_CRC32_update
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   555
                                           : entry_point = generate_CRC32_update_entry();  break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   556
  case Interpreter::java_util_zip_CRC32_updateBytes
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   557
                                           : // fall thru
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   558
  case Interpreter::java_util_zip_CRC32_updateByteBuffer
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   559
                                           : entry_point = generate_CRC32_updateBytes_entry(kind); break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   560
#endif // CC_INTERP
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   561
  default:
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   562
    fatal(err_msg("unexpected method kind: %d", kind));
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   563
    break;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   564
  }
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   565
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   566
  if (entry_point) {
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   567
    return entry_point;
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   568
  }
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   569
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   570
  return generate_normal_entry(synchronized);
b5c40ed1d349 8003426: Remove UseFastAccessors and UseFastEmptyMethods except for zero
coleenp
parents: 25715
diff changeset
   571
}