Mercurial > hg > truffle
annotate src/share/vm/interpreter/bytecodes.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 | beebba0acc11 |
children | 600c44255e5f |
rev | line source |
---|---|
0 | 1 /* |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
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:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
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:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_INTERPRETER_BYTECODES_HPP |
26 #define SHARE_VM_INTERPRETER_BYTECODES_HPP | |
27 | |
28 #include "memory/allocation.hpp" | |
29 #include "utilities/top.hpp" | |
30 | |
0 | 31 // Bytecodes specifies all bytecodes used in the VM and |
32 // provides utility functions to get bytecode attributes. | |
33 | |
34 // NOTE: replicated in SA in vm/agent/sun/jvm/hotspot/interpreter/Bytecodes.java | |
35 class Bytecodes: AllStatic { | |
36 public: | |
37 enum Code { | |
38 _illegal = -1, | |
39 | |
40 // Java bytecodes | |
41 _nop = 0, // 0x00 | |
42 _aconst_null = 1, // 0x01 | |
43 _iconst_m1 = 2, // 0x02 | |
44 _iconst_0 = 3, // 0x03 | |
45 _iconst_1 = 4, // 0x04 | |
46 _iconst_2 = 5, // 0x05 | |
47 _iconst_3 = 6, // 0x06 | |
48 _iconst_4 = 7, // 0x07 | |
49 _iconst_5 = 8, // 0x08 | |
50 _lconst_0 = 9, // 0x09 | |
51 _lconst_1 = 10, // 0x0a | |
52 _fconst_0 = 11, // 0x0b | |
53 _fconst_1 = 12, // 0x0c | |
54 _fconst_2 = 13, // 0x0d | |
55 _dconst_0 = 14, // 0x0e | |
56 _dconst_1 = 15, // 0x0f | |
57 _bipush = 16, // 0x10 | |
58 _sipush = 17, // 0x11 | |
59 _ldc = 18, // 0x12 | |
60 _ldc_w = 19, // 0x13 | |
61 _ldc2_w = 20, // 0x14 | |
62 _iload = 21, // 0x15 | |
63 _lload = 22, // 0x16 | |
64 _fload = 23, // 0x17 | |
65 _dload = 24, // 0x18 | |
66 _aload = 25, // 0x19 | |
67 _iload_0 = 26, // 0x1a | |
68 _iload_1 = 27, // 0x1b | |
69 _iload_2 = 28, // 0x1c | |
70 _iload_3 = 29, // 0x1d | |
71 _lload_0 = 30, // 0x1e | |
72 _lload_1 = 31, // 0x1f | |
73 _lload_2 = 32, // 0x20 | |
74 _lload_3 = 33, // 0x21 | |
75 _fload_0 = 34, // 0x22 | |
76 _fload_1 = 35, // 0x23 | |
77 _fload_2 = 36, // 0x24 | |
78 _fload_3 = 37, // 0x25 | |
79 _dload_0 = 38, // 0x26 | |
80 _dload_1 = 39, // 0x27 | |
81 _dload_2 = 40, // 0x28 | |
82 _dload_3 = 41, // 0x29 | |
83 _aload_0 = 42, // 0x2a | |
84 _aload_1 = 43, // 0x2b | |
85 _aload_2 = 44, // 0x2c | |
86 _aload_3 = 45, // 0x2d | |
87 _iaload = 46, // 0x2e | |
88 _laload = 47, // 0x2f | |
89 _faload = 48, // 0x30 | |
90 _daload = 49, // 0x31 | |
91 _aaload = 50, // 0x32 | |
92 _baload = 51, // 0x33 | |
93 _caload = 52, // 0x34 | |
94 _saload = 53, // 0x35 | |
95 _istore = 54, // 0x36 | |
96 _lstore = 55, // 0x37 | |
97 _fstore = 56, // 0x38 | |
98 _dstore = 57, // 0x39 | |
99 _astore = 58, // 0x3a | |
100 _istore_0 = 59, // 0x3b | |
101 _istore_1 = 60, // 0x3c | |
102 _istore_2 = 61, // 0x3d | |
103 _istore_3 = 62, // 0x3e | |
104 _lstore_0 = 63, // 0x3f | |
105 _lstore_1 = 64, // 0x40 | |
106 _lstore_2 = 65, // 0x41 | |
107 _lstore_3 = 66, // 0x42 | |
108 _fstore_0 = 67, // 0x43 | |
109 _fstore_1 = 68, // 0x44 | |
110 _fstore_2 = 69, // 0x45 | |
111 _fstore_3 = 70, // 0x46 | |
112 _dstore_0 = 71, // 0x47 | |
113 _dstore_1 = 72, // 0x48 | |
114 _dstore_2 = 73, // 0x49 | |
115 _dstore_3 = 74, // 0x4a | |
116 _astore_0 = 75, // 0x4b | |
117 _astore_1 = 76, // 0x4c | |
118 _astore_2 = 77, // 0x4d | |
119 _astore_3 = 78, // 0x4e | |
120 _iastore = 79, // 0x4f | |
121 _lastore = 80, // 0x50 | |
122 _fastore = 81, // 0x51 | |
123 _dastore = 82, // 0x52 | |
124 _aastore = 83, // 0x53 | |
125 _bastore = 84, // 0x54 | |
126 _castore = 85, // 0x55 | |
127 _sastore = 86, // 0x56 | |
128 _pop = 87, // 0x57 | |
129 _pop2 = 88, // 0x58 | |
130 _dup = 89, // 0x59 | |
131 _dup_x1 = 90, // 0x5a | |
132 _dup_x2 = 91, // 0x5b | |
133 _dup2 = 92, // 0x5c | |
134 _dup2_x1 = 93, // 0x5d | |
135 _dup2_x2 = 94, // 0x5e | |
136 _swap = 95, // 0x5f | |
137 _iadd = 96, // 0x60 | |
138 _ladd = 97, // 0x61 | |
139 _fadd = 98, // 0x62 | |
140 _dadd = 99, // 0x63 | |
141 _isub = 100, // 0x64 | |
142 _lsub = 101, // 0x65 | |
143 _fsub = 102, // 0x66 | |
144 _dsub = 103, // 0x67 | |
145 _imul = 104, // 0x68 | |
146 _lmul = 105, // 0x69 | |
147 _fmul = 106, // 0x6a | |
148 _dmul = 107, // 0x6b | |
149 _idiv = 108, // 0x6c | |
150 _ldiv = 109, // 0x6d | |
151 _fdiv = 110, // 0x6e | |
152 _ddiv = 111, // 0x6f | |
153 _irem = 112, // 0x70 | |
154 _lrem = 113, // 0x71 | |
155 _frem = 114, // 0x72 | |
156 _drem = 115, // 0x73 | |
157 _ineg = 116, // 0x74 | |
158 _lneg = 117, // 0x75 | |
159 _fneg = 118, // 0x76 | |
160 _dneg = 119, // 0x77 | |
161 _ishl = 120, // 0x78 | |
162 _lshl = 121, // 0x79 | |
163 _ishr = 122, // 0x7a | |
164 _lshr = 123, // 0x7b | |
165 _iushr = 124, // 0x7c | |
166 _lushr = 125, // 0x7d | |
167 _iand = 126, // 0x7e | |
168 _land = 127, // 0x7f | |
169 _ior = 128, // 0x80 | |
170 _lor = 129, // 0x81 | |
171 _ixor = 130, // 0x82 | |
172 _lxor = 131, // 0x83 | |
173 _iinc = 132, // 0x84 | |
174 _i2l = 133, // 0x85 | |
175 _i2f = 134, // 0x86 | |
176 _i2d = 135, // 0x87 | |
177 _l2i = 136, // 0x88 | |
178 _l2f = 137, // 0x89 | |
179 _l2d = 138, // 0x8a | |
180 _f2i = 139, // 0x8b | |
181 _f2l = 140, // 0x8c | |
182 _f2d = 141, // 0x8d | |
183 _d2i = 142, // 0x8e | |
184 _d2l = 143, // 0x8f | |
185 _d2f = 144, // 0x90 | |
186 _i2b = 145, // 0x91 | |
187 _i2c = 146, // 0x92 | |
188 _i2s = 147, // 0x93 | |
189 _lcmp = 148, // 0x94 | |
190 _fcmpl = 149, // 0x95 | |
191 _fcmpg = 150, // 0x96 | |
192 _dcmpl = 151, // 0x97 | |
193 _dcmpg = 152, // 0x98 | |
194 _ifeq = 153, // 0x99 | |
195 _ifne = 154, // 0x9a | |
196 _iflt = 155, // 0x9b | |
197 _ifge = 156, // 0x9c | |
198 _ifgt = 157, // 0x9d | |
199 _ifle = 158, // 0x9e | |
200 _if_icmpeq = 159, // 0x9f | |
201 _if_icmpne = 160, // 0xa0 | |
202 _if_icmplt = 161, // 0xa1 | |
203 _if_icmpge = 162, // 0xa2 | |
204 _if_icmpgt = 163, // 0xa3 | |
205 _if_icmple = 164, // 0xa4 | |
206 _if_acmpeq = 165, // 0xa5 | |
207 _if_acmpne = 166, // 0xa6 | |
208 _goto = 167, // 0xa7 | |
209 _jsr = 168, // 0xa8 | |
210 _ret = 169, // 0xa9 | |
211 _tableswitch = 170, // 0xaa | |
212 _lookupswitch = 171, // 0xab | |
213 _ireturn = 172, // 0xac | |
214 _lreturn = 173, // 0xad | |
215 _freturn = 174, // 0xae | |
216 _dreturn = 175, // 0xaf | |
217 _areturn = 176, // 0xb0 | |
218 _return = 177, // 0xb1 | |
219 _getstatic = 178, // 0xb2 | |
220 _putstatic = 179, // 0xb3 | |
221 _getfield = 180, // 0xb4 | |
222 _putfield = 181, // 0xb5 | |
223 _invokevirtual = 182, // 0xb6 | |
224 _invokespecial = 183, // 0xb7 | |
225 _invokestatic = 184, // 0xb8 | |
226 _invokeinterface = 185, // 0xb9 | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
470
diff
changeset
|
227 _invokedynamic = 186, // 0xba // if EnableInvokeDynamic |
0 | 228 _new = 187, // 0xbb |
229 _newarray = 188, // 0xbc | |
230 _anewarray = 189, // 0xbd | |
231 _arraylength = 190, // 0xbe | |
232 _athrow = 191, // 0xbf | |
233 _checkcast = 192, // 0xc0 | |
234 _instanceof = 193, // 0xc1 | |
235 _monitorenter = 194, // 0xc2 | |
236 _monitorexit = 195, // 0xc3 | |
237 _wide = 196, // 0xc4 | |
238 _multianewarray = 197, // 0xc5 | |
239 _ifnull = 198, // 0xc6 | |
240 _ifnonnull = 199, // 0xc7 | |
241 _goto_w = 200, // 0xc8 | |
242 _jsr_w = 201, // 0xc9 | |
243 _breakpoint = 202, // 0xca | |
244 | |
245 number_of_java_codes, | |
246 | |
247 // JVM bytecodes | |
248 _fast_agetfield = number_of_java_codes, | |
249 _fast_bgetfield , | |
250 _fast_cgetfield , | |
251 _fast_dgetfield , | |
252 _fast_fgetfield , | |
253 _fast_igetfield , | |
254 _fast_lgetfield , | |
255 _fast_sgetfield , | |
256 | |
257 _fast_aputfield , | |
258 _fast_bputfield , | |
259 _fast_cputfield , | |
260 _fast_dputfield , | |
261 _fast_fputfield , | |
262 _fast_iputfield , | |
263 _fast_lputfield , | |
264 _fast_sputfield , | |
265 | |
266 _fast_aload_0 , | |
267 _fast_iaccess_0 , | |
268 _fast_aaccess_0 , | |
269 _fast_faccess_0 , | |
270 | |
271 _fast_iload , | |
272 _fast_iload2 , | |
273 _fast_icaload , | |
274 | |
275 _fast_invokevfinal , | |
276 _fast_linearswitch , | |
277 _fast_binaryswitch , | |
278 | |
1602 | 279 // special handling of oop constants: |
280 _fast_aldc , | |
281 _fast_aldc_w , | |
282 | |
0 | 283 _return_register_finalizer , |
284 | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3897
diff
changeset
|
285 // special handling of signature-polymorphic methods: |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3897
diff
changeset
|
286 _invokehandle , |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3897
diff
changeset
|
287 |
0 | 288 _shouldnotreachhere, // For debugging |
289 | |
290 // Platform specific JVM bytecodes | |
1972 | 291 #ifdef TARGET_ARCH_x86 |
292 # include "bytecodes_x86.hpp" | |
293 #endif | |
294 #ifdef TARGET_ARCH_sparc | |
295 # include "bytecodes_sparc.hpp" | |
296 #endif | |
297 #ifdef TARGET_ARCH_zero | |
298 # include "bytecodes_zero.hpp" | |
299 #endif | |
2192
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
300 #ifdef TARGET_ARCH_arm |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
301 # include "bytecodes_arm.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
302 #endif |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
303 #ifdef TARGET_ARCH_ppc |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
304 # include "bytecodes_ppc.hpp" |
b92c45f2bc75
7016023: Enable building ARM and PPC from src/closed repository
bobv
parents:
2142
diff
changeset
|
305 #endif |
1972 | 306 |
0 | 307 |
308 number_of_codes | |
309 }; | |
310 | |
1565 | 311 // Flag bits derived from format strings, can_trap, can_rewrite, etc.: |
312 enum Flags { | |
313 // semantic flags: | |
314 _bc_can_trap = 1<<0, // bytecode execution can trap or block | |
315 _bc_can_rewrite = 1<<1, // bytecode execution has an alternate form | |
316 | |
317 // format bits (determined only by the format string): | |
318 _fmt_has_c = 1<<2, // constant, such as sipush "bcc" | |
319 _fmt_has_j = 1<<3, // constant pool cache index, such as getfield "bjj" | |
320 _fmt_has_k = 1<<4, // constant pool index, such as ldc "bk" | |
321 _fmt_has_i = 1<<5, // local index, such as iload | |
322 _fmt_has_o = 1<<6, // offset, such as ifeq | |
323 _fmt_has_nbo = 1<<7, // contains native-order field(s) | |
324 _fmt_has_u2 = 1<<8, // contains double-byte field(s) | |
325 _fmt_has_u4 = 1<<9, // contains quad-byte field | |
326 _fmt_not_variable = 1<<10, // not of variable length (simple or wide) | |
327 _fmt_not_simple = 1<<11, // either wide or variable length | |
328 _all_fmt_bits = (_fmt_not_simple*2 - _fmt_has_c), | |
329 | |
330 // Example derived format syndromes: | |
331 _fmt_b = _fmt_not_variable, | |
332 _fmt_bc = _fmt_b | _fmt_has_c, | |
333 _fmt_bi = _fmt_b | _fmt_has_i, | |
334 _fmt_bkk = _fmt_b | _fmt_has_k | _fmt_has_u2, | |
335 _fmt_bJJ = _fmt_b | _fmt_has_j | _fmt_has_u2 | _fmt_has_nbo, | |
336 _fmt_bo2 = _fmt_b | _fmt_has_o | _fmt_has_u2, | |
337 _fmt_bo4 = _fmt_b | _fmt_has_o | _fmt_has_u4 | |
338 }; | |
339 | |
0 | 340 private: |
341 static bool _is_initialized; | |
342 static const char* _name [number_of_codes]; | |
343 static BasicType _result_type [number_of_codes]; | |
344 static s_char _depth [number_of_codes]; | |
1565 | 345 static u_char _lengths [number_of_codes]; |
0 | 346 static Code _java_code [number_of_codes]; |
1565 | 347 static jchar _flags [(1<<BitsPerByte)*2]; // all second page for wide formats |
0 | 348 |
349 static void def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap); | |
350 static void def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap, Code java_code); | |
351 static void pd_initialize(); // platform specific initialization | |
352 static Code pd_base_code_for(Code code); // platform specific base_code_for implementation | |
353 | |
2142 | 354 // Verify that bcp points into method |
355 #ifdef ASSERT | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
356 static bool check_method(const Method* method, address bcp); |
2142 | 357 #endif |
358 static bool check_must_rewrite(Bytecodes::Code bc); | |
359 | |
0 | 360 public: |
361 // Conversion | |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3897
diff
changeset
|
362 static void check (Code code) { assert(is_defined(code), err_msg("illegal code: %d", (int)code)); } |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
3897
diff
changeset
|
363 static void wide_check (Code code) { assert(wide_is_defined(code), err_msg("illegal code: %d", (int)code)); } |
0 | 364 static Code cast (int code) { return (Code)code; } |
365 | |
366 | |
2142 | 367 // Fetch a bytecode, hiding breakpoints as necessary. The method |
368 // argument is used for conversion of breakpoints into the original | |
369 // bytecode. The CI uses these methods but guarantees that | |
370 // breakpoints are hidden so the method argument should be passed as | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
371 // NULL since in that case the bcp and Method* are unrelated |
2142 | 372 // memory. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
373 static Code code_at(const Method* method, address bcp) { |
2142 | 374 assert(method == NULL || check_method(method, bcp), "bcp must point into method"); |
375 Code code = cast(*bcp); | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
376 assert(code != _breakpoint || method != NULL, "need Method* to decode breakpoint"); |
2142 | 377 return (code != _breakpoint) ? code : non_breakpoint_code_at(method, bcp); |
378 } | |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
379 static Code java_code_at(const Method* method, address bcp) { |
2142 | 380 return java_code(code_at(method, bcp)); |
381 } | |
0 | 382 |
2142 | 383 // Fetch a bytecode or a breakpoint: |
384 static Code code_or_bp_at(address bcp) { return (Code)cast(*bcp); } | |
0 | 385 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
386 static Code code_at(Method* method, int bci); |
2142 | 387 static bool is_active_breakpoint_at(address bcp) { return (Code)*bcp == _breakpoint; } |
0 | 388 |
2142 | 389 // find a bytecode, behind a breakpoint if necessary: |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
390 static Code non_breakpoint_code_at(const Method* method, address bcp); |
0 | 391 |
392 // Bytecode attributes | |
1565 | 393 static bool is_defined (int code) { return 0 <= code && code < number_of_codes && flags(code, false) != 0; } |
394 static bool wide_is_defined(int code) { return is_defined(code) && flags(code, true) != 0; } | |
0 | 395 static const char* name (Code code) { check(code); return _name [code]; } |
396 static BasicType result_type (Code code) { check(code); return _result_type [code]; } | |
397 static int depth (Code code) { check(code); return _depth [code]; } | |
1570 | 398 // Note: Length functions must return <=0 for invalid bytecodes. |
399 // Calling check(code) in length functions would throw an unwanted assert. | |
400 static int length_for (Code code) { /*no check*/ return _lengths [code] & 0xF; } | |
401 static int wide_length_for(Code code) { /*no check*/ return _lengths [code] >> 4; } | |
1565 | 402 static bool can_trap (Code code) { check(code); return has_all_flags(code, _bc_can_trap, false); } |
0 | 403 static Code java_code (Code code) { check(code); return _java_code [code]; } |
1565 | 404 static bool can_rewrite (Code code) { check(code); return has_all_flags(code, _bc_can_rewrite, false); } |
2142 | 405 static bool must_rewrite(Bytecodes::Code code) { return can_rewrite(code) && check_must_rewrite(code); } |
1565 | 406 static bool native_byte_order(Code code) { check(code); return has_all_flags(code, _fmt_has_nbo, false); } |
407 static bool uses_cp_cache (Code code) { check(code); return has_all_flags(code, _fmt_has_j, false); } | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
408 // if 'end' is provided, it indicates the end of the code buffer which |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
409 // should not be read past when parsing. |
2142 | 410 static int special_length_at(Bytecodes::Code code, address bcp, address end = NULL); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
411 static int special_length_at(Method* method, address bcp, address end = NULL) { return special_length_at(code_at(method, bcp), bcp, end); } |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
412 static int raw_special_length_at(address bcp, address end = NULL); |
2142 | 413 static int length_for_code_at(Bytecodes::Code code, address bcp) { int l = length_for(code); return l > 0 ? l : special_length_at(code, bcp); } |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
414 static int length_at (Method* method, address bcp) { return length_for_code_at(code_at(method, bcp), bcp); } |
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6634
diff
changeset
|
415 static int java_length_at (Method* method, address bcp) { return length_for_code_at(java_code_at(method, bcp), bcp); } |
0 | 416 static bool is_java_code (Code code) { return 0 <= code && code < number_of_java_codes; } |
417 | |
418 static bool is_aload (Code code) { return (code == _aload || code == _aload_0 || code == _aload_1 | |
419 || code == _aload_2 || code == _aload_3); } | |
420 static bool is_astore (Code code) { return (code == _astore || code == _astore_0 || code == _astore_1 | |
421 || code == _astore_2 || code == _astore_3); } | |
422 | |
423 static bool is_zero_const (Code code) { return (code == _aconst_null || code == _iconst_0 | |
424 || code == _fconst_0 || code == _dconst_0); } | |
3897
de847cac9235
7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents:
2192
diff
changeset
|
425 static bool is_invoke (Code code) { return (_invokevirtual <= code && code <= _invokedynamic); } |
7194
beebba0acc11
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
6725
diff
changeset
|
426 static bool has_receiver (Code code) { assert(is_invoke(code), ""); return code == _invokevirtual || |
beebba0acc11
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
6725
diff
changeset
|
427 code == _invokespecial || |
beebba0acc11
7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents:
6725
diff
changeset
|
428 code == _invokeinterface; } |
6634
7f813940ac35
7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents:
6266
diff
changeset
|
429 static bool has_optional_appendix(Code code) { return code == _invokedynamic || code == _invokehandle; } |
7f813940ac35
7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents:
6266
diff
changeset
|
430 |
1565 | 431 static int compute_flags (const char* format, int more_flags = 0); // compute the flags |
432 static int flags (int code, bool is_wide) { | |
433 assert(code == (u_char)code, "must be a byte"); | |
434 return _flags[code + (is_wide ? (1<<BitsPerByte) : 0)]; | |
435 } | |
436 static int format_bits (Code code, bool is_wide) { return flags(code, is_wide) & _all_fmt_bits; } | |
437 static bool has_all_flags (Code code, int test_flags, bool is_wide) { | |
438 return (flags(code, is_wide) & test_flags) == test_flags; | |
439 } | |
440 | |
0 | 441 // Initialization |
442 static void initialize (); | |
443 }; | |
1972 | 444 |
445 #endif // SHARE_VM_INTERPRETER_BYTECODES_HPP |