Mercurial > hg > truffle
annotate src/share/vm/interpreter/abstractInterpreter.hpp @ 6862:8a5ea0a9ccc4
7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>
author | johnc |
---|---|
date | Sat, 06 Oct 2012 01:17:44 -0700 |
parents | da91efe96a93 |
children | a3e2f723f2a5 |
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" | |
30 #include "runtime/vmThread.hpp" | |
31 #include "utilities/top.hpp" | |
32 #ifdef TARGET_ARCH_MODEL_x86_32 | |
33 # include "interp_masm_x86_32.hpp" | |
34 #endif | |
35 #ifdef TARGET_ARCH_MODEL_x86_64 | |
36 # include "interp_masm_x86_64.hpp" | |
37 #endif | |
38 #ifdef TARGET_ARCH_MODEL_sparc | |
39 # include "interp_masm_sparc.hpp" | |
40 #endif | |
41 #ifdef TARGET_ARCH_MODEL_zero | |
42 # include "interp_masm_zero.hpp" | |
43 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
44 #ifdef TARGET_ARCH_MODEL_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
45 # include "interp_masm_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
46 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
47 #ifdef TARGET_ARCH_MODEL_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
48 # include "interp_masm_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
49 #endif |
1972 | 50 #ifdef TARGET_OS_FAMILY_linux |
51 # include "thread_linux.inline.hpp" | |
52 #endif | |
53 #ifdef TARGET_OS_FAMILY_solaris | |
54 # include "thread_solaris.inline.hpp" | |
55 #endif | |
56 #ifdef TARGET_OS_FAMILY_windows | |
57 # include "thread_windows.inline.hpp" | |
58 #endif | |
3960 | 59 #ifdef TARGET_OS_FAMILY_bsd |
60 # include "thread_bsd.inline.hpp" | |
61 #endif | |
1972 | 62 |
605 | 63 // This file contains the platform-independent parts |
0 | 64 // of the abstract interpreter and the abstract interpreter generator. |
65 | |
66 // Organization of the interpreter(s). There exists two different interpreters in hotpot | |
67 // an assembly language version (aka template interpreter) and a high level language version | |
68 // (aka c++ interpreter). Th division of labor is as follows: | |
69 | |
70 // Template Interpreter C++ Interpreter Functionality | |
71 // | |
72 // templateTable* bytecodeInterpreter* actual interpretation of bytecodes | |
73 // | |
74 // templateInterpreter* cppInterpreter* generation of assembly code that creates | |
75 // and manages interpreter runtime frames. | |
76 // Also code for populating interpreter | |
77 // frames created during deoptimization. | |
78 // | |
79 // For both template and c++ interpreter. There are common files for aspects of the interpreter | |
80 // that are generic to both interpreters. This is the layout: | |
81 // | |
82 // abstractInterpreter.hpp: generic description of the interpreter. | |
83 // interpreter*: generic frame creation and handling. | |
84 // | |
85 | |
86 //------------------------------------------------------------------------------------------------------------------------ | |
87 // The C++ interface to the bytecode interpreter(s). | |
88 | |
89 class AbstractInterpreter: AllStatic { | |
90 friend class VMStructs; | |
91 friend class Interpreter; | |
92 friend class CppInterpreterGenerator; | |
93 public: | |
94 enum MethodKind { | |
95 zerolocals, // method needs locals initialization | |
96 zerolocals_synchronized, // method needs locals initialization & is synchronized | |
97 native, // native method | |
98 native_synchronized, // native method & is synchronized | |
99 empty, // empty method (code: _return) | |
100 accessor, // accessor method (code: _aload_0, _getfield, _(a|i)return) | |
101 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
|
102 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
|
103 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
|
104 + (vmIntrinsics::LAST_MH_SIG_POLY |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
105 - vmIntrinsics::FIRST_MH_SIG_POLY)), |
0 | 106 java_lang_math_sin, // implementation of java.lang.Math.sin (x) |
107 java_lang_math_cos, // implementation of java.lang.Math.cos (x) | |
108 java_lang_math_tan, // implementation of java.lang.Math.tan (x) | |
109 java_lang_math_abs, // implementation of java.lang.Math.abs (x) | |
110 java_lang_math_sqrt, // implementation of java.lang.Math.sqrt (x) | |
111 java_lang_math_log, // implementation of java.lang.Math.log (x) | |
112 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
|
113 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
|
114 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
|
115 java_lang_ref_reference_get, // implementation of java.lang.ref.Reference.get() |
0 | 116 number_of_method_entries, |
117 invalid = -1 | |
118 }; | |
119 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
120 // 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
|
121 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
|
122 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
|
123 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
|
124 else |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
125 return vmIntrinsics::_none; |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
126 } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
127 |
0 | 128 enum SomeConstants { |
129 number_of_result_handlers = 10 // number of result handlers for native calls | |
130 }; | |
131 | |
132 protected: | |
133 static StubQueue* _code; // the interpreter code (codelets) | |
134 | |
135 static bool _notice_safepoints; // true if safepoints are activated | |
136 | |
137 static address _native_entry_begin; // Region for native entry code | |
138 static address _native_entry_end; | |
139 | |
140 // method entry points | |
141 static address _entry_table[number_of_method_entries]; // entry points for a given method | |
142 static address _native_abi_to_tosca[number_of_result_handlers]; // for native method result handlers | |
143 static address _slow_signature_handler; // the native method generic (slow) signature handler | |
144 | |
145 static address _rethrow_exception_entry; // rethrows an activation in previous frame | |
146 | |
147 friend class AbstractInterpreterGenerator; | |
148 friend class InterpreterGenerator; | |
149 friend class InterpreterMacroAssembler; | |
150 | |
151 public: | |
152 // Initialization/debugging | |
153 static void initialize(); | |
154 static StubQueue* code() { return _code; } | |
155 | |
156 | |
157 // Method activation | |
158 static MethodKind method_kind(methodHandle m); | |
159 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
|
160 static address entry_for_method(methodHandle m) { return entry_for_kind(method_kind(m)); } |
0 | 161 |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
162 // used for bootstrapping method handles: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
163 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
|
164 |
0 | 165 static void print_method_kind(MethodKind kind) PRODUCT_RETURN; |
166 | |
1174
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
900
diff
changeset
|
167 static bool can_be_compiled(methodHandle m); |
ddb7834449d0
6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents:
900
diff
changeset
|
168 |
0 | 169 // Runtime support |
170 | |
171 // length = invoke bytecode length (to advance to next bytecode) | |
172 static address deopt_entry (TosState state, int length) { ShouldNotReachHere(); return NULL; } | |
173 static address return_entry (TosState state, int length) { ShouldNotReachHere(); return NULL; } | |
174 | |
175 static address rethrow_exception_entry() { return _rethrow_exception_entry; } | |
176 | |
177 // Activation size in words for a method that is just being called. | |
178 // 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
|
179 static int size_top_interpreter_activation(Method* method); |
0 | 180 |
181 // Deoptimization support | |
900
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
182 // Compute the entry address for continuation after |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
183 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
|
184 address bcp, |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
185 int callee_parameters, |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
186 bool is_top_frame); |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
187 // Compute the entry address for reexecution |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
188 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
|
189 // Deoptimization should reexecute this bytecode |
9987d9d5eb0e
6833129: specjvm98 fails with NullPointerException in the compiler with -XX:DeoptimizeALot
cfang
parents:
726
diff
changeset
|
190 static bool bytecode_should_reexecute(Bytecodes::Code code); |
0 | 191 |
192 // 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
|
193 static int size_activation(Method* method, |
0 | 194 int temps, |
195 int popframe_args, | |
196 int monitors, | |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
197 int caller_actual_parameters, |
0 | 198 int callee_params, |
199 int callee_locals, | |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
200 bool is_top_frame) { |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
201 return layout_activation(method, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
202 temps, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
203 popframe_args, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
204 monitors, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
205 caller_actual_parameters, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
206 callee_params, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
207 callee_locals, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
208 (frame*)NULL, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
209 (frame*)NULL, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
210 is_top_frame); |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
211 } |
0 | 212 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
213 static int layout_activation(Method* method, |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
214 int temps, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
215 int popframe_args, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
216 int monitors, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
217 int caller_actual_parameters, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
218 int callee_params, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
219 int callee_locals, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
220 frame* caller, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
221 frame* interpreter_frame, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
222 bool is_top_frame); |
0 | 223 |
224 // Runtime support | |
225 static bool is_not_reached( methodHandle method, int bci); | |
226 // Safepoint support | |
227 static void notice_safepoints() { ShouldNotReachHere(); } // stops the thread when reaching a safepoint | |
228 static void ignore_safepoints() { ShouldNotReachHere(); } // ignores safepoints | |
229 | |
230 // Support for native calls | |
231 static address slow_signature_handler() { return _slow_signature_handler; } | |
232 static address result_handler(BasicType type) { return _native_abi_to_tosca[BasicType_as_index(type)]; } | |
233 static int BasicType_as_index(BasicType type); // computes index into result_handler_by_index table | |
234 static bool in_native_entry(address pc) { return _native_entry_begin <= pc && pc < _native_entry_end; } | |
235 // Debugging/printing | |
236 static void print(); // prints the interpreter code | |
237 | |
238 public: | |
1506 | 239 // Interpreter helpers |
240 const static int stackElementWords = 1; | |
241 const static int stackElementSize = stackElementWords * wordSize; | |
242 const static int logStackElementSize = LogBytesPerWord; | |
0 | 243 |
244 // Local values relative to locals[n] | |
245 static int local_offset_in_bytes(int n) { | |
1506 | 246 return ((frame::interpreter_frame_expression_stack_direction() * n) * stackElementSize); |
0 | 247 } |
248 | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
249 // access to stacked values according to type: |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
250 static oop* oop_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
251 return (oop*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
252 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
253 static jint* int_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
254 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
|
255 // big-endian LP64 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
256 return (jint*)(slot_addr + 1) - 1; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
257 else |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
258 return (jint*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
259 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
260 static jlong long_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
261 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
262 return *(jlong*) slot_addr; |
1506 | 263 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
264 return Bytes::get_native_u8((address)slot_addr); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
265 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
266 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
267 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
|
268 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
269 *(jlong*) slot_addr = value; |
1506 | 270 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
271 Bytes::put_native_u8((address)slot_addr, value); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
272 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
273 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
274 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
|
275 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
276 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
|
277 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
|
278 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
|
279 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
|
280 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
|
281 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
|
282 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
|
283 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
|
284 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
|
285 default: ShouldNotReachHere(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
286 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
287 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
288 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
|
289 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
290 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
|
291 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
|
292 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
|
293 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
|
294 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
|
295 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
|
296 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
|
297 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
|
298 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
|
299 default: ShouldNotReachHere(); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
300 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
301 } |
0 | 302 }; |
303 | |
304 //------------------------------------------------------------------------------------------------------------------------ | |
305 // The interpreter generator. | |
306 | |
307 class Template; | |
308 class AbstractInterpreterGenerator: public StackObj { | |
309 protected: | |
310 InterpreterMacroAssembler* _masm; | |
311 | |
312 // shared code sequences | |
313 // Converter for native abi result to tosca result | |
314 address generate_result_handler_for(BasicType type); | |
315 address generate_slow_signature_handler(); | |
316 | |
317 // entry point generator | |
318 address generate_method_entry(AbstractInterpreter::MethodKind kind); | |
319 | |
320 void bang_stack_shadow_pages(bool native_call); | |
321 | |
322 void generate_all(); | |
323 | |
324 public: | |
325 AbstractInterpreterGenerator(StubQueue* _code); | |
326 }; | |
1972 | 327 |
328 #endif // SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP |