annotate src/share/vm/interpreter/bytecodeInterpreter.cpp @ 6972:bd7a7ce2e264

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