Mercurial > hg > truffle
annotate src/share/vm/interpreter/abstractInterpreter.hpp @ 20543:e7d0505c8a30
8059758: Footprint regressions with JDK-8038423
Summary: Changes in JDK-8038423 always initialize (zero out) virtual memory used for auxiliary data structures. This causes a footprint regression for G1 in startup benchmarks. This is because they do not touch that memory at all, so the operating system does not actually commit these pages. The fix is to, if the initialization value of the data structures matches the default value of just committed memory (=0), do not do anything.
Reviewed-by: jwilhelm, brutisso
author | tschatzl |
---|---|
date | Fri, 10 Oct 2014 15:51:58 +0200 |
parents | 0bf37f737702 |
children | 52b4284cb496 |
rev | line source |
---|---|
0 | 1 /* |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8727
diff
changeset
|
2 * Copyright (c) 1997, 2013, 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" | |
12962
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
11080
diff
changeset
|
33 #ifdef TARGET_ARCH_x86 |
5ccbab1c69f3
8026251: New type profiling points: parameters to methods
roland
parents:
11080
diff
changeset
|
34 # include "interp_masm_x86.hpp" |
1972 | 35 #endif |
36 #ifdef TARGET_ARCH_MODEL_sparc | |
37 # include "interp_masm_sparc.hpp" | |
38 #endif | |
39 #ifdef TARGET_ARCH_MODEL_zero | |
40 # include "interp_masm_zero.hpp" | |
41 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
42 #ifdef TARGET_ARCH_MODEL_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
43 # include "interp_masm_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
1972
diff
changeset
|
44 #endif |
14391 | 45 #ifdef TARGET_ARCH_MODEL_ppc_32 |
46 # include "interp_masm_ppc_32.hpp" | |
47 #endif | |
48 #ifdef TARGET_ARCH_MODEL_ppc_64 | |
49 # include "interp_masm_ppc_64.hpp" | |
2192
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 | |
88 empty, // empty method (code: _return) | |
89 accessor, // accessor method (code: _aload_0, _getfield, _(a|i)return) | |
90 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
|
91 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
|
92 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
|
93 + (vmIntrinsics::LAST_MH_SIG_POLY |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6084
diff
changeset
|
94 - vmIntrinsics::FIRST_MH_SIG_POLY)), |
0 | 95 java_lang_math_sin, // implementation of java.lang.Math.sin (x) |
96 java_lang_math_cos, // implementation of java.lang.Math.cos (x) | |
97 java_lang_math_tan, // implementation of java.lang.Math.tan (x) | |
98 java_lang_math_abs, // implementation of java.lang.Math.abs (x) | |
99 java_lang_math_sqrt, // implementation of java.lang.Math.sqrt (x) | |
100 java_lang_math_log, // implementation of java.lang.Math.log (x) | |
101 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
|
102 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
|
103 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
|
104 java_lang_ref_reference_get, // implementation of java.lang.ref.Reference.get() |
11080
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8727
diff
changeset
|
105 java_util_zip_CRC32_update, // implementation of java.util.zip.CRC32.update() |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8727
diff
changeset
|
106 java_util_zip_CRC32_updateBytes, // implementation of java.util.zip.CRC32.updateBytes() |
b800986664f4
7088419: Use x86 Hardware CRC32 Instruction with java.util.zip.CRC32
drchase
parents:
8727
diff
changeset
|
107 java_util_zip_CRC32_updateByteBuffer, // implementation of java.util.zip.CRC32.updateByteBuffer() |
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) | |
13010
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
12962
diff
changeset
|
164 static address deopt_entry(TosState state, int length) { ShouldNotReachHere(); return NULL; } |
bd3237e0e18d
8026328: Setting a breakpoint on invokedynamic crashes the JVM
twisti
parents:
12962
diff
changeset
|
165 static address return_entry(TosState state, int length, Bytecodes::Code code) { ShouldNotReachHere(); return NULL; } |
0 | 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 |
17980
0bf37f737702
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
14422
diff
changeset
|
184 // deoptimization support |
0bf37f737702
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
14422
diff
changeset
|
185 static int size_activation(int max_stack, |
0 | 186 int temps, |
17980
0bf37f737702
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
14422
diff
changeset
|
187 int extra_args, |
0 | 188 int monitors, |
189 int callee_params, | |
190 int callee_locals, | |
17980
0bf37f737702
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
14422
diff
changeset
|
191 bool is_top_frame); |
0 | 192 |
17980
0bf37f737702
8032410: compiler/uncommontrap/TestStackBangRbp.java times out on Solaris-Sparc V9
roland
parents:
14422
diff
changeset
|
193 static void layout_activation(Method* method, |
3369
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
194 int temps, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
195 int popframe_args, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
196 int monitors, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
197 int caller_actual_parameters, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
198 int callee_params, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
199 int callee_locals, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
200 frame* caller, |
3d2ab563047a
7043461: VM crashes in void LinkResolver::runtime_resolve_virtual_method
never
parents:
3249
diff
changeset
|
201 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
|
202 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
|
203 bool is_bottom_frame); |
0 | 204 |
205 // Runtime support | |
206 static bool is_not_reached( methodHandle method, int bci); | |
207 // Safepoint support | |
208 static void notice_safepoints() { ShouldNotReachHere(); } // stops the thread when reaching a safepoint | |
209 static void ignore_safepoints() { ShouldNotReachHere(); } // ignores safepoints | |
210 | |
211 // Support for native calls | |
212 static address slow_signature_handler() { return _slow_signature_handler; } | |
213 static address result_handler(BasicType type) { return _native_abi_to_tosca[BasicType_as_index(type)]; } | |
214 static int BasicType_as_index(BasicType type); // computes index into result_handler_by_index table | |
215 static bool in_native_entry(address pc) { return _native_entry_begin <= pc && pc < _native_entry_end; } | |
216 // Debugging/printing | |
217 static void print(); // prints the interpreter code | |
218 | |
219 public: | |
1506 | 220 // Interpreter helpers |
221 const static int stackElementWords = 1; | |
222 const static int stackElementSize = stackElementWords * wordSize; | |
223 const static int logStackElementSize = LogBytesPerWord; | |
0 | 224 |
225 // Local values relative to locals[n] | |
226 static int local_offset_in_bytes(int n) { | |
1506 | 227 return ((frame::interpreter_frame_expression_stack_direction() * n) * stackElementSize); |
0 | 228 } |
229 | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
230 // access to stacked values according to type: |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
231 static oop* oop_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
232 return (oop*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
233 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
234 static jint* int_addr_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
235 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
|
236 // big-endian LP64 |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
237 return (jint*)(slot_addr + 1) - 1; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
238 else |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
239 return (jint*) slot_addr; |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
240 } |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
241 static jlong long_in_slot(intptr_t* slot_addr) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
242 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
243 return *(jlong*) slot_addr; |
1506 | 244 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
245 return Bytes::get_native_u8((address)slot_addr); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
246 } |
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 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
|
249 if (sizeof(intptr_t) >= sizeof(jlong)) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
250 *(jlong*) slot_addr = value; |
1506 | 251 } else { |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
252 Bytes::put_native_u8((address)slot_addr, value); |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
253 } |
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 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
|
256 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
257 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
|
258 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
|
259 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
|
260 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
|
261 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
|
262 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
|
263 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
|
264 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
|
265 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
|
266 default: ShouldNotReachHere(); |
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 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
|
270 switch (type) { |
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
710
diff
changeset
|
271 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
|
272 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
|
273 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
|
274 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
|
275 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
|
276 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
|
277 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
|
278 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
|
279 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
|
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 } |
0 | 283 }; |
284 | |
285 //------------------------------------------------------------------------------------------------------------------------ | |
286 // The interpreter generator. | |
287 | |
288 class Template; | |
289 class AbstractInterpreterGenerator: public StackObj { | |
290 protected: | |
291 InterpreterMacroAssembler* _masm; | |
292 | |
293 // shared code sequences | |
294 // Converter for native abi result to tosca result | |
295 address generate_result_handler_for(BasicType type); | |
296 address generate_slow_signature_handler(); | |
297 | |
298 // entry point generator | |
299 address generate_method_entry(AbstractInterpreter::MethodKind kind); | |
300 | |
301 void bang_stack_shadow_pages(bool native_call); | |
302 | |
303 void generate_all(); | |
6926 | 304 void initialize_method_handle_entries(); |
0 | 305 |
306 public: | |
307 AbstractInterpreterGenerator(StubQueue* _code); | |
308 }; | |
1972 | 309 |
310 #endif // SHARE_VM_INTERPRETER_ABSTRACTINTERPRETER_HPP |