Mercurial > hg > truffle
annotate src/share/vm/interpreter/abstractInterpreter.hpp @ 9126:bc26f978b0ce
HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly
don't use the (wrong) cached value, but ask the runtime on each request.
Fixes regression on xml.* benchmarks @ specjvm2008. The problem was:
After the constructor of Object was deoptimized due to an assumption violation,
it was recompiled again after some time. However, on recompilation, the value
of hasFinalizeSubclass for the class was not updated and it was compiled again
with a, now wrong, assumption, which then triggers deoptimization again.
This was repeated until it hit the recompilation limit (defined by
PerMethodRecompilationCutoff), and therefore only executed by the interpreter
from now on, causing the performance regression.
author | Bernhard Urban <bernhard.urban@jku.at> |
---|---|
date | Mon, 15 Apr 2013 19:54:58 +0200 |
parents | c6a1ffc707ff |
children | 6b0fd0964b87 |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1506
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:
1506
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP |
26 #define SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP | |
27 | |
28 #include "code/stubs.hpp" | |
29 #include "interpreter/bytecodes.hpp" | |
7180
f34d701e952e
8003935: Simplify the needed includes for using Thread::current()
stefank
parents:
6926
diff
changeset
|
30 #include "runtime/thread.inline.hpp" |
1972 | 31 #include "runtime/vmThread.hpp" |
32 #include "utilities/top.hpp" | |
33 #ifdef TARGET_ARCH_MODEL_x86_32 | |
34 # include "interp_masm_x86_32.hpp" | |
35 #endif | |
36 #ifdef TARGET_ARCH_MODEL_x86_64 | |
37 # include "interp_masm_x86_64.hpp" | |
38 #endif | |
39 #ifdef TARGET_ARCH_MODEL_sparc | |
40 # include "interp_masm_sparc.hpp" | |
41 #endif | |
42 #ifdef TARGET_ARCH_MODEL_zero | |
43 # include "interp_masm_zero.hpp" | |
44 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
45 #ifdef TARGET_ARCH_MODEL_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
46 # include "interp_masm_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
47 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
48 #ifdef TARGET_ARCH_MODEL_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
49 # include "interp_masm_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
50 #endif |
1972 | 51 |
605 | 52 // This file contains the platform-independent parts |
0 | 53 // of the abstract interpreter and the abstract interpreter generator. |
54 | |
55 // Organization of the interpreter(s). There exists two different interpreters in hotpot | |
56 // an assembly language version (aka template interpreter) and a high level language version | |
57 // (aka c++ interpreter). Th division of labor is as follows: | |
58 | |
59 // Template Interpreter C++ Interpreter Functionality | |
60 // | |
61 // templateTable* bytecodeInterpreter* actual interpretation of bytecodes | |
62 // | |
63 // templateInterpreter* cppInterpreter* generation of assembly code that creates | |
64 // and manages interpreter runtime frames. | |
65 // Also code for populating interpreter | |
66 // frames created during deoptimization. | |
67 // | |
68 // For both template and c++ interpreter. There are common files for aspects of the interpreter | |
69 // that are generic to both interpreters. This is the layout: | |
70 // | |
71 // abstractInterpreter.hpp: generic description of the interpreter. | |
72 // interpreter*: generic frame creation and handling. | |
73 // | |
74 | |
75 //------------------------------------------------------------------------------------------------------------------------ | |
76 // The C++ interface to the bytecode interpreter(s). | |
77 | |
78 class AbstractInterpreter: AllStatic { | |
79 friend class VMStructs; | |
80 friend class Interpreter; | |
81 friend class CppInterpreterGenerator; | |
82 public: | |
83 enum MethodKind { | |
84 zerolocals, // method needs locals initialization | |
85 zerolocals_synchronized, // method needs locals initialization & is synchronized | |
86 native, // native method | |
87 native_synchronized, // native method & is synchronized | |
9046
c6a1ffc707ff
Comments and #ifdef GRAAL for recent changes to C++ code for calling nmethods directly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9025
diff
changeset
|
88 #ifdef GRAAL |
9025
ff5a32117e02
Implement fast invocation of installed code (direct tail call to the target machine code address).
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
8727
diff
changeset
|
89 execute_compiled_method, // direct call to compiled method address |
9046
c6a1ffc707ff
Comments and #ifdef GRAAL for recent changes to C++ code for calling nmethods directly.
Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
parents:
9025
diff
changeset
|
90 #endif |
0 | 91 empty, // empty method (code: _return) |
92 accessor, // accessor method (code: _aload_0, _getfield, _(a|i)return) | |
93 abstract, // abstract method (throws an AbstractMethodException) | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
94 method_handle_invoke_FIRST, // java.lang.invoke.MethodHandles::invokeExact, etc. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
95 method_handle_invoke_LAST = (method_handle_invoke_FIRST |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
96 + (vmIntrinsics::LAST_MH_SIG_POLY |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
97 - vmIntrinsics::FIRST_MH_SIG_POLY)), |
0 | 98 java_lang_math_sin, // implementation of java.lang.Math.sin (x) |
99 java_lang_math_cos, // implementation of java.lang.Math.cos (x) | |
100 java_lang_math_tan, // implementation of java.lang.Math.tan (x) | |
101 java_lang_math_abs, // implementation of java.lang.Math.abs (x) | |
102 java_lang_math_sqrt, // implementation of java.lang.Math.sqrt (x) | |
103 java_lang_math_log, // implementation of java.lang.Math.log (x) | |
104 java_lang_math_log10, // implementation of java.lang.Math.log10 (x) | |
6084
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3960
diff
changeset
|
105 java_lang_math_pow, // implementation of java.lang.Math.pow (x,y) |
6759698e3140
7133857: exp() and pow() should use the x87 ISA on x86
roland
parents:
3960
diff
changeset
|
106 java_lang_math_exp, // implementation of java.lang.Math.exp (x) |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2357
diff
changeset
|
107 java_lang_ref_reference_get, // implementation of java.lang.ref.Reference.get() |
0 | 108 number_of_method_entries, |
109 invalid = -1 | |
110 }; | |
111 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
112 // Conversion from the part of the above enum to vmIntrinsics::_invokeExact, etc. |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
113 static vmIntrinsics::ID method_handle_intrinsic(MethodKind kind) { |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
114 if (kind >= method_handle_invoke_FIRST && kind <= method_handle_invoke_LAST) |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
115 return (vmIntrinsics::ID)( vmIntrinsics::FIRST_MH_SIG_POLY + (kind - method_handle_invoke_FIRST) ); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
116 else |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
117 return vmIntrinsics::_none; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
118 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
119 |
0 | 120 enum SomeConstants { |
121 number_of_result_handlers = 10 // number of result handlers for native calls | |
122 }; | |
123 | |
124 protected: | |
125 static StubQueue* _code; // the interpreter code (codelets) | |
126 | |
127 static bool _notice_safepoints; // true if safepoints are activated | |
128 | |
129 static address _native_entry_begin; // Region for native entry code | |
130 static address _native_entry_end; | |
131 | |
132 // method entry points | |
133 static address _entry_table[number_of_method_entries]; // entry points for a given method | |
134 static address _native_abi_to_tosca[number_of_result_handlers]; // for native method result handlers | |
135 static address _slow_signature_handler; // the native method generic (slow) signature handler | |
136 | |
137 static address _rethrow_exception_entry; // rethrows an activation in previous frame | |
138 | |
139 friend class AbstractInterpreterGenerator; | |
140 friend class InterpreterGenerator; | |
141 friend class InterpreterMacroAssembler; | |
142 | |
143 public: | |
144 // Initialization/debugging | |
145 static void initialize(); | |
146 static StubQueue* code() { return _code; } | |
147 | |
148 | |
149 // Method activation | |
150 static MethodKind method_kind(methodHandle m); | |
151 static address entry_for_kind(MethodKind k) { assert(0 <= k && k < number_of_method_entries, "illegal kind"); return _entry_table[k]; } | |
3249
e1162778c1c8
7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents:
2357
diff
changeset
|
152 static address entry_for_method(methodHandle m) { return entry_for_kind(method_kind(m)); } |
0 | 153 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
154 // used for bootstrapping method handles: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
155 static void set_entry_for_kind(MethodKind k, address e); |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
156 |
0 | 157 static void print_method_kind(MethodKind kind) PRODUCT_RETURN; |
158 | |
1174
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
900
diff
changeset
|
159 static bool can_be_compiled(methodHandle m); |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
900
diff
changeset
|
160 |
0 | 161 // Runtime support |
162 | |
163 // length = invoke bytecode length (to advance to next bytecode) | |
164 static address deopt_entry (TosState state, int length) { ShouldNotReachHere(); return NULL; } | |
165 static address return_entry (TosState state, int length) { ShouldNotReachHere(); return NULL; } | |
166 | |
167 static address rethrow_exception_entry() { return _rethrow_exception_entry; } | |
168 | |
169 // Activation size in words for a method that is just being called. | |
170 // Parameters haven't been pushed so count them too. | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
171 static int size_top_interpreter_activation(Method* method); |
0 | 172 |
173 // Deoptimization support | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
174 // Compute the entry address for continuation after |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
175 static address deopt_continue_after_entry(Method* method, |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
176 address bcp, |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
177 int callee_parameters, |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
178 bool is_top_frame); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
179 // Compute the entry address for reexecution |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
180 static address deopt_reexecute_entry(Method* method, address bcp); |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
181 // Deoptimization should reexecute this bytecode |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
182 static bool bytecode_should_reexecute(Bytecodes::Code code); |
0 | 183 |
184 // share implementation of size_activation and layout_activation: | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
185 static int size_activation(Method* method, |
0 | 186 int temps, |
187 int popframe_args, | |
188 int monitors, | |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
189 int caller_actual_parameters, |
0 | 190 int callee_params, |
191 int callee_locals, | |
8727
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
192 bool is_top_frame, |
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
193 bool is_bottom_frame) { |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
194 return layout_activation(method, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
195 temps, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
196 popframe_args, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
197 monitors, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
198 caller_actual_parameters, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
199 callee_params, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
200 callee_locals, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
201 (frame*)NULL, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
202 (frame*)NULL, |
8727
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
203 is_top_frame, |
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
204 is_bottom_frame); |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
205 } |
0 | 206 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
207 static int layout_activation(Method* method, |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
208 int temps, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
209 int popframe_args, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
210 int monitors, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
211 int caller_actual_parameters, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
212 int callee_params, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
213 int callee_locals, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
214 frame* caller, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
215 frame* interpreter_frame, |
8727
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
216 bool is_top_frame, |
0094485b46c7
8009761: Deoptimization on sparc doesn't set Llast_SP correctly in the interpreter frames it creates
roland
parents:
7180
diff
changeset
|
217 bool is_bottom_frame); |
0 | 218 |
219 // Runtime support | |
220 static bool is_not_reached( methodHandle method, int bci); | |
221 // Safepoint support | |
222 static void notice_safepoints() { ShouldNotReachHere(); } // stops the thread when reaching a safepoint | |
223 static void ignore_safepoints() { ShouldNotReachHere(); } // ignores safepoints | |
224 | |
225 // Support for native calls | |
226 static address slow_signature_handler() { return _slow_signature_handler; } | |
227 static address result_handler(BasicType type) { return _native_abi_to_tosca[BasicType_as_index(type)]; } | |
228 static int BasicType_as_index(BasicType type); // computes index into result_handler_by_index table | |
229 static bool in_native_entry(address pc) { return _native_entry_begin <= pc && pc < _native_entry_end; } | |
230 // Debugging/printing | |
231 static void print(); // prints the interpreter code | |
232 | |
233 public: | |
1506 | 234 // Interpreter helpers |
235 const static int stackElementWords = 1; | |
236 const static int stackElementSize = stackElementWords * wordSize; | |
237 const static int logStackElementSize = LogBytesPerWord; | |
0 | 238 |
239 // Local values relative to locals[n] | |
240 static int local_offset_in_bytes(int n) { | |
1506 | 241 return ((frame::interpreter_frame_expression_stack_direction() * n) * stackElementSize); |
0 | 242 } |
243 | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
244 // access to stacked values according to type: |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
245 static oop* oop_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
246 return (oop*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
247 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
248 static jint* int_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
249 if ((int) sizeof(jint) < wordSize && !Bytes::is_Java_byte_ordering_different()) |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
250 // big-endian LP64 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
251 return (jint*)(slot_addr + 1) - 1; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
252 else |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
253 return (jint*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
254 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
255 static jlong long_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
256 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
257 return *(jlong*) slot_addr; |
1506 | 258 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
259 return Bytes::get_native_u8((address)slot_addr); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
260 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
261 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
262 static void set_long_in_slot(intptr_t* slot_addr, jlong value) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
263 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
264 *(jlong*) slot_addr = value; |
1506 | 265 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
266 Bytes::put_native_u8((address)slot_addr, value); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
267 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
268 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
269 static void get_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
270 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
271 case T_BOOLEAN: value->z = *int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
272 case T_CHAR: value->c = *int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
273 case T_BYTE: value->b = *int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
274 case T_SHORT: value->s = *int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
275 case T_INT: value->i = *int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
276 case T_LONG: value->j = long_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
277 case T_FLOAT: value->f = *(jfloat*)int_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
278 case T_DOUBLE: value->d = jdouble_cast(long_in_slot(slot_addr)); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
279 case T_OBJECT: value->l = (jobject)*oop_addr_in_slot(slot_addr); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
280 default: ShouldNotReachHere(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
281 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
282 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
283 static void set_jvalue_in_slot(intptr_t* slot_addr, BasicType type, jvalue* value) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
284 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
285 case T_BOOLEAN: *int_addr_in_slot(slot_addr) = (value->z != 0); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
286 case T_CHAR: *int_addr_in_slot(slot_addr) = value->c; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
287 case T_BYTE: *int_addr_in_slot(slot_addr) = value->b; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
288 case T_SHORT: *int_addr_in_slot(slot_addr) = value->s; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
289 case T_INT: *int_addr_in_slot(slot_addr) = value->i; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
290 case T_LONG: set_long_in_slot(slot_addr, value->j); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
291 case T_FLOAT: *(jfloat*)int_addr_in_slot(slot_addr) = value->f; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
292 case T_DOUBLE: set_long_in_slot(slot_addr, jlong_cast(value->d)); break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
293 case T_OBJECT: *oop_addr_in_slot(slot_addr) = (oop) value->l; break; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
294 default: ShouldNotReachHere(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
295 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
296 } |
0 | 297 }; |
298 | |
299 //------------------------------------------------------------------------------------------------------------------------ | |
300 // The interpreter generator. | |
301 | |
302 class Template; | |
303 class AbstractInterpreterGenerator: public StackObj { | |
304 protected: | |
305 InterpreterMacroAssembler* _masm; | |
306 | |
307 // shared code sequences | |
308 // Converter for native abi result to tosca result | |
309 address generate_result_handler_for(BasicType type); | |
310 address generate_slow_signature_handler(); | |
311 | |
312 // entry point generator | |
313 address generate_method_entry(AbstractInterpreter::MethodKind kind); | |
314 | |
315 void bang_stack_shadow_pages(bool native_call); | |
316 | |
317 void generate_all(); | |
6926 | 318 void initialize_method_handle_entries(); |
0 | 319 |
320 public: | |
321 AbstractInterpreterGenerator(StubQueue* _code); | |
322 }; | |
1972 | 323 |
324 #endif // SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP |