hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp
author ccheung
Thu, 07 Apr 2016 22:03:04 -0700
changeset 37439 e8970711113b
parent 37179 4dbcb3a642d2
child 37296 613278eb2a1e
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
/*
35477
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
     2
 * Copyright (c) 2002, 2016, 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: 5426
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5426
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: 5426
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: 6271
diff changeset
    25
// no precompiled headers
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    26
#include "classfile/vmSymbols.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30132
diff changeset
    27
#include "gc/shared/collectedHeap.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    28
#include "interpreter/bytecodeHistogram.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    29
#include "interpreter/bytecodeInterpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    30
#include "interpreter/bytecodeInterpreter.inline.hpp"
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
    31
#include "interpreter/bytecodeInterpreterProfiling.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    32
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    33
#include "interpreter/interpreterRuntime.hpp"
35216
71c463a17b3b 8141211: Convert TraceExceptions to Unified Logging
rprotacio
parents: 33749
diff changeset
    34
#include "logging/log.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    35
#include "memory/resourceArea.hpp"
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
    36
#include "oops/methodCounters.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    37
#include "oops/objArrayKlass.hpp"
29468
fb61ea6af339 8074543: Missing symbol "objArrayOopDesc::obj_at" when buiding with CPP Interpreter
stefank
parents: 28650
diff changeset
    38
#include "oops/objArrayOop.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    39
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    40
#include "prims/jvmtiExport.hpp"
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
    41
#include "prims/jvmtiThreadState.hpp"
25351
7c198a690050 8044775: Improve usage of umbrella header atomic.inline.hpp.
goetz
parents: 24351
diff changeset
    42
#include "runtime/atomic.inline.hpp"
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
    43
#include "runtime/biasedLocking.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    44
#include "runtime/frame.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    45
#include "runtime/handles.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    46
#include "runtime/interfaceSupport.hpp"
24351
61b33cc6d3cf 8042195: Introduce umbrella header orderAccess.inline.hpp.
goetz
parents: 24348
diff changeset
    47
#include "runtime/orderAccess.inline.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    48
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    49
#include "runtime/threadCritical.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6271
diff changeset
    50
#include "utilities/exceptions.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
// no precompiled headers
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
#ifdef CC_INTERP
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
 * USELABELS - If using GCC, then use labels for the opcode dispatching
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
 * rather -then a switch statement. This improves performance because it
28650
772aaab2582f 8059606: Enable per-method usage of CompileThresholdScaling (per-method compilation thresholds)
zmajo
parents: 26705
diff changeset
    58
 * gives us the opportunity to have the instructions that calculate the
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
 * next opcode to jump to be intermixed with the rest of the instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
 * that implement the opcode (see UPDATE_PC_AND_TOS_AND_CONTINUE macro).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
#undef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
#ifdef __GNUC__
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
   ASSERT signifies debugging. It is much easier to step thru bytecodes if we
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
   don't use the computed goto approach.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
#ifndef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
#define USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
#undef CASE
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
#define CASE(opcode) opc ## opcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
#define DEFAULT opc_default
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
#define CASE(opcode) case Bytecodes:: opcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
#define DEFAULT default
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
 * PREFETCH_OPCCODE - Some compilers do better if you prefetch the next
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
 * opcode before going back to the top of the while loop, rather then having
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
 * the top of the while loop handle it. This provides a better opportunity
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
 * for instruction scheduling. Some compilers just do this prefetch
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
 * automatically. Some actually end up with worse performance if you
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
 * force the prefetch. Solaris gcc seems to do better, but cc does worse.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
#undef PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
#define PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
  Interpreter safepoint: it is expected that the interpreter will have no live
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
  handles of its own creation live at an interpreter safepoint. Therefore we
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
  run a HandleMarkCleaner and trash all handles allocated in the call chain
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  since the JavaCalls::call_helper invocation that initiated the chain.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  There really shouldn't be any handles remaining to trash but this is cheap
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  in relation to a safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#define SAFEPOINT                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
    if ( SafepointSynchronize::is_synchronizing()) {                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
        {                                                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
          /* zap freed handles rather than GC'ing them */                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
          HandleMarkCleaner __hmc(THREAD);                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
        }                                                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
        CALL_VM(SafepointSynchronize::block(THREAD), handle_exception);           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
 * VM_JAVA_ERROR - Macro for throwing a java exception from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
 * the interpreter loop. Should really be a CALL_VM but there
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
 * is no entry point to do the transition to vm so we just
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
 * do it by hand here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
 */
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   116
#define VM_JAVA_ERROR_NO_JUMP(name, msg, note_a_trap)                             \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    DECACHE_STATE();                                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
    SET_LAST_JAVA_FRAME();                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    {                                                                             \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   120
       InterpreterRuntime::note_a_trap(THREAD, istate->method(), BCI());          \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
       ThreadInVMfromJava trans(THREAD);                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
       Exceptions::_throw_msg(THREAD, __FILE__, __LINE__, name, msg);             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    }                                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    RESET_LAST_JAVA_FRAME();                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
    CACHE_STATE();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   127
// Normal throw of a java error.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   128
#define VM_JAVA_ERROR(name, msg, note_a_trap)                                     \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   129
    VM_JAVA_ERROR_NO_JUMP(name, msg, note_a_trap)                                 \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
    goto handle_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
#ifdef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
#define DO_UPDATE_INSTRUCTION_COUNT(opcode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
#define DO_UPDATE_INSTRUCTION_COUNT(opcode)                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
{                                                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    BytecodeCounter::_counter_value++;                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    BytecodeHistogram::_counters[(Bytecodes::Code)opcode]++;                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    if (StopInterpreterAt && StopInterpreterAt == BytecodeCounter::_counter_value) os::breakpoint(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    if (TraceBytecodes) {                                                                            \
37152
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 35928
diff changeset
   141
      CALL_VM((void)InterpreterRuntime::trace_bytecode(THREAD, 0,                    \
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 35928
diff changeset
   142
                                        topOfStack[Interpreter::expr_index_at(1)],   \
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 35928
diff changeset
   143
                                        topOfStack[Interpreter::expr_index_at(2)]),  \
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 35928
diff changeset
   144
                                        handle_exception);                           \
29e68f1d35bb 8152065: TraceBytecodes breaks the interpreter expression stack
coleenp
parents: 35928
diff changeset
   145
    }                                                                                \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
#undef DEBUGGER_SINGLE_STEP_NOTIFY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
/* NOTE: (kbr) This macro must be called AFTER the PC has been
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
   incremented. JvmtiExport::at_single_stepping_point() may cause a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
   breakpoint opcode to get inserted at the current PC to allow the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
   debugger to coalesce single-step events.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
   As a result if we call at_single_stepping_point() we refetch opcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
   to get the current opcode. This will override any other prefetching
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
   that might have occurred.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
#define DEBUGGER_SINGLE_STEP_NOTIFY()                                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
{                                                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
      if (_jvmti_interp_events) {                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
        if (JvmtiExport::should_post_single_step()) {                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
          DECACHE_STATE();                                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
          SET_LAST_JAVA_FRAME();                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
          ThreadInVMfromJava trans(THREAD);                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
          JvmtiExport::at_single_stepping_point(THREAD,                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
                                          istate->method(),                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
                                          pc);                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
          RESET_LAST_JAVA_FRAME();                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
          CACHE_STATE();                                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
          if (THREAD->pop_frame_pending() &&                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
              !THREAD->pop_frame_in_process()) {                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
            goto handle_Pop_Frame;                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
          }                                                                      \
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   176
          if (THREAD->jvmti_thread_state() &&                                    \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   177
              THREAD->jvmti_thread_state()->is_earlyret_pending()) {             \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   178
            goto handle_Early_Return;                                            \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   179
          }                                                                      \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
          opcode = *pc;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
        }                                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
      }                                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
#define DEBUGGER_SINGLE_STEP_NOTIFY()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
 * CONTINUE - Macro for executing the next opcode.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
#undef CONTINUE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
// Have to do this dispatch this way in C++ because otherwise gcc complains about crossing an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
// initialization (which is is the initialization of the table pointer...)
1896
cce23a9ff495 6791168: Fix invalid code in bytecodeInterpreter that can cause gcc ICE
coleenp
parents: 670
diff changeset
   195
#define DISPATCH(opcode) goto *(void*)dispatch_table[opcode]
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
#define CONTINUE {                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
        opcode = *pc;                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
        DO_UPDATE_INSTRUCTION_COUNT(opcode);    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
        DEBUGGER_SINGLE_STEP_NOTIFY();          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
        DISPATCH(opcode);                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
#ifdef PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
#define CONTINUE {                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
        opcode = *pc;                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
        DO_UPDATE_INSTRUCTION_COUNT(opcode);    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
        DEBUGGER_SINGLE_STEP_NOTIFY();          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
        continue;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
#define CONTINUE {                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
        DO_UPDATE_INSTRUCTION_COUNT(opcode);    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
        DEBUGGER_SINGLE_STEP_NOTIFY();          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
        continue;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
#define UPDATE_PC(opsize) {pc += opsize; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
 * UPDATE_PC_AND_TOS - Macro for updating the pc and topOfStack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
#undef UPDATE_PC_AND_TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
#define UPDATE_PC_AND_TOS(opsize, stack) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
    {pc += opsize; MORE_STACK(stack); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
 * UPDATE_PC_AND_TOS_AND_CONTINUE - Macro for updating the pc and topOfStack,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
 * and executing the next opcode. It's somewhat similar to the combination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
 * of UPDATE_PC_AND_TOS and CONTINUE, but with some minor optimizations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
#undef UPDATE_PC_AND_TOS_AND_CONTINUE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
#define UPDATE_PC_AND_TOS_AND_CONTINUE(opsize, stack) {         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
        pc += opsize; opcode = *pc; MORE_STACK(stack);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
        DO_UPDATE_INSTRUCTION_COUNT(opcode);                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
        DEBUGGER_SINGLE_STEP_NOTIFY();                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
        DISPATCH(opcode);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
#define UPDATE_PC_AND_CONTINUE(opsize) {                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
        pc += opsize; opcode = *pc;                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
        DO_UPDATE_INSTRUCTION_COUNT(opcode);                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
        DEBUGGER_SINGLE_STEP_NOTIFY();                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
        DISPATCH(opcode);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
#ifdef PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
#define UPDATE_PC_AND_TOS_AND_CONTINUE(opsize, stack) {         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
        pc += opsize; opcode = *pc; MORE_STACK(stack);          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
        DO_UPDATE_INSTRUCTION_COUNT(opcode);                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
        DEBUGGER_SINGLE_STEP_NOTIFY();                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
        goto do_continue;                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
#define UPDATE_PC_AND_CONTINUE(opsize) {                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
        pc += opsize; opcode = *pc;                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
        DO_UPDATE_INSTRUCTION_COUNT(opcode);                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
        DEBUGGER_SINGLE_STEP_NOTIFY();                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
        goto do_continue;                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
#define UPDATE_PC_AND_TOS_AND_CONTINUE(opsize, stack) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
        pc += opsize; MORE_STACK(stack);                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
        DO_UPDATE_INSTRUCTION_COUNT(opcode);            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
        DEBUGGER_SINGLE_STEP_NOTIFY();                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
        goto do_continue;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
#define UPDATE_PC_AND_CONTINUE(opsize) {                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
        pc += opsize;                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
        DO_UPDATE_INSTRUCTION_COUNT(opcode);            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
        DEBUGGER_SINGLE_STEP_NOTIFY();                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
        goto do_continue;                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
#endif /* PREFETCH_OPCCODE */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
#endif /* USELABELS */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
// About to call a new method, update the save the adjusted pc and return to frame manager
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
#define UPDATE_PC_AND_RETURN(opsize)  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
   DECACHE_TOS();                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
   istate->set_bcp(pc+opsize);        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
   return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
#define METHOD istate->method()
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   288
#define GET_METHOD_COUNTERS(res)    \
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   289
  res = METHOD->method_counters();  \
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   290
  if (res == NULL) {                \
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   291
    CALL_VM(res = InterpreterRuntime::build_method_counters(THREAD, METHOD), handle_exception); \
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   292
  }
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   293
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
#define OSR_REQUEST(res, branch_pc) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
            CALL_VM(res=InterpreterRuntime::frequency_counter_overflow(THREAD, branch_pc), handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
 * For those opcodes that need to have a GC point on a backwards branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
// Backedge counting is kind of strange. The asm interpreter will increment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
// the backedge counter as a separate counter but it does it's comparisons
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
// to the sum (scaled) of invocation counter and backedge count to make
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
// a decision. Seems kind of odd to sum them together like that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
// skip is delta from current bcp/bci for target, branch_pc is pre-branch bcp
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
#define DO_BACKEDGE_CHECKS(skip, branch_pc)                                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
    if ((skip) <= 0) {                                                                              \
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   310
      MethodCounters* mcs;                                                                          \
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   311
      GET_METHOD_COUNTERS(mcs);                                                                     \
4448
d6ec2737186c 6896043: first round of zero fixes
twisti
parents: 4013
diff changeset
   312
      if (UseLoopCounter) {                                                                         \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
        bool do_OSR = UseOnStackReplacement;                                                        \
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   314
        mcs->backedge_counter()->increment();                                                       \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   315
        if (ProfileInterpreter) {                                                                   \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   316
          BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);                                   \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   317
          /* Check for overflow against MDO count. */                                               \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   318
          do_OSR = do_OSR                                                                           \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   319
            && (mdo_last_branch_taken_count >= (uint)InvocationCounter::InterpreterBackwardBranchLimit)\
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   320
            /* When ProfileInterpreter is on, the backedge_count comes     */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   321
            /* from the methodDataOop, which value does not get reset on   */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   322
            /* the call to frequency_counter_overflow(). To avoid          */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   323
            /* excessive calls to the overflow routine while the method is */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   324
            /* being compiled, add a second test to make sure the overflow */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   325
            /* function is called only once every overflow_frequency.      */                       \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   326
            && (!(mdo_last_branch_taken_count & 1023));                                             \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   327
        } else {                                                                                    \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   328
          /* check for overflow of backedge counter */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   329
          do_OSR = do_OSR                                                                           \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   330
            && mcs->invocation_counter()->reached_InvocationLimit(mcs->backedge_counter());         \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   331
        }                                                                                           \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
        if (do_OSR) {                                                                               \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   333
          nmethod* osr_nmethod;                                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
          OSR_REQUEST(osr_nmethod, branch_pc);                                                      \
26705
fca1785e7084 8048721: -XX:+PrintCompilation prints negative bci for non entrant OSR methods
thartmann
parents: 26142
diff changeset
   335
          if (osr_nmethod != NULL && osr_nmethod->is_in_use()) {                                    \
22833
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   336
            intptr_t* buf;                                                                          \
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   337
            /* Call OSR migration with last java frame only, no checks. */                          \
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   338
            CALL_VM_NAKED_LJF(buf=SharedRuntime::OSR_migration_begin(THREAD));                      \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
            istate->set_msg(do_osr);                                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
            istate->set_osr_buf((address)buf);                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
            istate->set_osr_entry(osr_nmethod->osr_entry());                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
            return;                                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
          }                                                                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
        }                                                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
      }  /* UseCompiler ... */                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
      SAFEPOINT;                                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
 * For those opcodes that need to have a GC point on a backwards branch
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
 * Macros for caching and flushing the interpreter state. Some local
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
 * variables need to be flushed out to the frame before we do certain
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
 * things (like pushing frames or becomming gc safe) and some need to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
 * be recached later (like after popping a frame). We could use one
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
 * macro to cache or decache everything, but this would be less then
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
 * optimal because we don't always need to cache or decache everything
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
 * because some things we know are already cached or decached.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
#undef DECACHE_TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
#undef CACHE_TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
#undef CACHE_PREV_TOS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
#define DECACHE_TOS()    istate->set_stack(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
#define CACHE_TOS()      topOfStack = (intptr_t *)istate->stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
#undef DECACHE_PC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
#undef CACHE_PC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
#define DECACHE_PC()    istate->set_bcp(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
#define CACHE_PC()      pc = istate->bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
#define CACHE_CP()      cp = istate->constants();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
#define CACHE_LOCALS()  locals = istate->locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
#undef CACHE_FRAME
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
#define CACHE_FRAME()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   378
// BCI() returns the current bytecode-index.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   379
#undef  BCI
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   380
#define BCI()           ((int)(intptr_t)(pc - (intptr_t)istate->method()->code_base()))
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   381
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
 * CHECK_NULL - Macro for throwing a NullPointerException if the object
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
 * passed is a null ref.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
 * On some architectures/platforms it should be possible to do this implicitly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
#undef CHECK_NULL
22878
206db4a4adcc 8035392: cppInterpreter: fix message of NPE
goetz
parents: 22872
diff changeset
   388
#define CHECK_NULL(obj_)                                                                         \
206db4a4adcc 8035392: cppInterpreter: fix message of NPE
goetz
parents: 22872
diff changeset
   389
        if ((obj_) == NULL) {                                                                    \
206db4a4adcc 8035392: cppInterpreter: fix message of NPE
goetz
parents: 22872
diff changeset
   390
          VM_JAVA_ERROR(vmSymbols::java_lang_NullPointerException(), NULL, note_nullCheck_trap); \
206db4a4adcc 8035392: cppInterpreter: fix message of NPE
goetz
parents: 22872
diff changeset
   391
        }                                                                                        \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   392
        VERIFY_OOP(obj_)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
#define VMdoubleConstZero() 0.0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
#define VMdoubleConstOne() 1.0
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
#define VMlongConstZero() (max_jlong-max_jlong)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
#define VMlongConstOne() ((max_jlong-max_jlong)+1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
 * Alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
#define VMalignWordUp(val)          (((uintptr_t)(val) + 3) & ~3)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
// Decache the interpreter state that interpreter modifies directly (i.e. GC is indirect mod)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
#define DECACHE_STATE() DECACHE_PC(); DECACHE_TOS();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
// Reload interpreter state after calling the VM or a possible GC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
#define CACHE_STATE()   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
        CACHE_TOS();    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
        CACHE_PC();     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
        CACHE_CP();     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
        CACHE_LOCALS();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
22833
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   414
// Call the VM with last java frame only.
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   415
#define CALL_VM_NAKED_LJF(func)                                    \
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   416
        DECACHE_STATE();                                           \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   417
        SET_LAST_JAVA_FRAME();                                     \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   418
        func;                                                      \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   419
        RESET_LAST_JAVA_FRAME();                                   \
22833
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   420
        CACHE_STATE();
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   421
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   422
// Call the VM. Don't check for pending exceptions.
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   423
#define CALL_VM_NOCHECK(func)                                      \
92d74f188f73 8024469: PPC64 (part 202): cppInterpreter: support for OSR.
goetz
parents: 22827
diff changeset
   424
        CALL_VM_NAKED_LJF(func)                                    \
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   425
        if (THREAD->pop_frame_pending() &&                         \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   426
            !THREAD->pop_frame_in_process()) {                     \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   427
          goto handle_Pop_Frame;                                   \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   428
        }                                                          \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   429
        if (THREAD->jvmti_thread_state() &&                        \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   430
            THREAD->jvmti_thread_state()->is_earlyret_pending()) { \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   431
          goto handle_Early_Return;                                \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   432
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
// Call the VM and check for pending exceptions
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   435
#define CALL_VM(func, label) {                                     \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   436
          CALL_VM_NOCHECK(func);                                   \
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   437
          if (THREAD->has_pending_exception()) goto label;         \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
 * BytecodeInterpreter::run(interpreterState istate)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
 * BytecodeInterpreter::runWithChecks(interpreterState istate)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
 * The real deal. This is where byte codes actually get interpreted.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
 * Basically it's a big while loop that iterates until we return from
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
 * the method passed in.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
 * The runWithChecks is used if JVMTI is enabled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
#if defined(VM_JVMTI)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
BytecodeInterpreter::runWithChecks(interpreterState istate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
BytecodeInterpreter::run(interpreterState istate) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
  // In order to simplify some tests based on switches set at runtime
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  // we invoke the interpreter a single time after switches are enabled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  // and set simpler to to test variables rather than method calls or complex
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  // boolean expressions.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
  static int initialized = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
  static int checkit = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
  static intptr_t* c_addr = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
  static intptr_t  c_value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
  if (checkit && *c_addr != c_value) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    os::breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  static bool _jvmti_interp_events = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
  static int _compiling;  // (UseCompiler || CountCompiledCalls)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  if (istate->_msg != initialize) {
24322
c2978d1578e3 8036956: remove EnableInvokeDynamic flag
anoll
parents: 23203
diff changeset
   480
    assert(labs(istate->_stack_base - istate->_stack_limit) == (istate->_method->max_stack() + 1), "bad stack limit");
6271
271ac8e393e4 6977640: Zero and Shark fixes
twisti
parents: 6176
diff changeset
   481
#ifndef SHARK
271ac8e393e4 6977640: Zero and Shark fixes
twisti
parents: 6176
diff changeset
   482
    IA32_ONLY(assert(istate->_stack_limit == istate->_thread->last_Java_sp() + 1, "wrong"));
271ac8e393e4 6977640: Zero and Shark fixes
twisti
parents: 6176
diff changeset
   483
#endif // !SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
  // Verify linkages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
  interpreterState l = istate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
  do {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
    assert(l == l->_self_link, "bad link");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
    l = l->_prev_link;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  } while (l != NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // Screwups with stack management usually cause us to overwrite istate
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // save a copy so we can verify it.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  interpreterState orig = istate;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
  register intptr_t*        topOfStack = (intptr_t *)istate->stack(); /* access with STACK macros */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
  register address          pc = istate->bcp();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
  register jubyte opcode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
  register intptr_t*        locals = istate->locals();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   500
  register ConstantPoolCache*    cp = istate->constants(); // method()->constants()->cache()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
#ifdef LOTS_OF_REGS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
  register JavaThread*      THREAD = istate->thread();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
#undef THREAD
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
#define THREAD istate->thread()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
  const static void* const opclabels_data[256] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
/* 0x00 */ &&opc_nop,     &&opc_aconst_null,&&opc_iconst_m1,&&opc_iconst_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
/* 0x04 */ &&opc_iconst_1,&&opc_iconst_2,   &&opc_iconst_3, &&opc_iconst_4,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
/* 0x08 */ &&opc_iconst_5,&&opc_lconst_0,   &&opc_lconst_1, &&opc_fconst_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
/* 0x0C */ &&opc_fconst_1,&&opc_fconst_2,   &&opc_dconst_0, &&opc_dconst_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
/* 0x10 */ &&opc_bipush, &&opc_sipush, &&opc_ldc,    &&opc_ldc_w,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
/* 0x14 */ &&opc_ldc2_w, &&opc_iload,  &&opc_lload,  &&opc_fload,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
/* 0x18 */ &&opc_dload,  &&opc_aload,  &&opc_iload_0,&&opc_iload_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
/* 0x1C */ &&opc_iload_2,&&opc_iload_3,&&opc_lload_0,&&opc_lload_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
/* 0x20 */ &&opc_lload_2,&&opc_lload_3,&&opc_fload_0,&&opc_fload_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
/* 0x24 */ &&opc_fload_2,&&opc_fload_3,&&opc_dload_0,&&opc_dload_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
/* 0x28 */ &&opc_dload_2,&&opc_dload_3,&&opc_aload_0,&&opc_aload_1,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
/* 0x2C */ &&opc_aload_2,&&opc_aload_3,&&opc_iaload, &&opc_laload,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
/* 0x30 */ &&opc_faload,  &&opc_daload,  &&opc_aaload,  &&opc_baload,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
/* 0x34 */ &&opc_caload,  &&opc_saload,  &&opc_istore,  &&opc_lstore,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
/* 0x38 */ &&opc_fstore,  &&opc_dstore,  &&opc_astore,  &&opc_istore_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
/* 0x3C */ &&opc_istore_1,&&opc_istore_2,&&opc_istore_3,&&opc_lstore_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
/* 0x40 */ &&opc_lstore_1,&&opc_lstore_2,&&opc_lstore_3,&&opc_fstore_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
/* 0x44 */ &&opc_fstore_1,&&opc_fstore_2,&&opc_fstore_3,&&opc_dstore_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
/* 0x48 */ &&opc_dstore_1,&&opc_dstore_2,&&opc_dstore_3,&&opc_astore_0,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
/* 0x4C */ &&opc_astore_1,&&opc_astore_2,&&opc_astore_3,&&opc_iastore,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
/* 0x50 */ &&opc_lastore,&&opc_fastore,&&opc_dastore,&&opc_aastore,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
/* 0x54 */ &&opc_bastore,&&opc_castore,&&opc_sastore,&&opc_pop,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
/* 0x58 */ &&opc_pop2,   &&opc_dup,    &&opc_dup_x1, &&opc_dup_x2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
/* 0x5C */ &&opc_dup2,   &&opc_dup2_x1,&&opc_dup2_x2,&&opc_swap,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
/* 0x60 */ &&opc_iadd,&&opc_ladd,&&opc_fadd,&&opc_dadd,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
/* 0x64 */ &&opc_isub,&&opc_lsub,&&opc_fsub,&&opc_dsub,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
/* 0x68 */ &&opc_imul,&&opc_lmul,&&opc_fmul,&&opc_dmul,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
/* 0x6C */ &&opc_idiv,&&opc_ldiv,&&opc_fdiv,&&opc_ddiv,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
/* 0x70 */ &&opc_irem, &&opc_lrem, &&opc_frem,&&opc_drem,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
/* 0x74 */ &&opc_ineg, &&opc_lneg, &&opc_fneg,&&opc_dneg,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
/* 0x78 */ &&opc_ishl, &&opc_lshl, &&opc_ishr,&&opc_lshr,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
/* 0x7C */ &&opc_iushr,&&opc_lushr,&&opc_iand,&&opc_land,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
/* 0x80 */ &&opc_ior, &&opc_lor,&&opc_ixor,&&opc_lxor,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
/* 0x84 */ &&opc_iinc,&&opc_i2l,&&opc_i2f, &&opc_i2d,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
/* 0x88 */ &&opc_l2i, &&opc_l2f,&&opc_l2d, &&opc_f2i,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
/* 0x8C */ &&opc_f2l, &&opc_f2d,&&opc_d2i, &&opc_d2l,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
/* 0x90 */ &&opc_d2f,  &&opc_i2b,  &&opc_i2c,  &&opc_i2s,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
/* 0x94 */ &&opc_lcmp, &&opc_fcmpl,&&opc_fcmpg,&&opc_dcmpl,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
/* 0x98 */ &&opc_dcmpg,&&opc_ifeq, &&opc_ifne, &&opc_iflt,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
/* 0x9C */ &&opc_ifge, &&opc_ifgt, &&opc_ifle, &&opc_if_icmpeq,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
/* 0xA0 */ &&opc_if_icmpne,&&opc_if_icmplt,&&opc_if_icmpge,  &&opc_if_icmpgt,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
/* 0xA4 */ &&opc_if_icmple,&&opc_if_acmpeq,&&opc_if_acmpne,  &&opc_goto,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
/* 0xA8 */ &&opc_jsr,      &&opc_ret,      &&opc_tableswitch,&&opc_lookupswitch,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
/* 0xAC */ &&opc_ireturn,  &&opc_lreturn,  &&opc_freturn,    &&opc_dreturn,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
/* 0xB0 */ &&opc_areturn,     &&opc_return,         &&opc_getstatic,    &&opc_putstatic,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
/* 0xB4 */ &&opc_getfield,    &&opc_putfield,       &&opc_invokevirtual,&&opc_invokespecial,
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
   567
/* 0xB8 */ &&opc_invokestatic,&&opc_invokeinterface,&&opc_invokedynamic,&&opc_new,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
/* 0xBC */ &&opc_newarray,    &&opc_anewarray,      &&opc_arraylength,  &&opc_athrow,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
/* 0xC0 */ &&opc_checkcast,   &&opc_instanceof,     &&opc_monitorenter, &&opc_monitorexit,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
/* 0xC4 */ &&opc_wide,        &&opc_multianewarray, &&opc_ifnull,       &&opc_ifnonnull,
370
33ba64c16c1f 6688137: c++ interpreter fails on 64bit sparc
sgoldman
parents: 1
diff changeset
   572
/* 0xC8 */ &&opc_goto_w,      &&opc_jsr_w,          &&opc_breakpoint,   &&opc_default,
33ba64c16c1f 6688137: c++ interpreter fails on 64bit sparc
sgoldman
parents: 1
diff changeset
   573
/* 0xCC */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
33ba64c16c1f 6688137: c++ interpreter fails on 64bit sparc
sgoldman
parents: 1
diff changeset
   574
33ba64c16c1f 6688137: c++ interpreter fails on 64bit sparc
sgoldman
parents: 1
diff changeset
   575
/* 0xD0 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
/* 0xD4 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
/* 0xD8 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
/* 0xDC */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
30117
cce2cdac56dc 8074345: Enable RewriteBytecodes when VM runs with CDS
minqi
parents: 29468
diff changeset
   580
/* 0xE0 */ &&opc_default,     &&opc_default,        &&opc_default,         &&opc_default,
cce2cdac56dc 8074345: Enable RewriteBytecodes when VM runs with CDS
minqi
parents: 29468
diff changeset
   581
/* 0xE4 */ &&opc_default,     &&opc_fast_aldc,      &&opc_fast_aldc_w,     &&opc_return_register_finalizer,
30126
89b8253271bd 8076181: bytecodeInterpreter.cpp refers to unknown labels.
sgehwolf
parents: 30117
diff changeset
   582
/* 0xE8 */ &&opc_invokehandle,&&opc_default,        &&opc_default,         &&opc_default,
89b8253271bd 8076181: bytecodeInterpreter.cpp refers to unknown labels.
sgehwolf
parents: 30117
diff changeset
   583
/* 0xEC */ &&opc_default,     &&opc_default,        &&opc_default,         &&opc_default,
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
/* 0xF0 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
/* 0xF4 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
/* 0xF8 */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
/* 0xFC */ &&opc_default,     &&opc_default,        &&opc_default,      &&opc_default
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  };
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
  register uintptr_t *dispatch_table = (uintptr_t*)&opclabels_data[0];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
#endif /* USELABELS */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // this will trigger a VERIFY_OOP on entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  if (istate->msg() != initialize && ! METHOD->is_static()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
    oop rcvr = LOCALS_OBJECT(0);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   597
    VERIFY_OOP(rcvr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
// #define HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
#ifdef HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  bool interesting = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
#endif // HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  /* QQQ this should be a stack method so we don't know actual direction */
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   606
  guarantee(istate->msg() == initialize ||
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
         topOfStack >= istate->stack_limit() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
         topOfStack < istate->stack_base(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
         "Stack top out of range");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   611
#ifdef CC_INTERP_PROFILE
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   612
  // MethodData's last branch taken count.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   613
  uint mdo_last_branch_taken_count = 0;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   614
#else
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   615
  const uint mdo_last_branch_taken_count = 0;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   616
#endif
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   617
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
  switch (istate->msg()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
    case initialize: {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   620
      if (initialized++) ShouldNotReachHere(); // Only one initialize call.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
      _compiling = (UseCompiler || CountCompiledCalls);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
      _jvmti_interp_events = JvmtiExport::can_post_interpreter_events();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
      return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
    break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    case method_entry: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
      THREAD->set_do_not_unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
      // count invocations
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
      assert(initialized, "Interpreter not initialized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      if (_compiling) {
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   633
        MethodCounters* mcs;
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   634
        GET_METHOD_COUNTERS(mcs);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
        if (ProfileInterpreter) {
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   636
          METHOD->increment_interpreter_invocation_count(THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
        }
17314
28fab19f2ccd 8013067: Zero builds are broken after 8010862.
jiangli
parents: 15475
diff changeset
   638
        mcs->invocation_counter()->increment();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   639
        if (mcs->invocation_counter()->reached_InvocationLimit(mcs->backedge_counter())) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   640
          CALL_VM((void)InterpreterRuntime::frequency_counter_overflow(THREAD, NULL), handle_exception);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   641
          // We no longer retry on a counter overflow.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
        }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   643
        // Get or create profile data. Check for pending (async) exceptions.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   644
        BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
        SAFEPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
      if ((istate->_stack_base - istate->_stack_limit) != istate->method()->max_stack() + 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
        // initialize
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
        os::breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
#ifdef HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
        char *method_name = istate->method()->name_and_sig_as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
        if (strstr(method_name, "runThese$TestRunner.run()V") != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
          tty->print_cr("entering: depth %d bci: %d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
                         (istate->_stack_base - istate->_stack),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
                         istate->_bcp - istate->_method->code_base());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
          interesting = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
#endif // HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   666
      // Lock method if synchronized.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
      if (METHOD->is_synchronized()) {
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   668
        // oop rcvr = locals[0].j.r;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   669
        oop rcvr;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   670
        if (METHOD->is_static()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   671
          rcvr = METHOD->constants()->pool_holder()->java_mirror();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   672
        } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   673
          rcvr = LOCALS_OBJECT(0);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   674
          VERIFY_OOP(rcvr);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   675
        }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   676
        // The initial monitor is ours for the taking.
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   677
        // Monitor not filled in frame manager any longer as this caused race condition with biased locking.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   678
        BasicObjectLock* mon = &istate->monitor_base()[-1];
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   679
        mon->set_obj(rcvr);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   680
        bool success = false;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   681
        uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   682
        markOop mark = rcvr->mark();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   683
        intptr_t hash = (intptr_t) markOopDesc::no_hash;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   684
        // Implies UseBiasedLocking.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   685
        if (mark->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   686
          uintptr_t thread_ident;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   687
          uintptr_t anticipated_bias_locking_value;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   688
          thread_ident = (uintptr_t)istate->thread();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   689
          anticipated_bias_locking_value =
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   690
            (((uintptr_t)rcvr->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) &
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   691
            ~((uintptr_t) markOopDesc::age_mask_in_place);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   692
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   693
          if (anticipated_bias_locking_value == 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   694
            // Already biased towards this thread, nothing to do.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   695
            if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   696
              (* BiasedLocking::biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   697
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   698
            success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   699
          } else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   700
            // Try to revoke bias.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   701
            markOop header = rcvr->klass()->prototype_header();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   702
            if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   703
              header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   704
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   705
            if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   706
              if (PrintBiasedLockingStatistics)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   707
                (*BiasedLocking::revoked_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   708
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   709
          } else if ((anticipated_bias_locking_value & epoch_mask_in_place) != 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   710
            // Try to rebias.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   711
            markOop new_header = (markOop) ( (intptr_t) rcvr->klass()->prototype_header() | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   712
            if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   713
              new_header = new_header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   714
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   715
            if (Atomic::cmpxchg_ptr((void*)new_header, rcvr->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   716
              if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   717
                (* BiasedLocking::rebiased_lock_entry_count_addr())++;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
            } else {
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   720
              CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   721
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   722
            success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   723
          } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   724
            // Try to bias towards thread in case object is anonymously biased.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   725
            markOop header = (markOop) ((uintptr_t) mark &
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   726
                                        ((uintptr_t)markOopDesc::biased_lock_mask_in_place |
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   727
                                         (uintptr_t)markOopDesc::age_mask_in_place | epoch_mask_in_place));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   728
            if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   729
              header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   730
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   731
            markOop new_header = (markOop) ((uintptr_t) header | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   732
            // Debugging hint.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   733
            DEBUG_ONLY(mon->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   734
            if (Atomic::cmpxchg_ptr((void*)new_header, rcvr->mark_addr(), header) == header) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   735
              if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   736
                (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   737
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   738
            } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   739
              CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   740
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   741
            success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   742
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   743
        }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   744
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   745
        // Traditional lightweight locking.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   746
        if (!success) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   747
          markOop displaced = rcvr->mark()->set_unlocked();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   748
          mon->lock()->set_displaced_header(displaced);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   749
          bool call_vm = UseHeavyMonitors;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   750
          if (call_vm || Atomic::cmpxchg_ptr(mon, rcvr->mark_addr(), displaced) != displaced) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   751
            // Is it simple recursive case?
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   752
            if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   753
              mon->lock()->set_displaced_header(NULL);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   754
            } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   755
              CALL_VM(InterpreterRuntime::monitorenter(THREAD, mon), handle_exception);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
          }
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   758
        }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
      THREAD->clr_do_not_unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
      // Notify jvmti
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
      if (_jvmti_interp_events) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
        // Whenever JVMTI puts a thread in interp_only_mode, method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
        // entry/exit events are sent for that thread to track stack depth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
        if (THREAD->is_interp_only_mode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
          CALL_VM(InterpreterRuntime::post_method_entry(THREAD),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
                  handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
    case popping_frame: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
      // returned from a java call to pop the frame, restart the call
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
      // clear the message so we don't confuse ourselves later
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
      assert(THREAD->pop_frame_in_process(), "wrong frame pop state");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
      istate->set_msg(no_request);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   782
      if (_compiling) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   783
        // Set MDX back to the ProfileData of the invoke bytecode that will be
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   784
        // restarted.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   785
        SET_MDX(NULL);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   786
        BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   787
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
      THREAD->clr_pop_frame_in_process();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    case method_resume: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
      if ((istate->_stack_base - istate->_stack_limit) != istate->method()->max_stack() + 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
        // resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
        os::breakpoint();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
#ifdef HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
        ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
        char *method_name = istate->method()->name_and_sig_as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
        if (strstr(method_name, "runThese$TestRunner.run()V") != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
          tty->print_cr("resume: depth %d bci: %d",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
                         (istate->_stack_base - istate->_stack) ,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
                         istate->_bcp - istate->_method->code_base());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
          interesting = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
#endif // HACK
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
      // returned from a java call, continue executing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
      if (THREAD->pop_frame_pending() && !THREAD->pop_frame_in_process()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
        goto handle_Pop_Frame;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
      }
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   813
      if (THREAD->jvmti_thread_state() &&
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   814
          THREAD->jvmti_thread_state()->is_earlyret_pending()) {
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   815
        goto handle_Early_Return;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
   816
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
      if (THREAD->has_pending_exception()) goto handle_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
      // Update the pc by the saved amount of the invoke bytecode size
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
      UPDATE_PC(istate->bcp_advance());
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   821
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   822
      if (_compiling) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   823
        // Get or create profile data. Check for pending (async) exceptions.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   824
        BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   825
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
    case deopt_resume2: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
      // Returned from an opcode that will reexecute. Deopt was
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
      // a result of a PopFrame request.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
      //
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   833
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   834
      if (_compiling) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   835
        // Get or create profile data. Check for pending (async) exceptions.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   836
        BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   837
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
    case deopt_resume: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
      // Returned from an opcode that has completed. The stack has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
      // the result all we need to do is skip across the bytecode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
      // and continue (assuming there is no exception pending)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
      // compute continuation length
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
      // Note: it is possible to deopt at a return_register_finalizer opcode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
      // because this requires entering the vm to do the registering. While the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
      // opcode is complete we can't advance because there are no more opcodes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
      // much like trying to deopt at a poll return. In that has we simply
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
      // get out of here
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
      //
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7407
diff changeset
   854
      if ( Bytecodes::code_at(METHOD, pc) == Bytecodes::_return_register_finalizer) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
        // this will do the right thing even if an exception is pending.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
        goto handle_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
      }
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7407
diff changeset
   858
      UPDATE_PC(Bytecodes::length_at(METHOD, pc));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
      if (THREAD->has_pending_exception()) goto handle_exception;
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   860
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   861
      if (_compiling) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   862
        // Get or create profile data. Check for pending (async) exceptions.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   863
        BI_PROFILE_GET_OR_CREATE_METHOD_DATA(handle_exception);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
   864
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
    case got_monitors: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
      // continue locking now that we have a monitor to use
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
      // we expect to find newly allocated monitor at the "top" of the monitor stack.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
      oop lockee = STACK_OBJECT(-1);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
   871
      VERIFY_OOP(lockee);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
      // derefing's lockee ought to provoke implicit null check
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
      // find a free monitor
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
      BasicObjectLock* entry = (BasicObjectLock*) istate->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
      assert(entry->obj() == NULL, "Frame manager didn't allocate the monitor");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
      entry->set_obj(lockee);
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   877
      bool success = false;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   878
      uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   879
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   880
      markOop mark = lockee->mark();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   881
      intptr_t hash = (intptr_t) markOopDesc::no_hash;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   882
      // implies UseBiasedLocking
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   883
      if (mark->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   884
        uintptr_t thread_ident;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   885
        uintptr_t anticipated_bias_locking_value;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   886
        thread_ident = (uintptr_t)istate->thread();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   887
        anticipated_bias_locking_value =
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   888
          (((uintptr_t)lockee->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) &
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   889
          ~((uintptr_t) markOopDesc::age_mask_in_place);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   890
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   891
        if  (anticipated_bias_locking_value == 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   892
          // already biased towards this thread, nothing to do
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   893
          if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   894
            (* BiasedLocking::biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   895
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   896
          success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   897
        } else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   898
          // try revoke bias
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   899
          markOop header = lockee->klass()->prototype_header();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   900
          if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   901
            header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   902
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   903
          if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   904
            if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   905
              (*BiasedLocking::revoked_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   906
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   907
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   908
        } else if ((anticipated_bias_locking_value & epoch_mask_in_place) !=0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   909
          // try rebias
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   910
          markOop new_header = (markOop) ( (intptr_t) lockee->klass()->prototype_header() | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   911
          if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   912
                new_header = new_header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   913
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   914
          if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   915
            if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   916
              (* BiasedLocking::rebiased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   917
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   918
          } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   919
            CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   920
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   921
          success = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
        } else {
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   923
          // try to bias towards thread in case object is anonymously biased
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   924
          markOop header = (markOop) ((uintptr_t) mark & ((uintptr_t)markOopDesc::biased_lock_mask_in_place |
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   925
                                                          (uintptr_t)markOopDesc::age_mask_in_place | epoch_mask_in_place));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   926
          if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   927
            header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   928
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   929
          markOop new_header = (markOop) ((uintptr_t) header | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   930
          // debugging hint
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   931
          DEBUG_ONLY(entry->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   932
          if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), header) == header) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   933
            if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   934
              (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   935
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   936
          } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   937
            CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   938
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   939
          success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   940
        }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   941
      }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   942
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   943
      // traditional lightweight locking
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   944
      if (!success) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   945
        markOop displaced = lockee->mark()->set_unlocked();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   946
        entry->lock()->set_displaced_header(displaced);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   947
        bool call_vm = UseHeavyMonitors;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   948
        if (call_vm || Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   949
          // Is it simple recursive case?
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   950
          if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   951
            entry->lock()->set_displaced_header(NULL);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   952
          } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   953
            CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
   954
          }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
      UPDATE_PC_AND_TOS(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
    default: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
      fatal("Unexpected message from frame manager");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
run:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
  DO_UPDATE_INSTRUCTION_COUNT(*pc)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
  DEBUGGER_SINGLE_STEP_NOTIFY();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
#ifdef PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
  opcode = *pc;  /* prefetch first opcode */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
#ifndef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
  while (1)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
#ifndef PREFETCH_OPCCODE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
      opcode = *pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
      // Seems like this happens twice per opcode. At worst this is only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
      // need at entry to the loop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
      // DEBUGGER_SINGLE_STEP_NOTIFY();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
      /* Using this labels avoids double breakpoints when quickening and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
       * when returing from transition frames.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
       */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
  opcode_switch:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
      assert(istate == orig, "Corrupted istate");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
      /* QQQ Hmm this has knowledge of direction, ought to be a stack method */
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
      assert(topOfStack >= istate->stack_limit(), "Stack overrun");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
      assert(topOfStack < istate->stack_base(), "Stack underrun");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
      DISPATCH(opcode);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
#else
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
      switch (opcode)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
      CASE(_nop):
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
          /* Push miscellaneous constants onto the stack. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
      CASE(_aconst_null):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1004
          SET_STACK_OBJECT(NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
#undef  OPC_CONST_n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
#define OPC_CONST_n(opcode, const_type, value)                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
      CASE(opcode):                                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
          SET_STACK_ ## const_type(value, 0);                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
          OPC_CONST_n(_iconst_m1,   INT,       -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
          OPC_CONST_n(_iconst_0,    INT,        0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
          OPC_CONST_n(_iconst_1,    INT,        1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
          OPC_CONST_n(_iconst_2,    INT,        2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
          OPC_CONST_n(_iconst_3,    INT,        3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
          OPC_CONST_n(_iconst_4,    INT,        4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
          OPC_CONST_n(_iconst_5,    INT,        5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
          OPC_CONST_n(_fconst_0,    FLOAT,      0.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
          OPC_CONST_n(_fconst_1,    FLOAT,      1.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
          OPC_CONST_n(_fconst_2,    FLOAT,      2.0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
#undef  OPC_CONST2_n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
#define OPC_CONST2_n(opcname, value, key, kind)                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
      CASE(_##opcname):                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
      {                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
          SET_STACK_ ## kind(VM##key##Const##value(), 1);               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
         OPC_CONST2_n(dconst_0, Zero, double, DOUBLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
         OPC_CONST2_n(dconst_1, One,  double, DOUBLE);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
         OPC_CONST2_n(lconst_0, Zero, long, LONG);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
         OPC_CONST2_n(lconst_1, One,  long, LONG);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
         /* Load constant from constant pool: */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
          /* Push a 1-byte signed integer value onto the stack. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
      CASE(_bipush):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
          SET_STACK_INT((jbyte)(pc[1]), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
          /* Push a 2-byte signed integer constant onto the stack. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
      CASE(_sipush):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
          SET_STACK_INT((int16_t)Bytes::get_Java_u2(pc + 1), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
          UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
          /* load from local variable */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
      CASE(_aload):
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1051
          VERIFY_OOP(LOCALS_OBJECT(pc[1]));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
          SET_STACK_OBJECT(LOCALS_OBJECT(pc[1]), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
      CASE(_iload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
      CASE(_fload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
          SET_STACK_SLOT(LOCALS_SLOT(pc[1]), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
      CASE(_lload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
          SET_STACK_LONG_FROM_ADDR(LOCALS_LONG_AT(pc[1]), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
      CASE(_dload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
          SET_STACK_DOUBLE_FROM_ADDR(LOCALS_DOUBLE_AT(pc[1]), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
#undef  OPC_LOAD_n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
#define OPC_LOAD_n(num)                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
      CASE(_aload_##num):                                               \
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1071
          VERIFY_OOP(LOCALS_OBJECT(num));                               \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
          SET_STACK_OBJECT(LOCALS_OBJECT(num), 0);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
                                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
      CASE(_iload_##num):                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
      CASE(_fload_##num):                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
          SET_STACK_SLOT(LOCALS_SLOT(num), 0);                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
                                                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
      CASE(_lload_##num):                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
          SET_STACK_LONG_FROM_ADDR(LOCALS_LONG_AT(num), 1);             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
      CASE(_dload_##num):                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
          SET_STACK_DOUBLE_FROM_ADDR(LOCALS_DOUBLE_AT(num), 1);         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
          OPC_LOAD_n(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
          OPC_LOAD_n(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
          OPC_LOAD_n(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
          OPC_LOAD_n(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
          /* store to a local variable */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
      CASE(_astore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
          astore(topOfStack, -1, locals, pc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
      CASE(_istore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
      CASE(_fstore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
          SET_LOCALS_SLOT(STACK_SLOT(-1), pc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
      CASE(_lstore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
          SET_LOCALS_LONG(STACK_LONG(-1), pc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
      CASE(_dstore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
          SET_LOCALS_DOUBLE(STACK_DOUBLE(-1), pc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
          UPDATE_PC_AND_TOS_AND_CONTINUE(2, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
      CASE(_wide): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
          uint16_t reg = Bytes::get_Java_u2(pc + 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
          opcode = pc[1];
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1115
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1116
          // Wide and it's sub-bytecode are counted as separate instructions. If we
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1117
          // don't account for this here, the bytecode trace skips the next bytecode.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1118
          DO_UPDATE_INSTRUCTION_COUNT(opcode);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1119
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
          switch(opcode) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
              case Bytecodes::_aload:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1122
                  VERIFY_OOP(LOCALS_OBJECT(reg));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
                  SET_STACK_OBJECT(LOCALS_OBJECT(reg), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
              case Bytecodes::_iload:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
              case Bytecodes::_fload:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
                  SET_STACK_SLOT(LOCALS_SLOT(reg), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
              case Bytecodes::_lload:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
                  SET_STACK_LONG_FROM_ADDR(LOCALS_LONG_AT(reg), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
              case Bytecodes::_dload:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
                  SET_STACK_DOUBLE_FROM_ADDR(LOCALS_LONG_AT(reg), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
              case Bytecodes::_astore:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
                  astore(topOfStack, -1, locals, reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
              case Bytecodes::_istore:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
              case Bytecodes::_fstore:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
                  SET_LOCALS_SLOT(STACK_SLOT(-1), reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
              case Bytecodes::_lstore:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
                  SET_LOCALS_LONG(STACK_LONG(-1), reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
              case Bytecodes::_dstore:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
                  SET_LOCALS_DOUBLE(STACK_DOUBLE(-1), reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
                  UPDATE_PC_AND_TOS_AND_CONTINUE(4, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
              case Bytecodes::_iinc: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
                  int16_t offset = (int16_t)Bytes::get_Java_u2(pc+4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
                  // Be nice to see what this generates.... QQQ
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
                  SET_LOCALS_INT(LOCALS_INT(reg) + offset, reg);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
                  UPDATE_PC_AND_CONTINUE(6);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
              case Bytecodes::_ret:
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1163
                  // Profile ret.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1164
                  BI_PROFILE_UPDATE_RET(/*bci=*/((int)(intptr_t)(LOCALS_ADDR(reg))));
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1165
                  // Now, update the pc.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
                  pc = istate->method()->code_base() + (intptr_t)(LOCALS_ADDR(reg));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
                  UPDATE_PC_AND_CONTINUE(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
              default:
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1169
                  VM_JAVA_ERROR(vmSymbols::java_lang_InternalError(), "undefined opcode", note_no_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
#undef  OPC_STORE_n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
#define OPC_STORE_n(num)                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
      CASE(_astore_##num):                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
          astore(topOfStack, -1, locals, num);                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
      CASE(_istore_##num):                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
      CASE(_fstore_##num):                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
          SET_LOCALS_SLOT(STACK_SLOT(-1), num);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
          OPC_STORE_n(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
          OPC_STORE_n(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
          OPC_STORE_n(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
          OPC_STORE_n(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
#undef  OPC_DSTORE_n
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
#define OPC_DSTORE_n(num)                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
      CASE(_dstore_##num):                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
          SET_LOCALS_DOUBLE(STACK_DOUBLE(-1), num);                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2);                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
      CASE(_lstore_##num):                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
          SET_LOCALS_LONG(STACK_LONG(-1), num);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
          OPC_DSTORE_n(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
          OPC_DSTORE_n(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
          OPC_DSTORE_n(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
          OPC_DSTORE_n(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
          /* stack pop, dup, and insert opcodes */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
      CASE(_pop):                /* Discard the top item on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1210
      CASE(_pop2):               /* Discard the top 2 items on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
      CASE(_dup):               /* Duplicate the top item on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
          dup(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1218
      CASE(_dup2):              /* Duplicate the top 2 items on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
          dup2(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
      CASE(_dup_x1):    /* insert top word two down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
          dup_x1(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
      CASE(_dup_x2):    /* insert top word three down  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
          dup_x2(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
      CASE(_dup2_x1):   /* insert top 2 slots three down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
          dup2_x1(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
      CASE(_dup2_x2):   /* insert top 2 slots four down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
          dup2_x2(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
      CASE(_swap): {        /* swap top two elements on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
          swap(topOfStack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
          /* Perform various binary integer operations */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
#undef  OPC_INT_BINARY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
#define OPC_INT_BINARY(opcname, opname, test)                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
      CASE(_i##opcname):                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
          if (test && (STACK_INT(-1) == 0)) {                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
              VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1250
                            "/ by zero", note_div0Check_trap);          \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
          }                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
          SET_STACK_INT(VMint##opname(STACK_INT(-2),                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
                                      STACK_INT(-1)),                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
                                      -2);                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1256
      CASE(_l##opcname):                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1257
      {                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1258
          if (test) {                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1259
            jlong l1 = STACK_LONG(-1);                                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1260
            if (VMlongEqz(l1)) {                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1261
              VM_JAVA_ERROR(vmSymbols::java_lang_ArithmeticException(), \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1262
                            "/ by long zero", note_div0Check_trap);     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1263
            }                                                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1264
          }                                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1265
          /* First long at (-1,-2) next long at (-3,-4) */              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1266
          SET_STACK_LONG(VMlong##opname(STACK_LONG(-3),                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1267
                                        STACK_LONG(-1)),                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1268
                                        -3);                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1269
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2);                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1270
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1271
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1272
      OPC_INT_BINARY(add, Add, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1273
      OPC_INT_BINARY(sub, Sub, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1274
      OPC_INT_BINARY(mul, Mul, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1275
      OPC_INT_BINARY(and, And, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1276
      OPC_INT_BINARY(or,  Or,  0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1277
      OPC_INT_BINARY(xor, Xor, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1278
      OPC_INT_BINARY(div, Div, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1279
      OPC_INT_BINARY(rem, Rem, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1280
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1281
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1282
      /* Perform various binary floating number operations */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1283
      /* On some machine/platforms/compilers div zero check can be implicit */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1284
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1285
#undef  OPC_FLOAT_BINARY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1286
#define OPC_FLOAT_BINARY(opcname, opname)                                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1287
      CASE(_d##opcname): {                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1288
          SET_STACK_DOUBLE(VMdouble##opname(STACK_DOUBLE(-3),              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1289
                                            STACK_DOUBLE(-1)),             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1290
                                            -3);                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1291
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -2);                           \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1292
      }                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1293
      CASE(_f##opcname):                                                   \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1294
          SET_STACK_FLOAT(VMfloat##opname(STACK_FLOAT(-2),                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1295
                                          STACK_FLOAT(-1)),                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1296
                                          -2);                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1297
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1298
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1299
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1300
     OPC_FLOAT_BINARY(add, Add);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1301
     OPC_FLOAT_BINARY(sub, Sub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1302
     OPC_FLOAT_BINARY(mul, Mul);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1303
     OPC_FLOAT_BINARY(div, Div);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1304
     OPC_FLOAT_BINARY(rem, Rem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1305
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1306
      /* Shift operations
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1307
       * Shift left int and long: ishl, lshl
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1308
       * Logical shift right int and long w/zero extension: iushr, lushr
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1309
       * Arithmetic shift right int and long w/sign extension: ishr, lshr
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1310
       */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1311
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1312
#undef  OPC_SHIFT_BINARY
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1313
#define OPC_SHIFT_BINARY(opcname, opname)                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1314
      CASE(_i##opcname):                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1315
         SET_STACK_INT(VMint##opname(STACK_INT(-2),                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1316
                                     STACK_INT(-1)),                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1317
                                     -2);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1318
         UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1319
      CASE(_l##opcname):                                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1320
      {                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1321
         SET_STACK_LONG(VMlong##opname(STACK_LONG(-2),                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1322
                                       STACK_INT(-1)),                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1323
                                       -2);                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1324
         UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1325
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1326
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1327
      OPC_SHIFT_BINARY(shl, Shl);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1328
      OPC_SHIFT_BINARY(shr, Shr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1329
      OPC_SHIFT_BINARY(ushr, Ushr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1330
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1331
     /* Increment local variable by constant */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1332
      CASE(_iinc):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1333
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1334
          // locals[pc[1]].j.i += (jbyte)(pc[2]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1335
          SET_LOCALS_INT(LOCALS_INT(pc[1]) + (jbyte)(pc[2]), pc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1336
          UPDATE_PC_AND_CONTINUE(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1337
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1338
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1339
     /* negate the value on the top of the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1340
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1341
      CASE(_ineg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1342
         SET_STACK_INT(VMintNeg(STACK_INT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1343
         UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1344
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1345
      CASE(_fneg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1346
         SET_STACK_FLOAT(VMfloatNeg(STACK_FLOAT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1347
         UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1348
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1349
      CASE(_lneg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1350
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1351
         SET_STACK_LONG(VMlongNeg(STACK_LONG(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1352
         UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1353
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1354
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1355
      CASE(_dneg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1356
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1357
         SET_STACK_DOUBLE(VMdoubleNeg(STACK_DOUBLE(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1358
         UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1359
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1360
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1361
      /* Conversion operations */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1363
      CASE(_i2f):       /* convert top of stack int to float */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1364
         SET_STACK_FLOAT(VMint2Float(STACK_INT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1365
         UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1366
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1367
      CASE(_i2l):       /* convert top of stack int to long */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1368
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1369
          // this is ugly QQQ
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1370
          jlong r = VMint2Long(STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1371
          MORE_STACK(-1); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1372
          SET_STACK_LONG(r, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1373
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1374
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1375
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1376
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1377
      CASE(_i2d):       /* convert top of stack int to double */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1378
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1379
          // this is ugly QQQ (why cast to jlong?? )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1380
          jdouble r = (jlong)STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1381
          MORE_STACK(-1); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1382
          SET_STACK_DOUBLE(r, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1383
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1384
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1385
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1386
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1387
      CASE(_l2i):       /* convert top of stack long to int */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1388
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1389
          jint r = VMlong2Int(STACK_LONG(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1390
          MORE_STACK(-2); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1391
          SET_STACK_INT(r, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1392
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1393
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1394
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1395
      CASE(_l2f):   /* convert top of stack long to float */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1396
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1397
          jlong r = STACK_LONG(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1398
          MORE_STACK(-2); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1399
          SET_STACK_FLOAT(VMlong2Float(r), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1400
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1401
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1402
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1403
      CASE(_l2d):       /* convert top of stack long to double */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1404
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1405
          jlong r = STACK_LONG(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1406
          MORE_STACK(-2); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1407
          SET_STACK_DOUBLE(VMlong2Double(r), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1408
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1409
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1410
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1411
      CASE(_f2i):  /* Convert top of stack float to int */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1412
          SET_STACK_INT(SharedRuntime::f2i(STACK_FLOAT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1413
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1414
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1415
      CASE(_f2l):  /* convert top of stack float to long */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1416
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1417
          jlong r = SharedRuntime::f2l(STACK_FLOAT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1418
          MORE_STACK(-1); // POP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1419
          SET_STACK_LONG(r, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1420
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1421
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1422
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1423
      CASE(_f2d):  /* convert top of stack float to double */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1424
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1425
          jfloat f;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1426
          jdouble r;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1427
          f = STACK_FLOAT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1428
          r = (jdouble) f;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1429
          MORE_STACK(-1); // POP
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1430
          SET_STACK_DOUBLE(r, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1431
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1432
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1433
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1434
      CASE(_d2i): /* convert top of stack double to int */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1435
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1436
          jint r1 = SharedRuntime::d2i(STACK_DOUBLE(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1437
          MORE_STACK(-2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1438
          SET_STACK_INT(r1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1439
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1440
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1441
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1442
      CASE(_d2f): /* convert top of stack double to float */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1443
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1444
          jfloat r1 = VMdouble2Float(STACK_DOUBLE(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1445
          MORE_STACK(-2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1446
          SET_STACK_FLOAT(r1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1447
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1448
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1449
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1450
      CASE(_d2l): /* convert top of stack double to long */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1451
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1452
          jlong r1 = SharedRuntime::d2l(STACK_DOUBLE(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1453
          MORE_STACK(-2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1454
          SET_STACK_LONG(r1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1455
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1456
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1457
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1458
      CASE(_i2b):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1459
          SET_STACK_INT(VMint2Byte(STACK_INT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1460
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1461
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1462
      CASE(_i2c):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1463
          SET_STACK_INT(VMint2Char(STACK_INT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1464
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1465
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1466
      CASE(_i2s):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1467
          SET_STACK_INT(VMint2Short(STACK_INT(-1)), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1468
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1469
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1470
      /* comparison operators */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1471
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1472
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1473
#define COMPARISON_OP(name, comparison)                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1474
      CASE(_if_icmp##name): {                                                \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1475
          const bool cmp = (STACK_INT(-2) comparison STACK_INT(-1));         \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1476
          int skip = cmp                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1477
                      ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3;             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1478
          address branch_pc = pc;                                            \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1479
          /* Profile branch. */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1480
          BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1481
          UPDATE_PC_AND_TOS(skip, -2);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1482
          DO_BACKEDGE_CHECKS(skip, branch_pc);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1483
          CONTINUE;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1484
      }                                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1485
      CASE(_if##name): {                                                     \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1486
          const bool cmp = (STACK_INT(-1) comparison 0);                     \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1487
          int skip = cmp                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1488
                      ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3;             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1489
          address branch_pc = pc;                                            \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1490
          /* Profile branch. */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1491
          BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1492
          UPDATE_PC_AND_TOS(skip, -1);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1493
          DO_BACKEDGE_CHECKS(skip, branch_pc);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1494
          CONTINUE;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1495
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1496
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1497
#define COMPARISON_OP2(name, comparison)                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1498
      COMPARISON_OP(name, comparison)                                        \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1499
      CASE(_if_acmp##name): {                                                \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1500
          const bool cmp = (STACK_OBJECT(-2) comparison STACK_OBJECT(-1));   \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1501
          int skip = cmp                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1502
                       ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3;            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1503
          address branch_pc = pc;                                            \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1504
          /* Profile branch. */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1505
          BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1506
          UPDATE_PC_AND_TOS(skip, -2);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1507
          DO_BACKEDGE_CHECKS(skip, branch_pc);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1508
          CONTINUE;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1509
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1510
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1511
#define NULL_COMPARISON_NOT_OP(name)                                         \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1512
      CASE(_if##name): {                                                     \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1513
          const bool cmp = (!(STACK_OBJECT(-1) == NULL));                    \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1514
          int skip = cmp                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1515
                      ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3;             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1516
          address branch_pc = pc;                                            \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1517
          /* Profile branch. */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1518
          BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1519
          UPDATE_PC_AND_TOS(skip, -1);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1520
          DO_BACKEDGE_CHECKS(skip, branch_pc);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1521
          CONTINUE;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1522
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1523
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1524
#define NULL_COMPARISON_OP(name)                                             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1525
      CASE(_if##name): {                                                     \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1526
          const bool cmp = ((STACK_OBJECT(-1) == NULL));                     \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1527
          int skip = cmp                                                     \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1528
                      ? (int16_t)Bytes::get_Java_u2(pc + 1) : 3;             \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1529
          address branch_pc = pc;                                            \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1530
          /* Profile branch. */                                              \
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1531
          BI_PROFILE_UPDATE_BRANCH(/*is_taken=*/cmp);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1532
          UPDATE_PC_AND_TOS(skip, -1);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1533
          DO_BACKEDGE_CHECKS(skip, branch_pc);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1534
          CONTINUE;                                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1535
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1536
      COMPARISON_OP(lt, <);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1537
      COMPARISON_OP(gt, >);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1538
      COMPARISON_OP(le, <=);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1539
      COMPARISON_OP(ge, >=);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1540
      COMPARISON_OP2(eq, ==);  /* include ref comparison */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1541
      COMPARISON_OP2(ne, !=);  /* include ref comparison */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1542
      NULL_COMPARISON_OP(null);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1543
      NULL_COMPARISON_NOT_OP(nonnull);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1544
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1545
      /* Goto pc at specified offset in switch table. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1546
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1547
      CASE(_tableswitch): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1548
          jint* lpc  = (jint*)VMalignWordUp(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1549
          int32_t  key  = STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1550
          int32_t  low  = Bytes::get_Java_u4((address)&lpc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1551
          int32_t  high = Bytes::get_Java_u4((address)&lpc[2]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1552
          int32_t  skip;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1553
          key -= low;
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1554
          if (((uint32_t) key > (uint32_t)(high - low))) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1555
            key = -1;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1556
            skip = Bytes::get_Java_u4((address)&lpc[0]);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1557
          } else {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1558
            skip = Bytes::get_Java_u4((address)&lpc[key + 3]);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1559
          }
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1560
          // Profile switch.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1561
          BI_PROFILE_UPDATE_SWITCH(/*switch_index=*/key);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1562
          // Does this really need a full backedge check (osr)?
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1563
          address branch_pc = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1564
          UPDATE_PC_AND_TOS(skip, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1565
          DO_BACKEDGE_CHECKS(skip, branch_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1566
          CONTINUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1567
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1568
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1569
      /* Goto pc whose table entry matches specified key. */
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1570
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1571
      CASE(_lookupswitch): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1572
          jint* lpc  = (jint*)VMalignWordUp(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1573
          int32_t  key  = STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1574
          int32_t  skip = Bytes::get_Java_u4((address) lpc); /* default amount */
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1575
          // Remember index.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1576
          int      index = -1;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1577
          int      newindex = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1578
          int32_t  npairs = Bytes::get_Java_u4((address) &lpc[1]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1579
          while (--npairs >= 0) {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1580
            lpc += 2;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1581
            if (key == (int32_t)Bytes::get_Java_u4((address)lpc)) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1582
              skip = Bytes::get_Java_u4((address)&lpc[1]);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1583
              index = newindex;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1584
              break;
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1585
            }
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1586
            newindex += 1;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1587
          }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1588
          // Profile switch.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1589
          BI_PROFILE_UPDATE_SWITCH(/*switch_index=*/index);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1590
          address branch_pc = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1591
          UPDATE_PC_AND_TOS(skip, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1592
          DO_BACKEDGE_CHECKS(skip, branch_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1593
          CONTINUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1594
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1595
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1596
      CASE(_fcmpl):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1597
      CASE(_fcmpg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1598
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1599
          SET_STACK_INT(VMfloatCompare(STACK_FLOAT(-2),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1600
                                        STACK_FLOAT(-1),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1601
                                        (opcode == Bytecodes::_fcmpl ? -1 : 1)),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1602
                        -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1603
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1604
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1605
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1606
      CASE(_dcmpl):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1607
      CASE(_dcmpg):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1608
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1609
          int r = VMdoubleCompare(STACK_DOUBLE(-3),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1610
                                  STACK_DOUBLE(-1),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1611
                                  (opcode == Bytecodes::_dcmpl ? -1 : 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1612
          MORE_STACK(-4); // Pop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1613
          SET_STACK_INT(r, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1614
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1615
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1616
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1617
      CASE(_lcmp):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1618
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1619
          int r = VMlongCompare(STACK_LONG(-3), STACK_LONG(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1620
          MORE_STACK(-4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1621
          SET_STACK_INT(r, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1622
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1623
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1624
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1626
      /* Return from a method */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1627
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1628
      CASE(_areturn):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1629
      CASE(_ireturn):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1630
      CASE(_freturn):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1631
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1632
          // Allow a safepoint before returning to frame manager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1633
          SAFEPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1634
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1635
          goto handle_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1636
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1637
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1638
      CASE(_lreturn):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1639
      CASE(_dreturn):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1640
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1641
          // Allow a safepoint before returning to frame manager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1642
          SAFEPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1643
          goto handle_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1644
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1645
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1646
      CASE(_return_register_finalizer): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1647
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1648
          oop rcvr = LOCALS_OBJECT(0);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1649
          VERIFY_OOP(rcvr);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1650
          if (rcvr->klass()->has_finalizer()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1651
            CALL_VM(InterpreterRuntime::register_finalizer(THREAD, rcvr), handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1652
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1653
          goto handle_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1654
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1655
      CASE(_return): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1656
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1657
          // Allow a safepoint before returning to frame manager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1658
          SAFEPOINT;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1659
          goto handle_return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1660
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1661
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1662
      /* Array access byte-codes */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1663
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1664
      /* Every array access byte-code starts out like this */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1665
//        arrayOopDesc* arrObj = (arrayOopDesc*)STACK_OBJECT(arrayOff);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1666
#define ARRAY_INTRO(arrayOff)                                                  \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1667
      arrayOop arrObj = (arrayOop)STACK_OBJECT(arrayOff);                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1668
      jint     index  = STACK_INT(arrayOff + 1);                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1669
      char message[jintAsStringSize];                                          \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1670
      CHECK_NULL(arrObj);                                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1671
      if ((uint32_t)index >= (uint32_t)arrObj->length()) {                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1672
          sprintf(message, "%d", index);                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1673
          VM_JAVA_ERROR(vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), \
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1674
                        message, note_rangeCheck_trap);                        \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1675
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1676
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1677
      /* 32-bit loads. These handle conversion from < 32-bit types */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1678
#define ARRAY_LOADTO32(T, T2, format, stackRes, extra)                                \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1679
      {                                                                               \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1680
          ARRAY_INTRO(-2);                                                            \
18504
b116e46230d2 8019382: PPC64: Fix bytecodeInterpreter to compile with '-Wunused-value'
simonis
parents: 18451
diff changeset
  1681
          (void)extra;                                                                \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1682
          SET_ ## stackRes(*(T2 *)(((address) arrObj->base(T)) + index * sizeof(T2)), \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1683
                           -2);                                                       \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1684
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);                                      \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1685
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1686
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1687
      /* 64-bit loads */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1688
#define ARRAY_LOADTO64(T,T2, stackRes, extra)                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1689
      {                                                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1690
          ARRAY_INTRO(-2);                                                                 \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1691
          SET_ ## stackRes(*(T2 *)(((address) arrObj->base(T)) + index * sizeof(T2)), -1); \
18504
b116e46230d2 8019382: PPC64: Fix bytecodeInterpreter to compile with '-Wunused-value'
simonis
parents: 18451
diff changeset
  1692
          (void)extra;                                                                     \
b116e46230d2 8019382: PPC64: Fix bytecodeInterpreter to compile with '-Wunused-value'
simonis
parents: 18451
diff changeset
  1693
          UPDATE_PC_AND_CONTINUE(1);                                                       \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1694
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1695
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1696
      CASE(_iaload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1697
          ARRAY_LOADTO32(T_INT, jint,   "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1698
      CASE(_faload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1699
          ARRAY_LOADTO32(T_FLOAT, jfloat, "%f",   STACK_FLOAT, 0);
22815
fba9b7111615 8019518: PPC64 (part 103): cppInterpreter: implement support for compressed Oops
goetz
parents: 22814
diff changeset
  1700
      CASE(_aaload): {
fba9b7111615 8019518: PPC64 (part 103): cppInterpreter: implement support for compressed Oops
goetz
parents: 22814
diff changeset
  1701
          ARRAY_INTRO(-2);
fba9b7111615 8019518: PPC64 (part 103): cppInterpreter: implement support for compressed Oops
goetz
parents: 22814
diff changeset
  1702
          SET_STACK_OBJECT(((objArrayOop) arrObj)->obj_at(index), -2);
fba9b7111615 8019518: PPC64 (part 103): cppInterpreter: implement support for compressed Oops
goetz
parents: 22814
diff changeset
  1703
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
fba9b7111615 8019518: PPC64 (part 103): cppInterpreter: implement support for compressed Oops
goetz
parents: 22814
diff changeset
  1704
      }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1705
      CASE(_baload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1706
          ARRAY_LOADTO32(T_BYTE, jbyte,  "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1707
      CASE(_caload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1708
          ARRAY_LOADTO32(T_CHAR,  jchar, "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1709
      CASE(_saload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1710
          ARRAY_LOADTO32(T_SHORT, jshort, "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1711
      CASE(_laload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1712
          ARRAY_LOADTO64(T_LONG, jlong, STACK_LONG, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1713
      CASE(_daload):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1714
          ARRAY_LOADTO64(T_DOUBLE, jdouble, STACK_DOUBLE, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1715
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1716
      /* 32-bit stores. These handle conversion to < 32-bit types */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1717
#define ARRAY_STOREFROM32(T, T2, format, stackSrc, extra)                            \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1718
      {                                                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1719
          ARRAY_INTRO(-3);                                                           \
18504
b116e46230d2 8019382: PPC64: Fix bytecodeInterpreter to compile with '-Wunused-value'
simonis
parents: 18451
diff changeset
  1720
          (void)extra;                                                               \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1721
          *(T2 *)(((address) arrObj->base(T)) + index * sizeof(T2)) = stackSrc( -1); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1722
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -3);                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1723
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1724
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1725
      /* 64-bit stores */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1726
#define ARRAY_STOREFROM64(T, T2, stackSrc, extra)                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1727
      {                                                                              \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1728
          ARRAY_INTRO(-4);                                                           \
18504
b116e46230d2 8019382: PPC64: Fix bytecodeInterpreter to compile with '-Wunused-value'
simonis
parents: 18451
diff changeset
  1729
          (void)extra;                                                               \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1730
          *(T2 *)(((address) arrObj->base(T)) + index * sizeof(T2)) = stackSrc( -1); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1731
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -4);                                     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1732
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1733
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1734
      CASE(_iastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1735
          ARRAY_STOREFROM32(T_INT, jint,   "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1736
      CASE(_fastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1737
          ARRAY_STOREFROM32(T_FLOAT, jfloat, "%f",   STACK_FLOAT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1738
      /*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1739
       * This one looks different because of the assignability check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1740
       */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1741
      CASE(_aastore): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1742
          oop rhsObject = STACK_OBJECT(-1);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1743
          VERIFY_OOP(rhsObject);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1744
          ARRAY_INTRO( -3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1745
          // arrObj, index are set
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1746
          if (rhsObject != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1747
            /* Check assignability of rhsObject into arrObj */
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1748
            Klass* rhsKlass = rhsObject->klass(); // EBX (subclass)
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1749
            Klass* elemKlass = ObjArrayKlass::cast(arrObj->klass())->element_klass(); // superklass EAX
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1750
            //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1751
            // Check for compatibilty. This check must not GC!!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1752
            // Seems way more expensive now that we must dispatch
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1753
            //
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1754
            if (rhsKlass != elemKlass && !rhsKlass->is_subtype_of(elemKlass)) { // ebx->is...
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1755
              // Decrement counter if subtype check failed.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1756
              BI_PROFILE_SUBTYPECHECK_FAILED(rhsKlass);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1757
              VM_JAVA_ERROR(vmSymbols::java_lang_ArrayStoreException(), "", note_arrayCheck_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1758
            }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1759
            // Profile checkcast with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1760
            BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/false, rhsKlass);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1761
          } else {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1762
            // Profile checkcast with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  1763
            BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/true, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1764
          }
22849
b8670e920530 8028514: PPC64: Fix C++ Interpreter after '7195622: CheckUnhandledOops has limited usefulness now'
simonis
parents: 22836
diff changeset
  1765
          ((objArrayOop) arrObj)->obj_at_put(index, rhsObject);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1766
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1767
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1768
      CASE(_bastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1769
          ARRAY_STOREFROM32(T_BYTE, jbyte,  "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1770
      CASE(_castore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1771
          ARRAY_STOREFROM32(T_CHAR, jchar,  "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1772
      CASE(_sastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1773
          ARRAY_STOREFROM32(T_SHORT, jshort, "%d",   STACK_INT, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1774
      CASE(_lastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1775
          ARRAY_STOREFROM64(T_LONG, jlong, STACK_LONG, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1776
      CASE(_dastore):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1777
          ARRAY_STOREFROM64(T_DOUBLE, jdouble, STACK_DOUBLE, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1778
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1779
      CASE(_arraylength):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1780
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1781
          arrayOop ary = (arrayOop) STACK_OBJECT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1782
          CHECK_NULL(ary);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1783
          SET_STACK_INT(ary->length(), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1784
          UPDATE_PC_AND_CONTINUE(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1785
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1786
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1787
      /* monitorenter and monitorexit for locking/unlocking an object */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1788
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1789
      CASE(_monitorenter): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1790
        oop lockee = STACK_OBJECT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1791
        // derefing's lockee ought to provoke implicit null check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1792
        CHECK_NULL(lockee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1793
        // find a free monitor or one already allocated for this object
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1794
        // if we find a matching object then we need a new monitor
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1795
        // since this is recursive enter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1796
        BasicObjectLock* limit = istate->monitor_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1797
        BasicObjectLock* most_recent = (BasicObjectLock*) istate->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1798
        BasicObjectLock* entry = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1799
        while (most_recent != limit ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1800
          if (most_recent->obj() == NULL) entry = most_recent;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1801
          else if (most_recent->obj() == lockee) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1802
          most_recent++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1803
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1804
        if (entry != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1805
          entry->set_obj(lockee);
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1806
          int success = false;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1807
          uintptr_t epoch_mask_in_place = (uintptr_t)markOopDesc::epoch_mask_in_place;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1808
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1809
          markOop mark = lockee->mark();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1810
          intptr_t hash = (intptr_t) markOopDesc::no_hash;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1811
          // implies UseBiasedLocking
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1812
          if (mark->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1813
            uintptr_t thread_ident;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1814
            uintptr_t anticipated_bias_locking_value;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1815
            thread_ident = (uintptr_t)istate->thread();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1816
            anticipated_bias_locking_value =
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1817
              (((uintptr_t)lockee->klass()->prototype_header() | thread_ident) ^ (uintptr_t)mark) &
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1818
              ~((uintptr_t) markOopDesc::age_mask_in_place);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1819
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1820
            if  (anticipated_bias_locking_value == 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1821
              // already biased towards this thread, nothing to do
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1822
              if (PrintBiasedLockingStatistics) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1823
                (* BiasedLocking::biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1824
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1825
              success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1826
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1827
            else if ((anticipated_bias_locking_value & markOopDesc::biased_lock_mask_in_place) != 0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1828
              // try revoke bias
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1829
              markOop header = lockee->klass()->prototype_header();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1830
              if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1831
                header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1832
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1833
              if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1834
                if (PrintBiasedLockingStatistics)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1835
                  (*BiasedLocking::revoked_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1836
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1837
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1838
            else if ((anticipated_bias_locking_value & epoch_mask_in_place) !=0) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1839
              // try rebias
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1840
              markOop new_header = (markOop) ( (intptr_t) lockee->klass()->prototype_header() | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1841
              if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1842
                new_header = new_header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1843
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1844
              if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), mark) == mark) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1845
                if (PrintBiasedLockingStatistics)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1846
                  (* BiasedLocking::rebiased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1847
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1848
              else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1849
                CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1850
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1851
              success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1852
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1853
            else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1854
              // try to bias towards thread in case object is anonymously biased
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1855
              markOop header = (markOop) ((uintptr_t) mark & ((uintptr_t)markOopDesc::biased_lock_mask_in_place |
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1856
                                                              (uintptr_t)markOopDesc::age_mask_in_place |
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1857
                                                              epoch_mask_in_place));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1858
              if (hash != markOopDesc::no_hash) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1859
                header = header->copy_set_hash(hash);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1860
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1861
              markOop new_header = (markOop) ((uintptr_t) header | thread_ident);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1862
              // debugging hint
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1863
              DEBUG_ONLY(entry->lock()->set_displaced_header((markOop) (uintptr_t) 0xdeaddead);)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1864
              if (Atomic::cmpxchg_ptr((void*)new_header, lockee->mark_addr(), header) == header) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1865
                if (PrintBiasedLockingStatistics)
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1866
                  (* BiasedLocking::anonymously_biased_lock_entry_count_addr())++;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1867
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1868
              else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1869
                CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1870
              }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1871
              success = true;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1872
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1873
          }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1874
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1875
          // traditional lightweight locking
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1876
          if (!success) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1877
            markOop displaced = lockee->mark()->set_unlocked();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1878
            entry->lock()->set_displaced_header(displaced);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1879
            bool call_vm = UseHeavyMonitors;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1880
            if (call_vm || Atomic::cmpxchg_ptr(entry, lockee->mark_addr(), displaced) != displaced) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1881
              // Is it simple recursive case?
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1882
              if (!call_vm && THREAD->is_lock_owned((address) displaced->clear_lock_bits())) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1883
                entry->lock()->set_displaced_header(NULL);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1884
              } else {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1885
                CALL_VM(InterpreterRuntime::monitorenter(THREAD, entry), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1886
              }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1887
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1888
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1889
          UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1890
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1891
          istate->set_msg(more_monitors);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1892
          UPDATE_PC_AND_RETURN(0); // Re-execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1893
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1894
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1895
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1896
      CASE(_monitorexit): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1897
        oop lockee = STACK_OBJECT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1898
        CHECK_NULL(lockee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1899
        // derefing's lockee ought to provoke implicit null check
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1900
        // find our monitor slot
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1901
        BasicObjectLock* limit = istate->monitor_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1902
        BasicObjectLock* most_recent = (BasicObjectLock*) istate->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1903
        while (most_recent != limit ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1904
          if ((most_recent)->obj() == lockee) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1905
            BasicLock* lock = most_recent->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1906
            markOop header = lock->displaced_header();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1907
            most_recent->set_obj(NULL);
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1908
            if (!lockee->mark()->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1909
              bool call_vm = UseHeavyMonitors;
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1910
              // If it isn't recursive we either must swap old header or call the runtime
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1911
              if (header != NULL || call_vm) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1912
                if (call_vm || Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1913
                  // restore object for the slow case
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1914
                  most_recent->set_obj(lockee);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1915
                  CALL_VM(InterpreterRuntime::monitorexit(THREAD, most_recent), handle_exception);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  1916
                }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1917
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1918
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1919
            UPDATE_PC_AND_TOS_AND_CONTINUE(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1920
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1921
          most_recent++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1922
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1923
        // Need to throw illegal monitor state exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1924
        CALL_VM(InterpreterRuntime::throw_illegal_monitor_state_exception(THREAD), handle_exception);
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  1925
        ShouldNotReachHere();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1926
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1927
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1928
      /* All of the non-quick opcodes. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1929
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1930
      /* -Set clobbersCpIndex true if the quickened opcode clobbers the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1931
       *  constant pool index in the instruction.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1932
       */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1933
      CASE(_getfield):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1934
      CASE(_getstatic):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1935
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1936
          u2 index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1937
          ConstantPoolCacheEntry* cache;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1938
          index = Bytes::get_native_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1939
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1940
          // QQQ Need to make this as inlined as possible. Probably need to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1941
          // split all the bytecode cases out so c++ compiler has a chance
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1942
          // for constant prop to fold everything possible away.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1943
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1944
          cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1945
          if (!cache->is_resolved((Bytecodes::Code)opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  1946
            CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1947
                    handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1948
            cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1949
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1950
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1951
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1952
          if (_jvmti_interp_events) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1953
            int *count_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1954
            oop obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1955
            // Check to see if a field modification watch has been set
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1956
            // before we take the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1957
            count_addr = (int *)JvmtiExport::get_field_access_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1958
            if ( *count_addr > 0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1959
              if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1960
                obj = (oop)NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1961
              } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1962
                obj = (oop) STACK_OBJECT(-1);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1963
                VERIFY_OOP(obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1964
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1965
              CALL_VM(InterpreterRuntime::post_field_access(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1966
                                          obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1967
                                          cache),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1968
                                          handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1969
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1970
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1971
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1972
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1973
          oop obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1974
          if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) {
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  1975
            Klass* k = cache->f1_as_klass();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  1976
            obj = k->java_mirror();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1977
            MORE_STACK(1);  // Assume single slot push
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1978
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1979
            obj = (oop) STACK_OBJECT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1980
            CHECK_NULL(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1981
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1982
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1983
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1984
          // Now store the result on the stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1985
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1986
          TosState tos_type = cache->flag_state();
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  1987
          int field_offset = cache->f2_as_index();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1988
          if (cache->is_volatile()) {
22868
7f6eb436873b 8029101: PPC64 (part 211): ordering of Independent Reads of Independent Writes
goetz
parents: 22862
diff changeset
  1989
            if (support_IRIW_for_not_multiple_copy_atomic_cpu) {
7f6eb436873b 8029101: PPC64 (part 211): ordering of Independent Reads of Independent Writes
goetz
parents: 22862
diff changeset
  1990
              OrderAccess::fence();
7f6eb436873b 8029101: PPC64 (part 211): ordering of Independent Reads of Independent Writes
goetz
parents: 22862
diff changeset
  1991
            }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1992
            if (tos_type == atos) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  1993
              VERIFY_OOP(obj->obj_field_acquire(field_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1994
              SET_STACK_OBJECT(obj->obj_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1995
            } else if (tos_type == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1996
              SET_STACK_INT(obj->int_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1997
            } else if (tos_type == ltos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1998
              SET_STACK_LONG(obj->long_field_acquire(field_offset), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1999
              MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2000
            } else if (tos_type == btos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2001
              SET_STACK_INT(obj->byte_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2002
            } else if (tos_type == ctos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2003
              SET_STACK_INT(obj->char_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2004
            } else if (tos_type == stos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2005
              SET_STACK_INT(obj->short_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2006
            } else if (tos_type == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2007
              SET_STACK_FLOAT(obj->float_field_acquire(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2008
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2009
              SET_STACK_DOUBLE(obj->double_field_acquire(field_offset), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2010
              MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2011
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2012
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2013
            if (tos_type == atos) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2014
              VERIFY_OOP(obj->obj_field(field_offset));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2015
              SET_STACK_OBJECT(obj->obj_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2016
            } else if (tos_type == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2017
              SET_STACK_INT(obj->int_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2018
            } else if (tos_type == ltos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2019
              SET_STACK_LONG(obj->long_field(field_offset), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2020
              MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2021
            } else if (tos_type == btos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2022
              SET_STACK_INT(obj->byte_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2023
            } else if (tos_type == ctos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2024
              SET_STACK_INT(obj->char_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2025
            } else if (tos_type == stos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2026
              SET_STACK_INT(obj->short_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2027
            } else if (tos_type == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2028
              SET_STACK_FLOAT(obj->float_field(field_offset), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2029
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2030
              SET_STACK_DOUBLE(obj->double_field(field_offset), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2031
              MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2032
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2033
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2034
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2035
          UPDATE_PC_AND_CONTINUE(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2036
         }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2037
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2038
      CASE(_putfield):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2039
      CASE(_putstatic):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2040
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2041
          u2 index = Bytes::get_native_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2042
          ConstantPoolCacheEntry* cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2043
          if (!cache->is_resolved((Bytecodes::Code)opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  2044
            CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2045
                    handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2046
            cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2047
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2049
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2050
          if (_jvmti_interp_events) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2051
            int *count_addr;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2052
            oop obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2053
            // Check to see if a field modification watch has been set
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2054
            // before we take the time to call into the VM.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2055
            count_addr = (int *)JvmtiExport::get_field_modification_count_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2056
            if ( *count_addr > 0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2057
              if ((Bytecodes::Code)opcode == Bytecodes::_putstatic) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2058
                obj = (oop)NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2059
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2060
              else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2061
                if (cache->is_long() || cache->is_double()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2062
                  obj = (oop) STACK_OBJECT(-3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2063
                } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2064
                  obj = (oop) STACK_OBJECT(-2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2065
                }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2066
                VERIFY_OOP(obj);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2067
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2068
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2069
              CALL_VM(InterpreterRuntime::post_field_modification(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2070
                                          obj,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2071
                                          cache,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2072
                                          (jvalue *)STACK_SLOT(-1)),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2073
                                          handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2074
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2075
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2076
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2078
          // QQQ Need to make this as inlined as possible. Probably need to split all the bytecode cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2079
          // out so c++ compiler has a chance for constant prop to fold everything possible away.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2080
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2081
          oop obj;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2082
          int count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2083
          TosState tos_type = cache->flag_state();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2084
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2085
          count = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2086
          if (tos_type == ltos || tos_type == dtos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2087
            --count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2088
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2089
          if ((Bytecodes::Code)opcode == Bytecodes::_putstatic) {
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2090
            Klass* k = cache->f1_as_klass();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2091
            obj = k->java_mirror();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2092
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2093
            --count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2094
            obj = (oop) STACK_OBJECT(count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2095
            CHECK_NULL(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2096
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2097
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2098
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2099
          // Now store the result
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2100
          //
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2101
          int field_offset = cache->f2_as_index();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2102
          if (cache->is_volatile()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2103
            if (tos_type == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2104
              obj->release_int_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2105
            } else if (tos_type == atos) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2106
              VERIFY_OOP(STACK_OBJECT(-1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2107
              obj->release_obj_field_put(field_offset, STACK_OBJECT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2108
            } else if (tos_type == btos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2109
              obj->release_byte_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2110
            } else if (tos_type == ltos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2111
              obj->release_long_field_put(field_offset, STACK_LONG(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2112
            } else if (tos_type == ctos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2113
              obj->release_char_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2114
            } else if (tos_type == stos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2115
              obj->release_short_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2116
            } else if (tos_type == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2117
              obj->release_float_field_put(field_offset, STACK_FLOAT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2118
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2119
              obj->release_double_field_put(field_offset, STACK_DOUBLE(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2120
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2121
            OrderAccess::storeload();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2122
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2123
            if (tos_type == itos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2124
              obj->int_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2125
            } else if (tos_type == atos) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2126
              VERIFY_OOP(STACK_OBJECT(-1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2127
              obj->obj_field_put(field_offset, STACK_OBJECT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2128
            } else if (tos_type == btos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2129
              obj->byte_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2130
            } else if (tos_type == ltos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2131
              obj->long_field_put(field_offset, STACK_LONG(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2132
            } else if (tos_type == ctos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2133
              obj->char_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2134
            } else if (tos_type == stos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2135
              obj->short_field_put(field_offset, STACK_INT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2136
            } else if (tos_type == ftos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2137
              obj->float_field_put(field_offset, STACK_FLOAT(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2138
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2139
              obj->double_field_put(field_offset, STACK_DOUBLE(-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2140
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2141
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2142
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2143
          UPDATE_PC_AND_TOS_AND_CONTINUE(3, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2144
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2146
      CASE(_new): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2147
        u2 index = Bytes::get_Java_u2(pc+1);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2148
        ConstantPool* constants = istate->method()->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2149
        if (!constants->tag_at(index).is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2150
          // Make sure klass is initialized and doesn't have a finalizer
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2151
          Klass* entry = constants->slot_at(index).get_klass();
33602
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33208
diff changeset
  2152
          InstanceKlass* ik = InstanceKlass::cast(entry);
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33208
diff changeset
  2153
          if (ik->is_initialized() && ik->can_be_fastpath_allocated() ) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2154
            size_t obj_size = ik->size_helper();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2155
            oop result = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2156
            // If the TLAB isn't pre-zeroed then we'll have to do it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2157
            bool need_zero = !ZeroTLAB;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2158
            if (UseTLAB) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2159
              result = (oop) THREAD->tlab().allocate(obj_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2160
            }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2161
            // Disable non-TLAB-based fast-path, because profiling requires that all
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2162
            // allocations go through InterpreterRuntime::_new() if THREAD->tlab().allocate
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2163
            // returns NULL.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2164
#ifndef CC_INTERP_PROFILE
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2165
            if (result == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2166
              need_zero = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2167
              // Try allocate in shared eden
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2168
            retry:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2169
              HeapWord* compare_to = *Universe::heap()->top_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2170
              HeapWord* new_top = compare_to + obj_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2171
              if (new_top <= *Universe::heap()->end_addr()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2172
                if (Atomic::cmpxchg_ptr(new_top, Universe::heap()->top_addr(), compare_to) != compare_to) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2173
                  goto retry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2174
                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2175
                result = (oop) compare_to;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2176
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2177
            }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2178
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2179
            if (result != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2180
              // Initialize object (if nonzero size and need) and then the header
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2181
              if (need_zero ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2182
                HeapWord* to_zero = (HeapWord*) result + sizeof(oopDesc) / oopSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2183
                obj_size -= sizeof(oopDesc) / oopSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2184
                if (obj_size > 0 ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2185
                  memset(to_zero, 0, obj_size * HeapWordSize);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2186
                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2187
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2188
              if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2189
                result->set_mark(ik->prototype_header());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2190
              } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2191
                result->set_mark(markOopDesc::prototype());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2192
              }
593
803947e176bd 6696264: assert("narrow oop can never be zero") for GCBasher & ParNewGC
coleenp
parents: 370
diff changeset
  2193
              result->set_klass_gap(0);
33749
6b67a05d2fcc 8141138: Zero fails to build
sgehwolf
parents: 33611
diff changeset
  2194
              result->set_klass(ik);
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2195
              // Must prevent reordering of stores for object initialization
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2196
              // with stores that publish the new object.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2197
              OrderAccess::storestore();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2198
              SET_STACK_OBJECT(result, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2199
              UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2200
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2201
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2202
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2203
        // Slow case allocation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2204
        CALL_VM(InterpreterRuntime::_new(THREAD, METHOD->constants(), index),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2205
                handle_exception);
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2206
        // Must prevent reordering of stores for object initialization
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2207
        // with stores that publish the new object.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2208
        OrderAccess::storestore();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2209
        SET_STACK_OBJECT(THREAD->vm_result(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2210
        THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2211
        UPDATE_PC_AND_TOS_AND_CONTINUE(3, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2212
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2213
      CASE(_anewarray): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2214
        u2 index = Bytes::get_Java_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2215
        jint size = STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2216
        CALL_VM(InterpreterRuntime::anewarray(THREAD, METHOD->constants(), index, size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2217
                handle_exception);
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2218
        // Must prevent reordering of stores for object initialization
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2219
        // with stores that publish the new object.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2220
        OrderAccess::storestore();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2221
        SET_STACK_OBJECT(THREAD->vm_result(), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2222
        THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2223
        UPDATE_PC_AND_CONTINUE(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2224
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2225
      CASE(_multianewarray): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2226
        jint dims = *(pc+3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2227
        jint size = STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2228
        // stack grows down, dimensions are up!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2229
        jint *dimarray =
5422
6a9d399e7401 6949423: remove tagged stack interpreter for Zero
twisti
parents: 5419
diff changeset
  2230
                   (jint*)&topOfStack[dims * Interpreter::stackElementWords+
6a9d399e7401 6949423: remove tagged stack interpreter for Zero
twisti
parents: 5419
diff changeset
  2231
                                      Interpreter::stackElementWords-1];
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2232
        //adjust pointer to start of stack element
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2233
        CALL_VM(InterpreterRuntime::multianewarray(THREAD, dimarray),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2234
                handle_exception);
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2235
        // Must prevent reordering of stores for object initialization
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2236
        // with stores that publish the new object.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2237
        OrderAccess::storestore();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2238
        SET_STACK_OBJECT(THREAD->vm_result(), -dims);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2239
        THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2240
        UPDATE_PC_AND_TOS_AND_CONTINUE(4, -(dims-1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2241
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2242
      CASE(_checkcast):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2243
          if (STACK_OBJECT(-1) != NULL) {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2244
            VERIFY_OOP(STACK_OBJECT(-1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2245
            u2 index = Bytes::get_Java_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2246
            // Constant pool may have actual klass or unresolved klass. If it is
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2247
            // unresolved we must resolve it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2248
            if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2249
              CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2250
            }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2251
            Klass* klassOf = (Klass*) METHOD->constants()->slot_at(index).get_klass();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2252
            Klass* objKlass = STACK_OBJECT(-1)->klass(); // ebx
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2253
            //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2254
            // Check for compatibilty. This check must not GC!!
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2255
            // Seems way more expensive now that we must dispatch.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2256
            //
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2257
            if (objKlass != klassOf && !objKlass->is_subtype_of(klassOf)) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2258
              // Decrement counter at checkcast.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2259
              BI_PROFILE_SUBTYPECHECK_FAILED(objKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2260
              ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2261
              char* message = SharedRuntime::generate_class_cast_message(
36508
5f9eee6b383b 8142968: Module System implementation
alanb
parents: 35928
diff changeset
  2262
                objKlass, klassOf);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2263
              VM_JAVA_ERROR(vmSymbols::java_lang_ClassCastException(), message, note_classCheck_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2264
            }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2265
            // Profile checkcast with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2266
            BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/false, objKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2267
          } else {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2268
            // Profile checkcast with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2269
            BI_PROFILE_UPDATE_CHECKCAST(/*null_seen=*/true, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2270
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2271
          UPDATE_PC_AND_CONTINUE(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2272
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2273
      CASE(_instanceof):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2274
          if (STACK_OBJECT(-1) == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2275
            SET_STACK_INT(0, -1);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2276
            // Profile instanceof with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2277
            BI_PROFILE_UPDATE_INSTANCEOF(/*null_seen=*/true, NULL);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2278
          } else {
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  2279
            VERIFY_OOP(STACK_OBJECT(-1));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2280
            u2 index = Bytes::get_Java_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2281
            // Constant pool may have actual klass or unresolved klass. If it is
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2282
            // unresolved we must resolve it.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2283
            if (METHOD->constants()->tag_at(index).is_unresolved_klass()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2284
              CALL_VM(InterpreterRuntime::quicken_io_cc(THREAD), handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2285
            }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2286
            Klass* klassOf = (Klass*) METHOD->constants()->slot_at(index).get_klass();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2287
            Klass* objKlass = STACK_OBJECT(-1)->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2288
            //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2289
            // Check for compatibilty. This check must not GC!!
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2290
            // Seems way more expensive now that we must dispatch.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2291
            //
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2292
            if ( objKlass == klassOf || objKlass->is_subtype_of(klassOf)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2293
              SET_STACK_INT(1, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2294
            } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2295
              SET_STACK_INT(0, -1);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2296
              // Decrement counter at checkcast.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2297
              BI_PROFILE_SUBTYPECHECK_FAILED(objKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2298
            }
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2299
            // Profile instanceof with null_seen and receiver.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2300
            BI_PROFILE_UPDATE_INSTANCEOF(/*null_seen=*/false, objKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2301
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2302
          UPDATE_PC_AND_CONTINUE(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2303
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2304
      CASE(_ldc_w):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2305
      CASE(_ldc):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2306
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2307
          u2 index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2308
          bool wide = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2309
          int incr = 2; // frequent case
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2310
          if (opcode == Bytecodes::_ldc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2311
            index = pc[1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2312
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2313
            index = Bytes::get_Java_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2314
            incr = 3;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2315
            wide = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2316
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2317
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2318
          ConstantPool* constants = METHOD->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2319
          switch (constants->tag_at(index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2320
          case JVM_CONSTANT_Integer:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2321
            SET_STACK_INT(constants->int_at(index), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2322
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2323
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2324
          case JVM_CONSTANT_Float:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2325
            SET_STACK_FLOAT(constants->float_at(index), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2326
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2327
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2328
          case JVM_CONSTANT_String:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2329
            {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2330
              oop result = constants->resolved_references()->obj_at(index);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2331
              if (result == NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2332
                CALL_VM(InterpreterRuntime::resolve_ldc(THREAD, (Bytecodes::Code) opcode), handle_exception);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2333
                SET_STACK_OBJECT(THREAD->vm_result(), 0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2334
                THREAD->set_vm_result(NULL);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2335
              } else {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2336
                VERIFY_OOP(result);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2337
                SET_STACK_OBJECT(result, 0);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2338
              }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2339
            break;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2340
            }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2341
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2342
          case JVM_CONSTANT_Class:
8725
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8330
diff changeset
  2343
            VERIFY_OOP(constants->resolved_klass_at(index)->java_mirror());
8c1e3dd5fe1b 7017732: move static fields into Class to prepare for perm gen removal
never
parents: 8330
diff changeset
  2344
            SET_STACK_OBJECT(constants->resolved_klass_at(index)->java_mirror(), 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2345
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2346
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2347
          case JVM_CONSTANT_UnresolvedClass:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2348
          case JVM_CONSTANT_UnresolvedClassInError:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2349
            CALL_VM(InterpreterRuntime::ldc(THREAD, wide), handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2350
            SET_STACK_OBJECT(THREAD->vm_result(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2351
            THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2352
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2353
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2354
          default:  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2355
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2356
          UPDATE_PC_AND_TOS_AND_CONTINUE(incr, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2357
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2358
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2359
      CASE(_ldc2_w):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2360
        {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2361
          u2 index = Bytes::get_Java_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2362
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2363
          ConstantPool* constants = METHOD->constants();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2364
          switch (constants->tag_at(index).value()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2365
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2366
          case JVM_CONSTANT_Long:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2367
             SET_STACK_LONG(constants->long_at(index), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2368
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2369
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2370
          case JVM_CONSTANT_Double:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2371
             SET_STACK_DOUBLE(constants->double_at(index), 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2372
            break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2373
          default:  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2374
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2375
          UPDATE_PC_AND_TOS_AND_CONTINUE(3, 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2376
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2377
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2378
      CASE(_fast_aldc_w):
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2379
      CASE(_fast_aldc): {
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2380
        u2 index;
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2381
        int incr;
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2382
        if (opcode == Bytecodes::_fast_aldc) {
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2383
          index = pc[1];
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2384
          incr = 2;
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2385
        } else {
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2386
          index = Bytes::get_native_u2(pc+1);
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2387
          incr = 3;
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2388
        }
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2389
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2390
        // We are resolved if the f1 field contains a non-null object (CallSite, etc.)
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2391
        // This kind of CP cache entry does not need to match the flags byte, because
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2392
        // there is a 1-1 relation between bytecode type and CP entry type.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2393
        ConstantPool* constants = METHOD->constants();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2394
        oop result = constants->resolved_references()->obj_at(index);
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2395
        if (result == NULL) {
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2396
          CALL_VM(InterpreterRuntime::resolve_ldc(THREAD, (Bytecodes::Code) opcode),
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2397
                  handle_exception);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2398
          result = THREAD->vm_result();
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2399
        }
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2400
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2401
        VERIFY_OOP(result);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2402
        SET_STACK_OBJECT(result, 0);
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2403
        UPDATE_PC_AND_TOS_AND_CONTINUE(incr, 1);
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2404
      }
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2405
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2406
      CASE(_invokedynamic): {
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2407
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2408
        u4 index = Bytes::get_native_u4(pc+1);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2409
        ConstantPoolCacheEntry* cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index);
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2410
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2411
        // We are resolved if the resolved_references field contains a non-null object (CallSite, etc.)
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2412
        // This kind of CP cache entry does not need to match the flags byte, because
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2413
        // there is a 1-1 relation between bytecode type and CP entry type.
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2414
        if (! cache->is_resolved((Bytecodes::Code) opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  2415
          CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2416
                  handle_exception);
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2417
          cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2418
        }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2419
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2420
        Method* method = cache->f1_as_method();
18451
1c46952f2909 8017531: 8010460 changes broke bytecodeInterpreter.cpp
goetz
parents: 17875
diff changeset
  2421
        if (VerifyOops) method->verify();
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2422
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2423
        if (cache->has_appendix()) {
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2424
          ConstantPool* constants = METHOD->constants();
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2425
          SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2426
          MORE_STACK(1);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2427
        }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2428
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2429
        istate->set_msg(call_method);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2430
        istate->set_callee(method);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2431
        istate->set_callee_entry_point(method->from_interpreted_entry());
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2432
        istate->set_bcp_advance(5);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2433
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2434
        // Invokedynamic has got a call counter, just like an invokestatic -> increment!
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2435
        BI_PROFILE_UPDATE_CALL();
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2436
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2437
        UPDATE_PC_AND_RETURN(0); // I'll be back...
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2438
      }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2439
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2440
      CASE(_invokehandle): {
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2441
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2442
        u2 index = Bytes::get_native_u2(pc+1);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2443
        ConstantPoolCacheEntry* cache = cp->entry_at(index);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2444
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2445
        if (! cache->is_resolved((Bytecodes::Code) opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  2446
          CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2447
                  handle_exception);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2448
          cache = cp->entry_at(index);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2449
        }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2450
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2451
        Method* method = cache->f1_as_method();
18451
1c46952f2909 8017531: 8010460 changes broke bytecodeInterpreter.cpp
goetz
parents: 17875
diff changeset
  2452
        if (VerifyOops) method->verify();
14294
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2453
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2454
        if (cache->has_appendix()) {
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2455
          ConstantPool* constants = METHOD->constants();
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2456
          SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2457
          MORE_STACK(1);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2458
        }
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2459
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2460
        istate->set_msg(call_method);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2461
        istate->set_callee(method);
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2462
        istate->set_callee_entry_point(method->from_interpreted_entry());
130e947dfbe6 8000780: make Zero build and run with JDK8
twisti
parents: 13952
diff changeset
  2463
        istate->set_bcp_advance(3);
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2464
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2465
        // Invokehandle has got a call counter, just like a final call -> increment!
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2466
        BI_PROFILE_UPDATE_FINALCALL();
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2467
9136
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2468
        UPDATE_PC_AND_RETURN(0); // I'll be back...
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2469
      }
94ebba447157 7035870: JSR 292: Zero support
twisti
parents: 9103
diff changeset
  2470
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2471
      CASE(_invokeinterface): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2472
        u2 index = Bytes::get_native_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2473
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2474
        // QQQ Need to make this as inlined as possible. Probably need to split all the bytecode cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2475
        // out so c++ compiler has a chance for constant prop to fold everything possible away.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2476
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2477
        ConstantPoolCacheEntry* cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2478
        if (!cache->is_resolved((Bytecodes::Code)opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  2479
          CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2480
                  handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2481
          cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2482
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2483
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2484
        istate->set_msg(call_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2485
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2486
        // Special case of invokeinterface called for virtual method of
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2487
        // java.lang.Object.  See cpCacheOop.cpp for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2488
        // This code isn't produced by javac, but could be produced by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2489
        // another compliant java compiler.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2490
        if (cache->is_forced_virtual()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2491
          Method* callee;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2492
          CHECK_NULL(STACK_OBJECT(-(cache->parameter_size())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2493
          if (cache->is_vfinal()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2494
            callee = cache->f2_as_vfinal_method();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2495
            // Profile 'special case of invokeinterface' final call.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2496
            BI_PROFILE_UPDATE_FINALCALL();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2497
          } else {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2498
            // Get receiver.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2499
            int parms = cache->parameter_size();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2500
            // Same comments as invokevirtual apply here.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2501
            oop rcvr = STACK_OBJECT(-parms);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2502
            VERIFY_OOP(rcvr);
35928
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2503
            Klass* rcvrKlass = rcvr->klass();
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2504
            callee = (Method*) rcvrKlass->method_at_vtable(cache->f2_as_index());
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2505
            // Profile 'special case of invokeinterface' virtual call.
35928
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2506
            BI_PROFILE_UPDATE_VIRTUALCALL(rcvrKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2507
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2508
          istate->set_callee(callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2509
          istate->set_callee_entry_point(callee->from_interpreted_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2510
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2511
          if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2512
            istate->set_callee_entry_point(callee->interpreter_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2513
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2514
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2515
          istate->set_bcp_advance(5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2516
          UPDATE_PC_AND_RETURN(0); // I'll be back...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2517
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2518
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2519
        // this could definitely be cleaned up QQQ
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2520
        Method* callee;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2521
        Klass* iclass = cache->f1_as_klass();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2522
        // InstanceKlass* interface = (InstanceKlass*) iclass;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2523
        // get receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2524
        int parms = cache->parameter_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2525
        oop rcvr = STACK_OBJECT(-parms);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2526
        CHECK_NULL(rcvr);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2527
        InstanceKlass* int2 = (InstanceKlass*) rcvr->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2528
        itableOffsetEntry* ki = (itableOffsetEntry*) int2->start_of_itable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2529
        int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2530
        for ( i = 0 ; i < int2->itable_length() ; i++, ki++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2531
          if (ki->interface_klass() == iclass) break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2532
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2533
        // If the interface isn't found, this class doesn't implement this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2534
        // interface.  The link resolver checks this but only for the first
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2535
        // time this interface is called.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2536
        if (i == int2->itable_length()) {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2537
          VM_JAVA_ERROR(vmSymbols::java_lang_IncompatibleClassChangeError(), "", note_no_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2538
        }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2539
        int mindex = cache->f2_as_index();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2540
        itableMethodEntry* im = ki->first_method_entry(rcvr->klass());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2541
        callee = im[mindex].method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2542
        if (callee == NULL) {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2543
          VM_JAVA_ERROR(vmSymbols::java_lang_AbstractMethodError(), "", note_no_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2544
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2545
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2546
        // Profile virtual call.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2547
        BI_PROFILE_UPDATE_VIRTUALCALL(rcvr->klass());
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2548
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2549
        istate->set_callee(callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2550
        istate->set_callee_entry_point(callee->from_interpreted_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2551
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2552
        if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2553
          istate->set_callee_entry_point(callee->interpreter_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2554
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2555
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2556
        istate->set_bcp_advance(5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2557
        UPDATE_PC_AND_RETURN(0); // I'll be back...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2558
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2559
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2560
      CASE(_invokevirtual):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2561
      CASE(_invokespecial):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2562
      CASE(_invokestatic): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2563
        u2 index = Bytes::get_native_u2(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2564
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2565
        ConstantPoolCacheEntry* cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2566
        // QQQ Need to make this as inlined as possible. Probably need to split all the bytecode cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2567
        // out so c++ compiler has a chance for constant prop to fold everything possible away.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2568
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2569
        if (!cache->is_resolved((Bytecodes::Code)opcode)) {
30132
1f788eb36811 8076492: Make common code from template interpreter code
coleenp
parents: 30126
diff changeset
  2570
          CALL_VM(InterpreterRuntime::resolve_from_cache(THREAD, (Bytecodes::Code)opcode),
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2571
                  handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2572
          cache = cp->entry_at(index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2573
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2574
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2575
        istate->set_msg(call_method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2576
        {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2577
          Method* callee;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2578
          if ((Bytecodes::Code)opcode == Bytecodes::_invokevirtual) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2579
            CHECK_NULL(STACK_OBJECT(-(cache->parameter_size())));
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2580
            if (cache->is_vfinal()) {
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2581
              callee = cache->f2_as_vfinal_method();
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2582
              // Profile final call.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2583
              BI_PROFILE_UPDATE_FINALCALL();
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2584
            } else {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2585
              // get receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2586
              int parms = cache->parameter_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2587
              // this works but needs a resourcemark and seems to create a vtable on every call:
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2588
              // Method* callee = rcvr->klass()->vtable()->method_at(cache->f2_as_index());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2589
              //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2590
              // this fails with an assert
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2591
              // InstanceKlass* rcvrKlass = InstanceKlass::cast(STACK_OBJECT(-parms)->klass());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2592
              // but this works
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2593
              oop rcvr = STACK_OBJECT(-parms);
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2594
              VERIFY_OOP(rcvr);
35928
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2595
              Klass* rcvrKlass = rcvr->klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2596
              /*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2597
                Executing this code in java.lang.String:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2598
                    public String(char value[]) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2599
                          this.count = value.length;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2600
                          this.value = (char[])value.clone();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2601
                     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2602
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2603
                 a find on rcvr->klass() reports:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2604
                 {type array char}{type array class}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2605
                  - klass: {other class}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2606
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2607
                  but using InstanceKlass::cast(STACK_OBJECT(-parms)->klass()) causes in assertion failure
33611
9abd65805e19 8139203: Consistent naming for klass type predicates
coleenp
parents: 33602
diff changeset
  2608
                  because rcvr->klass()->is_instance_klass() == 0
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2609
                  However it seems to have a vtable in the right location. Huh?
33602
16053580a684 8139163: InstanceKlass::cast passes through NULL
coleenp
parents: 33208
diff changeset
  2610
                  Because vtables have the same offset for ArrayKlass and InstanceKlass.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2611
              */
35928
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2612
              callee = (Method*) rcvrKlass->method_at_vtable(cache->f2_as_index());
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2613
              // Profile virtual call.
35928
084d5cb04276 8148945: JDK-8148481: Devirtualize Klass::vtable breaks Zero build
sgehwolf
parents: 35518
diff changeset
  2614
              BI_PROFILE_UPDATE_VIRTUALCALL(rcvrKlass);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2615
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2616
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2617
            if ((Bytecodes::Code)opcode == Bytecodes::_invokespecial) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2618
              CHECK_NULL(STACK_OBJECT(-(cache->parameter_size())));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2619
            }
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 10565
diff changeset
  2620
            callee = cache->f1_as_method();
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2621
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2622
            // Profile call.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2623
            BI_PROFILE_UPDATE_CALL();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2624
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2625
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2626
          istate->set_callee(callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2627
          istate->set_callee_entry_point(callee->from_interpreted_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2628
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2629
          if (JvmtiExport::can_post_interpreter_events() && THREAD->is_interp_only_mode()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2630
            istate->set_callee_entry_point(callee->interpreter_entry());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2631
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2632
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2633
          istate->set_bcp_advance(3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2634
          UPDATE_PC_AND_RETURN(0); // I'll be back...
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2635
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2636
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2637
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2638
      /* Allocate memory for a new java object. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2639
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2640
      CASE(_newarray): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2641
        BasicType atype = (BasicType) *(pc+1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2642
        jint size = STACK_INT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2643
        CALL_VM(InterpreterRuntime::newarray(THREAD, atype, size),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2644
                handle_exception);
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2645
        // Must prevent reordering of stores for object initialization
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2646
        // with stores that publish the new object.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2647
        OrderAccess::storestore();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2648
        SET_STACK_OBJECT(THREAD->vm_result(), -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2649
        THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2650
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2651
        UPDATE_PC_AND_CONTINUE(2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2652
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2653
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2654
      /* Throw an exception. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2655
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2656
      CASE(_athrow): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2657
          oop except_oop = STACK_OBJECT(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2658
          CHECK_NULL(except_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2659
          // set pending_exception so we use common code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2660
          THREAD->set_pending_exception(except_oop, NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2661
          goto handle_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2662
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2663
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2664
      /* goto and jsr. They are exactly the same except jsr pushes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2665
       * the address of the next instruction first.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2666
       */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2667
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2668
      CASE(_jsr): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2669
          /* push bytecode index on stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2670
          SET_STACK_ADDR(((address)pc - (intptr_t)(istate->method()->code_base()) + 3), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2671
          MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2672
          /* FALL THROUGH */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2673
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2674
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2675
      CASE(_goto):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2676
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2677
          int16_t offset = (int16_t)Bytes::get_Java_u2(pc + 1);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2678
          // Profile jump.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2679
          BI_PROFILE_UPDATE_JUMP();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2680
          address branch_pc = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2681
          UPDATE_PC(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2682
          DO_BACKEDGE_CHECKS(offset, branch_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2683
          CONTINUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2684
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2685
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2686
      CASE(_jsr_w): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2687
          /* push return address on the stack */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2688
          SET_STACK_ADDR(((address)pc - (intptr_t)(istate->method()->code_base()) + 5), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2689
          MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2690
          /* FALL THROUGH */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2691
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2692
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2693
      CASE(_goto_w):
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2694
      {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2695
          int32_t offset = Bytes::get_Java_u4(pc + 1);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2696
          // Profile jump.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2697
          BI_PROFILE_UPDATE_JUMP();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2698
          address branch_pc = pc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2699
          UPDATE_PC(offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2700
          DO_BACKEDGE_CHECKS(offset, branch_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2701
          CONTINUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2702
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2703
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2704
      /* return from a jsr or jsr_w */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2705
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2706
      CASE(_ret): {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2707
          // Profile ret.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2708
          BI_PROFILE_UPDATE_RET(/*bci=*/((int)(intptr_t)(LOCALS_ADDR(pc[1]))));
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2709
          // Now, update the pc.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2710
          pc = istate->method()->code_base() + (intptr_t)(LOCALS_ADDR(pc[1]));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2711
          UPDATE_PC_AND_CONTINUE(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2712
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2713
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2714
      /* debugger breakpoint */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2715
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2716
      CASE(_breakpoint): {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2717
          Bytecodes::Code original_bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2718
          DECACHE_STATE();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2719
          SET_LAST_JAVA_FRAME();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2720
          original_bytecode = InterpreterRuntime::get_original_bytecode_at(THREAD,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2721
                              METHOD, pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2722
          RESET_LAST_JAVA_FRAME();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2723
          CACHE_STATE();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2724
          if (THREAD->has_pending_exception()) goto handle_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2725
            CALL_VM(InterpreterRuntime::_breakpoint(THREAD, METHOD, pc),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2726
                                                    handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2727
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2728
          opcode = (jubyte)original_bytecode;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2729
          goto opcode_switch;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2730
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2731
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2732
      DEFAULT:
33105
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 30764
diff changeset
  2733
          fatal("Unimplemented opcode %d = %s", opcode,
294e48b4f704 8080775: Better argument formatting for assert() and friends
david
parents: 30764
diff changeset
  2734
                Bytecodes::name((Bytecodes::Code)opcode));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2735
          goto finish;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2736
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2737
      } /* switch(opc) */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2738
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2739
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2740
#ifdef USELABELS
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2741
    check_for_exception:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2742
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2743
    {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2744
      if (!THREAD->has_pending_exception()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2745
        CONTINUE;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2746
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2747
      /* We will be gcsafe soon, so flush our state. */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2748
      DECACHE_PC();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2749
      goto handle_exception;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2750
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2751
  do_continue: ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2752
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2753
  } /* while (1) interpreter loop */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2754
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2755
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2756
  // An exception exists in the thread state see whether this activation can handle it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2757
  handle_exception: {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2758
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2759
    HandleMarkCleaner __hmc(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2760
    Handle except_oop(THREAD, THREAD->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2761
    // Prevent any subsequent HandleMarkCleaner in the VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2762
    // from freeing the except_oop handle.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2763
    HandleMark __hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2764
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2765
    THREAD->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2766
    assert(except_oop(), "No exception to process");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2767
    intptr_t continuation_bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2768
    // expression stack is emptied
5422
6a9d399e7401 6949423: remove tagged stack interpreter for Zero
twisti
parents: 5419
diff changeset
  2769
    topOfStack = istate->stack_base() - Interpreter::stackElementWords;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2770
    CALL_VM(continuation_bci = (intptr_t)InterpreterRuntime::exception_handler_for_exception(THREAD, except_oop()),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2771
            handle_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2772
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
  2773
    except_oop = THREAD->vm_result();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2774
    THREAD->set_vm_result(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2775
    if (continuation_bci >= 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2776
      // Place exception on top of stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2777
      SET_STACK_OBJECT(except_oop(), 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2778
      MORE_STACK(1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2779
      pc = METHOD->code_base() + continuation_bci;
35216
71c463a17b3b 8141211: Convert TraceExceptions to Unified Logging
rprotacio
parents: 33749
diff changeset
  2780
      if (log_is_enabled(Info, exceptions)) {
35518
cd2749cebb92 8147482: Zero build fails after 8144953
sgehwolf
parents: 35477
diff changeset
  2781
        ResourceMark rm(THREAD);
35477
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2782
        stringStream tempst;
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2783
        tempst.print("interpreter method <%s>\n"
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2784
                     " at bci %d, continuing at %d for thread " INTPTR_FORMAT,
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2785
                     METHOD->print_value_string(),
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2786
                     (int)(istate->bcp() - METHOD->code_base()),
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2787
                     (int)continuation_bci, p2i(THREAD));
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2788
        Exceptions::log_exception(except_oop, tempst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2789
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2790
      // for AbortVMOnException flag
33208
5ec6ffa63c57 8136577: Make AbortVMOnException available in product builds
poonam
parents: 33105
diff changeset
  2791
      Exceptions::debug_check_abort(except_oop);
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2792
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2793
      // Update profiling data.
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  2794
      BI_PROFILE_ALIGN_TO_CURRENT_BCI();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2795
      goto run;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2796
    }
35216
71c463a17b3b 8141211: Convert TraceExceptions to Unified Logging
rprotacio
parents: 33749
diff changeset
  2797
    if (log_is_enabled(Info, exceptions)) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2798
      ResourceMark rm;
35477
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2799
      stringStream tempst;
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2800
      tempst.print("interpreter method <%s>\n"
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2801
             " at bci %d, unwinding for thread " INTPTR_FORMAT,
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2802
             METHOD->print_value_string(),
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2803
             (int)(istate->bcp() - METHOD->code_base()),
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2804
             p2i(THREAD));
7a00b08d27bc 8144953: runtime/CommandLine/TraceExceptionsTest.java fails when exception is thrown in compiled code
rprotacio
parents: 35216
diff changeset
  2805
      Exceptions::log_exception(except_oop, tempst);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2806
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2807
    // for AbortVMOnException flag
33208
5ec6ffa63c57 8136577: Make AbortVMOnException available in product builds
poonam
parents: 33105
diff changeset
  2808
    Exceptions::debug_check_abort(except_oop);
5ec6ffa63c57 8136577: Make AbortVMOnException available in product builds
poonam
parents: 33105
diff changeset
  2809
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2810
    // No handler in this activation, unwind and try again
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2811
    THREAD->set_pending_exception(except_oop(), NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2812
    goto handle_return;
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2813
  }  // handle_exception:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2814
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2815
  // Return from an interpreter invocation with the result of the interpretation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2816
  // on the top of the Java Stack (or a pending exception)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2817
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2818
  handle_Pop_Frame: {
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2819
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2820
    // We don't really do anything special here except we must be aware
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2821
    // that we can get here without ever locking the method (if sync).
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2822
    // Also we skip the notification of the exit.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2823
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2824
    istate->set_msg(popping_frame);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2825
    // Clear pending so while the pop is in process
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2826
    // we don't start another one if a call_vm is done.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2827
    THREAD->clr_pop_frame_pending();
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2828
    // Let interpreter (only) see the we're in the process of popping a frame
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2829
    THREAD->set_pop_frame_in_process();
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2830
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2831
    goto handle_return;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2832
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2833
  } // handle_Pop_Frame
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2834
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2835
  // ForceEarlyReturn ends a method, and returns to the caller with a return value
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2836
  // given by the invoker of the early return.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2837
  handle_Early_Return: {
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2838
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2839
    istate->set_msg(early_return);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2840
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2841
    // Clear expression stack.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2842
    topOfStack = istate->stack_base() - Interpreter::stackElementWords;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2843
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2844
    JvmtiThreadState *ts = THREAD->jvmti_thread_state();
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2845
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2846
    // Push the value to be returned.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2847
    switch (istate->method()->result_type()) {
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2848
      case T_BOOLEAN:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2849
      case T_SHORT:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2850
      case T_BYTE:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2851
      case T_CHAR:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2852
      case T_INT:
22817
58900c191539 8020121: PPC64: fix build in cppInterpreter after 8019519
goetz
parents: 22816
diff changeset
  2853
        SET_STACK_INT(ts->earlyret_value().i, 0);
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2854
        MORE_STACK(1);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2855
        break;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2856
      case T_LONG:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2857
        SET_STACK_LONG(ts->earlyret_value().j, 1);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2858
        MORE_STACK(2);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2859
        break;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2860
      case T_FLOAT:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2861
        SET_STACK_FLOAT(ts->earlyret_value().f, 0);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2862
        MORE_STACK(1);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2863
        break;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2864
      case T_DOUBLE:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2865
        SET_STACK_DOUBLE(ts->earlyret_value().d, 1);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2866
        MORE_STACK(2);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2867
        break;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2868
      case T_ARRAY:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2869
      case T_OBJECT:
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2870
        SET_STACK_OBJECT(ts->earlyret_oop(), 0);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2871
        MORE_STACK(1);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2872
        break;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2873
    }
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2874
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2875
    ts->clr_earlyret_value();
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2876
    ts->set_earlyret_oop(NULL);
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2877
    ts->clr_earlyret_pending();
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2878
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2879
    // Fall through to handle_return.
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2880
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2881
  } // handle_Early_Return
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2882
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2883
  handle_return: {
22862
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2884
    // A storestore barrier is required to order initialization of
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2885
    // final fields with publishing the reference to the object that
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2886
    // holds the field. Without the barrier the value of final fields
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2887
    // can be observed to change.
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2888
    OrderAccess::storestore();
495f1688b8b1 8029957: PPC64 (part 213): cppInterpreter: memory ordering for object initialization
goetz
parents: 22849
diff changeset
  2889
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2890
    DECACHE_STATE();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2891
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2892
    bool suppress_error = istate->msg() == popping_frame || istate->msg() == early_return;
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  2893
    bool suppress_exit_event = THREAD->has_pending_exception() || istate->msg() == popping_frame;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2894
    Handle original_exception(THREAD, THREAD->pending_exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2895
    Handle illegal_state_oop(THREAD, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2896
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2897
    // We'd like a HandleMark here to prevent any subsequent HandleMarkCleaner
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2898
    // in any following VM entries from freeing our live handles, but illegal_state_oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2899
    // isn't really allocated yet and so doesn't become live until later and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2900
    // in unpredicatable places. Instead we must protect the places where we enter the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2901
    // VM. It would be much simpler (and safer) if we could allocate a real handle with
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2902
    // a NULL oop in it and then overwrite the oop later as needed. This isn't
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2903
    // unfortunately isn't possible.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2904
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2905
    THREAD->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2906
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2907
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2908
    // As far as we are concerned we have returned. If we have a pending exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2909
    // that will be returned as this invocation's result. However if we get any
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2910
    // exception(s) while checking monitor state one of those IllegalMonitorStateExceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2911
    // will be our final result (i.e. monitor exception trumps a pending exception).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2912
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2913
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2914
    // If we never locked the method (or really passed the point where we would have),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2915
    // there is no need to unlock it (or look for other monitors), since that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2916
    // could not have happened.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2917
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2918
    if (THREAD->do_not_unlock()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2919
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2920
      // Never locked, reset the flag now because obviously any caller must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2921
      // have passed their point of locking for us to have gotten here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2922
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2923
      THREAD->clr_do_not_unlock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2924
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2925
      // At this point we consider that we have returned. We now check that the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2926
      // locks were properly block structured. If we find that they were not
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2927
      // used properly we will return with an illegal monitor exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2928
      // The exception is checked by the caller not the callee since this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2929
      // checking is considered to be part of the invocation and therefore
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2930
      // in the callers scope (JVM spec 8.13).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2931
      //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2932
      // Another weird thing to watch for is if the method was locked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2933
      // recursively and then not exited properly. This means we must
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2934
      // examine all the entries in reverse time(and stack) order and
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2935
      // unlock as we find them. If we find the method monitor before
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2936
      // we are at the initial entry then we should throw an exception.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2937
      // It is not clear the template based interpreter does this
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2938
      // correctly
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2939
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2940
      BasicObjectLock* base = istate->monitor_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2941
      BasicObjectLock* end = (BasicObjectLock*) istate->stack_base();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2942
      bool method_unlock_needed = METHOD->is_synchronized();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2943
      // We know the initial monitor was used for the method don't check that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2944
      // slot in the loop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2945
      if (method_unlock_needed) base--;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2946
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2947
      // Check all the monitors to see they are unlocked. Install exception if found to be locked.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2948
      while (end < base) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2949
        oop lockee = end->obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2950
        if (lockee != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2951
          BasicLock* lock = end->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2952
          markOop header = lock->displaced_header();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2953
          end->set_obj(NULL);
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2954
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2955
          if (!lockee->mark()->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2956
            // If it isn't recursive we either must swap old header or call the runtime
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2957
            if (header != NULL) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2958
              if (Atomic::cmpxchg_ptr(header, lockee->mark_addr(), lock) != lock) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2959
                // restore object for the slow case
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2960
                end->set_obj(lockee);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2961
                {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2962
                  // Prevent any HandleMarkCleaner from freeing our live handles
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2963
                  HandleMark __hm(THREAD);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2964
                  CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, end));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  2965
                }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2966
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2967
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2968
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2969
          // One error is plenty
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2970
          if (illegal_state_oop() == NULL && !suppress_error) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2971
            {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2972
              // Prevent any HandleMarkCleaner from freeing our live handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2973
              HandleMark __hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2974
              CALL_VM_NOCHECK(InterpreterRuntime::throw_illegal_monitor_state_exception(THREAD));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2975
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2976
            assert(THREAD->has_pending_exception(), "Lost our exception!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2977
            illegal_state_oop = THREAD->pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2978
            THREAD->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2979
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2980
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2981
        end++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2982
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2983
      // Unlock the method if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2984
      if (method_unlock_needed) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2985
        if (base->obj() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2986
          // The method is already unlocked this is not good.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2987
          if (illegal_state_oop() == NULL && !suppress_error) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2988
            {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2989
              // Prevent any HandleMarkCleaner from freeing our live handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2990
              HandleMark __hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2991
              CALL_VM_NOCHECK(InterpreterRuntime::throw_illegal_monitor_state_exception(THREAD));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2992
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2993
            assert(THREAD->has_pending_exception(), "Lost our exception!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2994
            illegal_state_oop = THREAD->pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2995
            THREAD->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2996
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2997
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2998
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  2999
          // The initial monitor is always used for the method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3000
          // However if that slot is no longer the oop for the method it was unlocked
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3001
          // and reused by something that wasn't unlocked!
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3002
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3003
          // deopt can come in with rcvr dead because c2 knows
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3004
          // its value is preserved in the monitor. So we can't use locals[0] at all
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3005
          // and must use first monitor slot.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3006
          //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3007
          oop rcvr = base->obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3008
          if (rcvr == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3009
            if (!suppress_error) {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  3010
              VM_JAVA_ERROR_NO_JUMP(vmSymbols::java_lang_NullPointerException(), "", note_nullCheck_trap);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3011
              illegal_state_oop = THREAD->pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3012
              THREAD->clear_pending_exception();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3013
            }
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3014
          } else if (UseHeavyMonitors) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3015
            {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3016
              // Prevent any HandleMarkCleaner from freeing our live handles.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3017
              HandleMark __hm(THREAD);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3018
              CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, base));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3019
            }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3020
            if (THREAD->has_pending_exception()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3021
              if (!suppress_error) illegal_state_oop = THREAD->pending_exception();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3022
              THREAD->clear_pending_exception();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3023
            }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3024
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3025
            BasicLock* lock = base->lock();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3026
            markOop header = lock->displaced_header();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3027
            base->set_obj(NULL);
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3028
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3029
            if (!rcvr->mark()->has_bias_pattern()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3030
              base->set_obj(NULL);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3031
              // If it isn't recursive we either must swap old header or call the runtime
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3032
              if (header != NULL) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3033
                if (Atomic::cmpxchg_ptr(header, rcvr->mark_addr(), lock) != lock) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3034
                  // restore object for the slow case
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3035
                  base->set_obj(rcvr);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3036
                  {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3037
                    // Prevent any HandleMarkCleaner from freeing our live handles
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3038
                    HandleMark __hm(THREAD);
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3039
                    CALL_VM_NOCHECK(InterpreterRuntime::monitorexit(THREAD, base));
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3040
                  }
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3041
                  if (THREAD->has_pending_exception()) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3042
                    if (!suppress_error) illegal_state_oop = THREAD->pending_exception();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3043
                    THREAD->clear_pending_exception();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3044
                  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3045
                }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3046
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3047
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3048
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3049
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3050
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3051
    }
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3052
    // Clear the do_not_unlock flag now.
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3053
    THREAD->clr_do_not_unlock();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3054
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3055
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3056
    // Notify jvmti/jvmdi
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3057
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3058
    // NOTE: we do not notify a method_exit if we have a pending exception,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3059
    // including an exception we generate for unlocking checks.  In the former
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3060
    // case, JVMDI has already been notified by our call for the exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3061
    // and in both cases as far as JVMDI is concerned we have already returned.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3062
    // If we notify it again JVMDI will be all confused about how many frames
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3063
    // are still on the stack (4340444).
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3064
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3065
    // NOTE Further! It turns out the the JVMTI spec in fact expects to see
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3066
    // method_exit events whenever we leave an activation unless it was done
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3067
    // for popframe. This is nothing like jvmdi. However we are passing the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3068
    // tests at the moment (apparently because they are jvmdi based) so rather
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3069
    // than change this code and possibly fail tests we will leave it alone
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3070
    // (with this note) in anticipation of changing the vm and the tests
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3071
    // simultaneously.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3072
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3074
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3075
    suppress_exit_event = suppress_exit_event || illegal_state_oop() != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3077
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3078
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3079
#ifdef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3080
      if (_jvmti_interp_events) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3081
        // Whenever JVMTI puts a thread in interp_only_mode, method
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3082
        // entry/exit events are sent for that thread to track stack depth.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3083
        if ( !suppress_exit_event && THREAD->is_interp_only_mode() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3084
          {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3085
            // Prevent any HandleMarkCleaner from freeing our live handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3086
            HandleMark __hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3087
            CALL_VM_NOCHECK(InterpreterRuntime::post_method_exit(THREAD));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3088
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3089
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3090
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3091
#endif /* VM_JVMTI */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3092
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3093
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3094
    // See if we are returning any exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3095
    // A pending exception that was pending prior to a possible popping frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3096
    // overrides the popping frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3097
    //
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  3098
    assert(!suppress_error || (suppress_error && illegal_state_oop() == NULL), "Error was not suppressed");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3099
    if (illegal_state_oop() != NULL || original_exception() != NULL) {
22836
e7e511228518 8024468: PPC64 (part 201): cppInterpreter: implement bytecode profiling
goetz
parents: 22833
diff changeset
  3100
      // Inform the frame manager we have no result.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3101
      istate->set_msg(throwing_exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3102
      if (illegal_state_oop() != NULL)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3103
        THREAD->set_pending_exception(illegal_state_oop(), NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3104
      else
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3105
        THREAD->set_pending_exception(original_exception(), NULL, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3106
      UPDATE_PC_AND_RETURN(0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3107
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3108
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3109
    if (istate->msg() == popping_frame) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3110
      // Make it simpler on the assembly code and set the message for the frame pop.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3111
      // returns
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3112
      if (istate->prev() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3113
        // We must be returning to a deoptimized frame (because popframe only happens between
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3114
        // two interpreted frames). We need to save the current arguments in C heap so that
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3115
        // the deoptimized frame when it restarts can copy the arguments to its expression
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3116
        // stack and re-execute the call. We also have to notify deoptimization that this
2131
98f9cef66a34 6810672: Comment typos
twisti
parents: 1896
diff changeset
  3117
        // has occurred and to pick the preserved args copy them to the deoptimized frame's
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3118
        // java expression stack. Yuck.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3119
        //
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3120
        THREAD->popframe_preserve_args(in_ByteSize(METHOD->size_of_parameters() * wordSize),
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3121
                                LOCALS_SLOT(METHOD->size_of_parameters() - 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3122
        THREAD->set_popframe_condition_bit(JavaThread::popframe_force_deopt_reexecution_bit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3123
      }
22816
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  3124
    } else {
3ec00abe2942 8019519: PPC64 (part 105): C interpreter: implement support for jvmti early return.
goetz
parents: 22815
diff changeset
  3125
      istate->set_msg(return_from_method);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3126
    }
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  3127
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  3128
    // Normal return
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  3129
    // Advance the pc and return to frame manager
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5547
diff changeset
  3130
    UPDATE_PC_AND_RETURN(1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3131
  } /* handle_return: */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3132
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3133
// This is really a fatal error return
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3135
finish:
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3136
  DECACHE_TOS();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3137
  DECACHE_PC();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3138
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3139
  return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3140
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3141
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3142
/*
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3143
 * All the code following this point is only produced once and is not present
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3144
 * in the JVMTI version of the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3145
*/
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3146
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3147
#ifndef VM_JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3148
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3149
// This constructor should only be used to contruct the object to signal
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3150
// interpreter initialization. All other instances should be created by
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3151
// the frame manager.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3152
BytecodeInterpreter::BytecodeInterpreter(messages msg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3153
  if (msg != initialize) ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3154
  _msg = msg;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3155
  _self_link = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3156
  _prev_link = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3157
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3158
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3159
// Inline static functions for Java Stack and Local manipulation
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3160
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3161
// The implementations are platform dependent. We have to worry about alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3162
// issues on some machines which can change on the same platform depending on
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3163
// whether it is an LP64 machine also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3164
address BytecodeInterpreter::stack_slot(intptr_t *tos, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3165
  return (address) tos[Interpreter::expr_index_at(-offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3166
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3167
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3168
jint BytecodeInterpreter::stack_int(intptr_t *tos, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3169
  return *((jint*) &tos[Interpreter::expr_index_at(-offset)]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3170
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3171
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3172
jfloat BytecodeInterpreter::stack_float(intptr_t *tos, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3173
  return *((jfloat *) &tos[Interpreter::expr_index_at(-offset)]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3174
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3175
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3176
oop BytecodeInterpreter::stack_object(intptr_t *tos, int offset) {
22849
b8670e920530 8028514: PPC64: Fix C++ Interpreter after '7195622: CheckUnhandledOops has limited usefulness now'
simonis
parents: 22836
diff changeset
  3177
  return cast_to_oop(tos [Interpreter::expr_index_at(-offset)]);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3178
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3179
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3180
jdouble BytecodeInterpreter::stack_double(intptr_t *tos, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3181
  return ((VMJavaVal64*) &tos[Interpreter::expr_index_at(-offset)])->d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3182
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3183
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3184
jlong BytecodeInterpreter::stack_long(intptr_t *tos, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3185
  return ((VMJavaVal64 *) &tos[Interpreter::expr_index_at(-offset)])->l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3186
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3187
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3188
// only used for value types
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3189
void BytecodeInterpreter::set_stack_slot(intptr_t *tos, address value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3190
                                                        int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3191
  *((address *)&tos[Interpreter::expr_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3193
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3194
void BytecodeInterpreter::set_stack_int(intptr_t *tos, int value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3195
                                                       int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3196
  *((jint *)&tos[Interpreter::expr_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3197
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3198
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3199
void BytecodeInterpreter::set_stack_float(intptr_t *tos, jfloat value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3200
                                                         int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3201
  *((jfloat *)&tos[Interpreter::expr_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3204
void BytecodeInterpreter::set_stack_object(intptr_t *tos, oop value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3205
                                                          int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3206
  *((oop *)&tos[Interpreter::expr_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3207
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3208
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3209
// needs to be platform dep for the 32 bit platforms.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3210
void BytecodeInterpreter::set_stack_double(intptr_t *tos, jdouble value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3211
                                                          int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3212
  ((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset)])->d = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3213
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3214
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3215
void BytecodeInterpreter::set_stack_double_from_addr(intptr_t *tos,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3216
                                              address addr, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3217
  (((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset)])->d =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3218
                        ((VMJavaVal64*)addr)->d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3219
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3221
void BytecodeInterpreter::set_stack_long(intptr_t *tos, jlong value,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3222
                                                        int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3223
  ((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset+1)])->l = 0xdeedbeeb;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3224
  ((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset)])->l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3225
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3226
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3227
void BytecodeInterpreter::set_stack_long_from_addr(intptr_t *tos,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3228
                                            address addr, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3229
  ((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset+1)])->l = 0xdeedbeeb;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3230
  ((VMJavaVal64*)&tos[Interpreter::expr_index_at(-offset)])->l =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3231
                        ((VMJavaVal64*)addr)->l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3232
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3233
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3234
// Locals
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3235
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3236
address BytecodeInterpreter::locals_slot(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3237
  return (address)locals[Interpreter::local_index_at(-offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3238
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3239
jint BytecodeInterpreter::locals_int(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3240
  return (jint)locals[Interpreter::local_index_at(-offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3241
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3242
jfloat BytecodeInterpreter::locals_float(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3243
  return (jfloat)locals[Interpreter::local_index_at(-offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3244
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3245
oop BytecodeInterpreter::locals_object(intptr_t* locals, int offset) {
22849
b8670e920530 8028514: PPC64: Fix C++ Interpreter after '7195622: CheckUnhandledOops has limited usefulness now'
simonis
parents: 22836
diff changeset
  3246
  return cast_to_oop(locals[Interpreter::local_index_at(-offset)]);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3247
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3248
jdouble BytecodeInterpreter::locals_double(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3249
  return ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3250
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3251
jlong BytecodeInterpreter::locals_long(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3252
  return ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3253
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3254
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3255
// Returns the address of locals value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3256
address BytecodeInterpreter::locals_long_at(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3257
  return ((address)&locals[Interpreter::local_index_at(-(offset+1))]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3258
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3259
address BytecodeInterpreter::locals_double_at(intptr_t* locals, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3260
  return ((address)&locals[Interpreter::local_index_at(-(offset+1))]);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3261
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3262
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3263
// Used for local value or returnAddress
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3264
void BytecodeInterpreter::set_locals_slot(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3265
                                   address value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3266
  *((address*)&locals[Interpreter::local_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3267
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3268
void BytecodeInterpreter::set_locals_int(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3269
                                   jint value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3270
  *((jint *)&locals[Interpreter::local_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3271
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3272
void BytecodeInterpreter::set_locals_float(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3273
                                   jfloat value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3274
  *((jfloat *)&locals[Interpreter::local_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3275
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3276
void BytecodeInterpreter::set_locals_object(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3277
                                   oop value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3278
  *((oop *)&locals[Interpreter::local_index_at(-offset)]) = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3279
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3280
void BytecodeInterpreter::set_locals_double(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3281
                                   jdouble value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3282
  ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->d = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3283
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3284
void BytecodeInterpreter::set_locals_long(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3285
                                   jlong value, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3286
  ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->l = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3287
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3288
void BytecodeInterpreter::set_locals_double_from_addr(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3289
                                   address addr, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3290
  ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->d = ((VMJavaVal64*)addr)->d;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3291
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3292
void BytecodeInterpreter::set_locals_long_from_addr(intptr_t *locals,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3293
                                   address addr, int offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3294
  ((VMJavaVal64*)&locals[Interpreter::local_index_at(-(offset+1))])->l = ((VMJavaVal64*)addr)->l;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3295
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3296
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3297
void BytecodeInterpreter::astore(intptr_t* tos,    int stack_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3298
                          intptr_t* locals, int locals_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3299
  intptr_t value = tos[Interpreter::expr_index_at(-stack_offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3300
  locals[Interpreter::local_index_at(-locals_offset)] = value;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3301
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3302
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3303
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3304
void BytecodeInterpreter::copy_stack_slot(intptr_t *tos, int from_offset,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3305
                                   int to_offset) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3306
  tos[Interpreter::expr_index_at(-to_offset)] =
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3307
                      (intptr_t)tos[Interpreter::expr_index_at(-from_offset)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3308
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3309
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3310
void BytecodeInterpreter::dup(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3311
  copy_stack_slot(tos, -1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3312
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3313
void BytecodeInterpreter::dup2(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3314
  copy_stack_slot(tos, -2, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3315
  copy_stack_slot(tos, -1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3316
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3317
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3318
void BytecodeInterpreter::dup_x1(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3319
  /* insert top word two down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3320
  copy_stack_slot(tos, -1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3321
  copy_stack_slot(tos, -2, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3322
  copy_stack_slot(tos, 0, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3323
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3324
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3325
void BytecodeInterpreter::dup_x2(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3326
  /* insert top word three down  */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3327
  copy_stack_slot(tos, -1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3328
  copy_stack_slot(tos, -2, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3329
  copy_stack_slot(tos, -3, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3330
  copy_stack_slot(tos, 0, -3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3331
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3332
void BytecodeInterpreter::dup2_x1(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3333
  /* insert top 2 slots three down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3334
  copy_stack_slot(tos, -1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3335
  copy_stack_slot(tos, -2, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3336
  copy_stack_slot(tos, -3, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3337
  copy_stack_slot(tos, 1, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3338
  copy_stack_slot(tos, 0, -3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3339
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3340
void BytecodeInterpreter::dup2_x2(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3341
  /* insert top 2 slots four down */
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3342
  copy_stack_slot(tos, -1, 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3343
  copy_stack_slot(tos, -2, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3344
  copy_stack_slot(tos, -3, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3345
  copy_stack_slot(tos, -4, -2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3346
  copy_stack_slot(tos, 1, -3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3347
  copy_stack_slot(tos, 0, -4);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3348
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3349
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3350
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3351
void BytecodeInterpreter::swap(intptr_t *tos) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3352
  // swap top two elements
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3353
  intptr_t val = tos[Interpreter::expr_index_at(1)];
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3354
  // Copy -2 entry to -1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3355
  copy_stack_slot(tos, -2, -1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3356
  // Store saved -1 entry into -2
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3357
  tos[Interpreter::expr_index_at(2)] = val;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3358
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3359
// --------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3360
// Non-product code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3361
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3362
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3363
const char* BytecodeInterpreter::C_msg(BytecodeInterpreter::messages msg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3364
  switch (msg) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3365
     case BytecodeInterpreter::no_request:  return("no_request");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3366
     case BytecodeInterpreter::initialize:  return("initialize");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3367
     // status message to C++ interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3368
     case BytecodeInterpreter::method_entry:  return("method_entry");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3369
     case BytecodeInterpreter::method_resume:  return("method_resume");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3370
     case BytecodeInterpreter::got_monitors:  return("got_monitors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3371
     case BytecodeInterpreter::rethrow_exception:  return("rethrow_exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3372
     // requests to frame manager from C++ interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3373
     case BytecodeInterpreter::call_method:  return("call_method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3374
     case BytecodeInterpreter::return_from_method:  return("return_from_method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3375
     case BytecodeInterpreter::more_monitors:  return("more_monitors");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3376
     case BytecodeInterpreter::throwing_exception:  return("throwing_exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3377
     case BytecodeInterpreter::popping_frame:  return("popping_frame");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3378
     case BytecodeInterpreter::do_osr:  return("do_osr");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3379
     // deopt
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3380
     case BytecodeInterpreter::deopt_resume:  return("deopt_resume");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3381
     case BytecodeInterpreter::deopt_resume2:  return("deopt_resume2");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3382
     default: return("BAD MSG");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3383
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3384
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3385
void
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3386
BytecodeInterpreter::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3387
  tty->print_cr("thread: " INTPTR_FORMAT, (uintptr_t) this->_thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3388
  tty->print_cr("bcp: " INTPTR_FORMAT, (uintptr_t) this->_bcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3389
  tty->print_cr("locals: " INTPTR_FORMAT, (uintptr_t) this->_locals);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3390
  tty->print_cr("constants: " INTPTR_FORMAT, (uintptr_t) this->_constants);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3391
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3392
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3393
    char *method_name = _method->name_and_sig_as_C_string();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3394
    tty->print_cr("method: " INTPTR_FORMAT "[ %s ]",  (uintptr_t) this->_method, method_name);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3395
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3396
  tty->print_cr("mdx: " INTPTR_FORMAT, (uintptr_t) this->_mdx);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3397
  tty->print_cr("stack: " INTPTR_FORMAT, (uintptr_t) this->_stack);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3398
  tty->print_cr("msg: %s", C_msg(this->_msg));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3399
  tty->print_cr("result_to_call._callee: " INTPTR_FORMAT, (uintptr_t) this->_result._to_call._callee);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3400
  tty->print_cr("result_to_call._callee_entry_point: " INTPTR_FORMAT, (uintptr_t) this->_result._to_call._callee_entry_point);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3401
  tty->print_cr("result_to_call._bcp_advance: %d ", this->_result._to_call._bcp_advance);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3402
  tty->print_cr("osr._osr_buf: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_buf);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3403
  tty->print_cr("osr._osr_entry: " INTPTR_FORMAT, (uintptr_t) this->_result._osr._osr_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3404
  tty->print_cr("prev_link: " INTPTR_FORMAT, (uintptr_t) this->_prev_link);
26142
038e0f01b4a9 8055231: ZERO variant build is broken
coleenp
parents: 25374
diff changeset
  3405
  tty->print_cr("native_mirror: " INTPTR_FORMAT, (uintptr_t) p2i(this->_oop_temp));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3406
  tty->print_cr("stack_base: " INTPTR_FORMAT, (uintptr_t) this->_stack_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3407
  tty->print_cr("stack_limit: " INTPTR_FORMAT, (uintptr_t) this->_stack_limit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3408
  tty->print_cr("monitor_base: " INTPTR_FORMAT, (uintptr_t) this->_monitor_base);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3409
#ifdef SPARC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3410
  tty->print_cr("last_Java_pc: " INTPTR_FORMAT, (uintptr_t) this->_last_Java_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3411
  tty->print_cr("frame_bottom: " INTPTR_FORMAT, (uintptr_t) this->_frame_bottom);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3412
  tty->print_cr("&native_fresult: " INTPTR_FORMAT, (uintptr_t) &this->_native_fresult);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3413
  tty->print_cr("native_lresult: " INTPTR_FORMAT, (uintptr_t) this->_native_lresult);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3414
#endif
23203
76c2a23e2537 8036146: make CPP interpreter build again
roland
parents: 22878
diff changeset
  3415
#if !defined(ZERO) && defined(PPC)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3416
  tty->print_cr("last_Java_fp: " INTPTR_FORMAT, (uintptr_t) this->_last_Java_fp);
15475
73896d91270c 6518907: cleanup IA64 specific code in Hotspot
morris
parents: 14488
diff changeset
  3417
#endif // !ZERO
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3418
  tty->print_cr("self_link: " INTPTR_FORMAT, (uintptr_t) this->_self_link);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3419
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3420
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3421
extern "C" {
22811
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3422
  void PI(uintptr_t arg) {
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3423
    ((BytecodeInterpreter*)arg)->print();
3a58336f9ace 8017317: PPC64 (part 7): cppInterpreter: implement support for biased locking
goetz
parents: 17875
diff changeset
  3424
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3425
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3426
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3427
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3428
#endif // JVMTI
489c9b5090e2 Initial load
duke
parents:
diff changeset
  3429
#endif // CC_INTERP