Mercurial > hg > truffle
annotate src/share/vm/interpreter/bytecodes.cpp @ 1145:e018e6884bd8
6631166: CMS: better heuristics when combatting fragmentation
Summary: Autonomic per-worker free block cache sizing, tunable coalition policies, fixes to per-size block statistics, retuned gain and bandwidth of some feedback loop filters to allow quicker reactivity to abrupt changes in ambient demand, and other heuristics to reduce fragmentation of the CMS old gen. Also tightened some assertions, including those related to locking.
Reviewed-by: jmasa
author | ysr |
---|---|
date | Wed, 23 Dec 2009 09:23:54 -0800 |
parents | bd02caa94611 |
children | e66fd840cb6b |
rev | line source |
---|---|
0 | 1 /* |
844 | 2 * Copyright 1997-2009 Sun Microsystems, Inc. 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 * | |
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, | |
20 * CA 95054 USA or visit www.sun.com if you need additional information or | |
21 * have any questions. | |
22 * | |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_bytecodes.cpp.incl" | |
27 | |
28 | |
29 // Windows AMD64 Compiler Hangs compiling this file | |
30 // unless optimization is off | |
31 #ifdef _M_AMD64 | |
32 #pragma optimize ("", off) | |
33 #endif | |
34 | |
35 | |
36 bool Bytecodes::_is_initialized = false; | |
37 const char* Bytecodes::_name [Bytecodes::number_of_codes]; | |
38 const char* Bytecodes::_format [Bytecodes::number_of_codes]; | |
39 const char* Bytecodes::_wide_format [Bytecodes::number_of_codes]; | |
40 BasicType Bytecodes::_result_type [Bytecodes::number_of_codes]; | |
41 s_char Bytecodes::_depth [Bytecodes::number_of_codes]; | |
42 u_char Bytecodes::_length [Bytecodes::number_of_codes]; | |
43 bool Bytecodes::_can_trap [Bytecodes::number_of_codes]; | |
44 Bytecodes::Code Bytecodes::_java_code [Bytecodes::number_of_codes]; | |
45 bool Bytecodes::_can_rewrite [Bytecodes::number_of_codes]; | |
46 | |
47 | |
48 Bytecodes::Code Bytecodes::code_at(methodOop method, int bci) { | |
49 return code_at(method->bcp_from(bci), method); | |
50 } | |
51 | |
52 Bytecodes::Code Bytecodes::non_breakpoint_code_at(address bcp, methodOop method) { | |
53 if (method == NULL) method = methodOopDesc::method_from_bcp(bcp); | |
54 return method->orig_bytecode_at(method->bci_from(bcp)); | |
55 } | |
56 | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
57 int Bytecodes::special_length_at(address bcp, address end) { |
0 | 58 Code code = code_at(bcp); |
59 switch (code) { | |
60 case _wide: | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
61 if (end != NULL && bcp + 1 >= end) { |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
62 return -1; // don't read past end of code buffer |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
63 } |
0 | 64 return wide_length_for(cast(*(bcp + 1))); |
65 case _tableswitch: | |
66 { address aligned_bcp = (address)round_to((intptr_t)bcp + 1, jintSize); | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
67 if (end != NULL && aligned_bcp + 3*jintSize >= end) { |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
68 return -1; // don't read past end of code buffer |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
69 } |
0 | 70 jlong lo = (jint)Bytes::get_Java_u4(aligned_bcp + 1*jintSize); |
71 jlong hi = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); | |
72 jlong len = (aligned_bcp - bcp) + (3 + hi - lo + 1)*jintSize; | |
73 // only return len if it can be represented as a positive int; | |
74 // return -1 otherwise | |
75 return (len > 0 && len == (int)len) ? len : -1; | |
76 } | |
77 | |
78 case _lookupswitch: // fall through | |
79 case _fast_binaryswitch: // fall through | |
80 case _fast_linearswitch: | |
81 { address aligned_bcp = (address)round_to((intptr_t)bcp + 1, jintSize); | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
82 if (end != NULL && aligned_bcp + 2*jintSize >= end) { |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
83 return -1; // don't read past end of code buffer |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
84 } |
0 | 85 jlong npairs = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); |
86 jlong len = (aligned_bcp - bcp) + (2 + 2*npairs)*jintSize; | |
87 // only return len if it can be represented as a positive int; | |
88 // return -1 otherwise | |
89 return (len > 0 && len == (int)len) ? len : -1; | |
90 } | |
91 } | |
92 return 0; | |
93 } | |
94 | |
95 // At a breakpoint instruction, this returns the breakpoint's length, | |
96 // otherwise, it's the same as special_length_at(). This is used by | |
97 // the RawByteCodeStream, which wants to see the actual bytecode | |
98 // values (including breakpoint). RawByteCodeStream is used by the | |
99 // verifier when reading in bytecode to verify. Other mechanisms that | |
100 // run at runtime (such as generateOopMaps) need to iterate over the code | |
101 // and don't expect to see breakpoints: they want to see the instruction | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
102 // which was replaced so that they can get the correct length and find |
0 | 103 // the next bytecode. |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
104 // |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
105 // 'end' indicates the end of the code buffer, which we should not try to read |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
106 // past. |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
107 int Bytecodes::raw_special_length_at(address bcp, address end) { |
0 | 108 Code code = code_or_bp_at(bcp); |
109 if (code == _breakpoint) { | |
110 return 1; | |
111 } else { | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
112 return special_length_at(bcp, end); |
0 | 113 } |
114 } | |
115 | |
116 | |
117 | |
118 void Bytecodes::def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap) { | |
119 def(code, name, format, wide_format, result_type, depth, can_trap, code); | |
120 } | |
121 | |
122 | |
123 void Bytecodes::def(Code code, const char* name, const char* format, const char* wide_format, BasicType result_type, int depth, bool can_trap, Code java_code) { | |
124 assert(wide_format == NULL || format != NULL, "short form must exist if there's a wide form"); | |
125 _name [code] = name; | |
126 _format [code] = format; | |
127 _wide_format [code] = wide_format; | |
128 _result_type [code] = result_type; | |
129 _depth [code] = depth; | |
130 _can_trap [code] = can_trap; | |
131 _length [code] = format != NULL ? (u_char)strlen(format) : 0; | |
132 _java_code [code] = java_code; | |
133 if (java_code != code) _can_rewrite[java_code] = true; | |
134 } | |
135 | |
136 | |
137 // Format strings interpretation: | |
138 // | |
139 // b: bytecode | |
140 // c: signed constant, Java byte-ordering | |
141 // i: unsigned index , Java byte-ordering | |
142 // j: unsigned index , native byte-ordering | |
143 // o: branch offset , Java byte-ordering | |
144 // _: unused/ignored | |
145 // w: wide bytecode | |
146 // | |
147 // Note: Right now the format strings are used for 2 purposes: | |
148 // 1. to specify the length of the bytecode | |
149 // (= number of characters in format string) | |
150 // 2. to specify the bytecode attributes | |
151 // | |
152 // The bytecode attributes are currently used only for bytecode tracing | |
153 // (see BytecodeTracer); thus if more specific format information is | |
154 // used, one would also have to adjust the bytecode tracer. | |
155 // | |
156 // Note: For bytecodes with variable length, the format string is the empty string. | |
157 | |
158 void Bytecodes::initialize() { | |
159 if (_is_initialized) return; | |
160 assert(number_of_codes <= 256, "too many bytecodes"); | |
161 | |
162 // initialize bytecode tables - didn't use static array initializers | |
163 // (such as {}) so we can do additional consistency checks and init- | |
164 // code is independent of actual bytecode numbering. | |
165 // | |
166 // Note 1: NULL for the format string means the bytecode doesn't exist | |
167 // in that form. | |
168 // | |
169 // Note 2: The result type is T_ILLEGAL for bytecodes where the top of stack | |
170 // type after execution is not only determined by the bytecode itself. | |
171 | |
172 // Java bytecodes | |
173 // bytecode bytecode name format wide f. result tp stk traps | |
174 def(_nop , "nop" , "b" , NULL , T_VOID , 0, false); | |
175 def(_aconst_null , "aconst_null" , "b" , NULL , T_OBJECT , 1, false); | |
176 def(_iconst_m1 , "iconst_m1" , "b" , NULL , T_INT , 1, false); | |
177 def(_iconst_0 , "iconst_0" , "b" , NULL , T_INT , 1, false); | |
178 def(_iconst_1 , "iconst_1" , "b" , NULL , T_INT , 1, false); | |
179 def(_iconst_2 , "iconst_2" , "b" , NULL , T_INT , 1, false); | |
180 def(_iconst_3 , "iconst_3" , "b" , NULL , T_INT , 1, false); | |
181 def(_iconst_4 , "iconst_4" , "b" , NULL , T_INT , 1, false); | |
182 def(_iconst_5 , "iconst_5" , "b" , NULL , T_INT , 1, false); | |
183 def(_lconst_0 , "lconst_0" , "b" , NULL , T_LONG , 2, false); | |
184 def(_lconst_1 , "lconst_1" , "b" , NULL , T_LONG , 2, false); | |
185 def(_fconst_0 , "fconst_0" , "b" , NULL , T_FLOAT , 1, false); | |
186 def(_fconst_1 , "fconst_1" , "b" , NULL , T_FLOAT , 1, false); | |
187 def(_fconst_2 , "fconst_2" , "b" , NULL , T_FLOAT , 1, false); | |
188 def(_dconst_0 , "dconst_0" , "b" , NULL , T_DOUBLE , 2, false); | |
189 def(_dconst_1 , "dconst_1" , "b" , NULL , T_DOUBLE , 2, false); | |
190 def(_bipush , "bipush" , "bc" , NULL , T_INT , 1, false); | |
191 def(_sipush , "sipush" , "bcc" , NULL , T_INT , 1, false); | |
192 def(_ldc , "ldc" , "bi" , NULL , T_ILLEGAL, 1, true ); | |
193 def(_ldc_w , "ldc_w" , "bii" , NULL , T_ILLEGAL, 1, true ); | |
194 def(_ldc2_w , "ldc2_w" , "bii" , NULL , T_ILLEGAL, 2, true ); | |
195 def(_iload , "iload" , "bi" , "wbii" , T_INT , 1, false); | |
196 def(_lload , "lload" , "bi" , "wbii" , T_LONG , 2, false); | |
197 def(_fload , "fload" , "bi" , "wbii" , T_FLOAT , 1, false); | |
198 def(_dload , "dload" , "bi" , "wbii" , T_DOUBLE , 2, false); | |
199 def(_aload , "aload" , "bi" , "wbii" , T_OBJECT , 1, false); | |
200 def(_iload_0 , "iload_0" , "b" , NULL , T_INT , 1, false); | |
201 def(_iload_1 , "iload_1" , "b" , NULL , T_INT , 1, false); | |
202 def(_iload_2 , "iload_2" , "b" , NULL , T_INT , 1, false); | |
203 def(_iload_3 , "iload_3" , "b" , NULL , T_INT , 1, false); | |
204 def(_lload_0 , "lload_0" , "b" , NULL , T_LONG , 2, false); | |
205 def(_lload_1 , "lload_1" , "b" , NULL , T_LONG , 2, false); | |
206 def(_lload_2 , "lload_2" , "b" , NULL , T_LONG , 2, false); | |
207 def(_lload_3 , "lload_3" , "b" , NULL , T_LONG , 2, false); | |
208 def(_fload_0 , "fload_0" , "b" , NULL , T_FLOAT , 1, false); | |
209 def(_fload_1 , "fload_1" , "b" , NULL , T_FLOAT , 1, false); | |
210 def(_fload_2 , "fload_2" , "b" , NULL , T_FLOAT , 1, false); | |
211 def(_fload_3 , "fload_3" , "b" , NULL , T_FLOAT , 1, false); | |
212 def(_dload_0 , "dload_0" , "b" , NULL , T_DOUBLE , 2, false); | |
213 def(_dload_1 , "dload_1" , "b" , NULL , T_DOUBLE , 2, false); | |
214 def(_dload_2 , "dload_2" , "b" , NULL , T_DOUBLE , 2, false); | |
215 def(_dload_3 , "dload_3" , "b" , NULL , T_DOUBLE , 2, false); | |
216 def(_aload_0 , "aload_0" , "b" , NULL , T_OBJECT , 1, true ); // rewriting in interpreter | |
217 def(_aload_1 , "aload_1" , "b" , NULL , T_OBJECT , 1, false); | |
218 def(_aload_2 , "aload_2" , "b" , NULL , T_OBJECT , 1, false); | |
219 def(_aload_3 , "aload_3" , "b" , NULL , T_OBJECT , 1, false); | |
220 def(_iaload , "iaload" , "b" , NULL , T_INT , -1, true ); | |
221 def(_laload , "laload" , "b" , NULL , T_LONG , 0, true ); | |
222 def(_faload , "faload" , "b" , NULL , T_FLOAT , -1, true ); | |
223 def(_daload , "daload" , "b" , NULL , T_DOUBLE , 0, true ); | |
224 def(_aaload , "aaload" , "b" , NULL , T_OBJECT , -1, true ); | |
225 def(_baload , "baload" , "b" , NULL , T_INT , -1, true ); | |
226 def(_caload , "caload" , "b" , NULL , T_INT , -1, true ); | |
227 def(_saload , "saload" , "b" , NULL , T_INT , -1, true ); | |
228 def(_istore , "istore" , "bi" , "wbii" , T_VOID , -1, false); | |
229 def(_lstore , "lstore" , "bi" , "wbii" , T_VOID , -2, false); | |
230 def(_fstore , "fstore" , "bi" , "wbii" , T_VOID , -1, false); | |
231 def(_dstore , "dstore" , "bi" , "wbii" , T_VOID , -2, false); | |
232 def(_astore , "astore" , "bi" , "wbii" , T_VOID , -1, false); | |
233 def(_istore_0 , "istore_0" , "b" , NULL , T_VOID , -1, false); | |
234 def(_istore_1 , "istore_1" , "b" , NULL , T_VOID , -1, false); | |
235 def(_istore_2 , "istore_2" , "b" , NULL , T_VOID , -1, false); | |
236 def(_istore_3 , "istore_3" , "b" , NULL , T_VOID , -1, false); | |
237 def(_lstore_0 , "lstore_0" , "b" , NULL , T_VOID , -2, false); | |
238 def(_lstore_1 , "lstore_1" , "b" , NULL , T_VOID , -2, false); | |
239 def(_lstore_2 , "lstore_2" , "b" , NULL , T_VOID , -2, false); | |
240 def(_lstore_3 , "lstore_3" , "b" , NULL , T_VOID , -2, false); | |
241 def(_fstore_0 , "fstore_0" , "b" , NULL , T_VOID , -1, false); | |
242 def(_fstore_1 , "fstore_1" , "b" , NULL , T_VOID , -1, false); | |
243 def(_fstore_2 , "fstore_2" , "b" , NULL , T_VOID , -1, false); | |
244 def(_fstore_3 , "fstore_3" , "b" , NULL , T_VOID , -1, false); | |
245 def(_dstore_0 , "dstore_0" , "b" , NULL , T_VOID , -2, false); | |
246 def(_dstore_1 , "dstore_1" , "b" , NULL , T_VOID , -2, false); | |
247 def(_dstore_2 , "dstore_2" , "b" , NULL , T_VOID , -2, false); | |
248 def(_dstore_3 , "dstore_3" , "b" , NULL , T_VOID , -2, false); | |
249 def(_astore_0 , "astore_0" , "b" , NULL , T_VOID , -1, false); | |
250 def(_astore_1 , "astore_1" , "b" , NULL , T_VOID , -1, false); | |
251 def(_astore_2 , "astore_2" , "b" , NULL , T_VOID , -1, false); | |
252 def(_astore_3 , "astore_3" , "b" , NULL , T_VOID , -1, false); | |
253 def(_iastore , "iastore" , "b" , NULL , T_VOID , -3, true ); | |
254 def(_lastore , "lastore" , "b" , NULL , T_VOID , -4, true ); | |
255 def(_fastore , "fastore" , "b" , NULL , T_VOID , -3, true ); | |
256 def(_dastore , "dastore" , "b" , NULL , T_VOID , -4, true ); | |
257 def(_aastore , "aastore" , "b" , NULL , T_VOID , -3, true ); | |
258 def(_bastore , "bastore" , "b" , NULL , T_VOID , -3, true ); | |
259 def(_castore , "castore" , "b" , NULL , T_VOID , -3, true ); | |
260 def(_sastore , "sastore" , "b" , NULL , T_VOID , -3, true ); | |
261 def(_pop , "pop" , "b" , NULL , T_VOID , -1, false); | |
262 def(_pop2 , "pop2" , "b" , NULL , T_VOID , -2, false); | |
263 def(_dup , "dup" , "b" , NULL , T_VOID , 1, false); | |
264 def(_dup_x1 , "dup_x1" , "b" , NULL , T_VOID , 1, false); | |
265 def(_dup_x2 , "dup_x2" , "b" , NULL , T_VOID , 1, false); | |
266 def(_dup2 , "dup2" , "b" , NULL , T_VOID , 2, false); | |
267 def(_dup2_x1 , "dup2_x1" , "b" , NULL , T_VOID , 2, false); | |
268 def(_dup2_x2 , "dup2_x2" , "b" , NULL , T_VOID , 2, false); | |
269 def(_swap , "swap" , "b" , NULL , T_VOID , 0, false); | |
270 def(_iadd , "iadd" , "b" , NULL , T_INT , -1, false); | |
271 def(_ladd , "ladd" , "b" , NULL , T_LONG , -2, false); | |
272 def(_fadd , "fadd" , "b" , NULL , T_FLOAT , -1, false); | |
273 def(_dadd , "dadd" , "b" , NULL , T_DOUBLE , -2, false); | |
274 def(_isub , "isub" , "b" , NULL , T_INT , -1, false); | |
275 def(_lsub , "lsub" , "b" , NULL , T_LONG , -2, false); | |
276 def(_fsub , "fsub" , "b" , NULL , T_FLOAT , -1, false); | |
277 def(_dsub , "dsub" , "b" , NULL , T_DOUBLE , -2, false); | |
278 def(_imul , "imul" , "b" , NULL , T_INT , -1, false); | |
279 def(_lmul , "lmul" , "b" , NULL , T_LONG , -2, false); | |
280 def(_fmul , "fmul" , "b" , NULL , T_FLOAT , -1, false); | |
281 def(_dmul , "dmul" , "b" , NULL , T_DOUBLE , -2, false); | |
282 def(_idiv , "idiv" , "b" , NULL , T_INT , -1, true ); | |
283 def(_ldiv , "ldiv" , "b" , NULL , T_LONG , -2, true ); | |
284 def(_fdiv , "fdiv" , "b" , NULL , T_FLOAT , -1, false); | |
285 def(_ddiv , "ddiv" , "b" , NULL , T_DOUBLE , -2, false); | |
286 def(_irem , "irem" , "b" , NULL , T_INT , -1, true ); | |
287 def(_lrem , "lrem" , "b" , NULL , T_LONG , -2, true ); | |
288 def(_frem , "frem" , "b" , NULL , T_FLOAT , -1, false); | |
289 def(_drem , "drem" , "b" , NULL , T_DOUBLE , -2, false); | |
290 def(_ineg , "ineg" , "b" , NULL , T_INT , 0, false); | |
291 def(_lneg , "lneg" , "b" , NULL , T_LONG , 0, false); | |
292 def(_fneg , "fneg" , "b" , NULL , T_FLOAT , 0, false); | |
293 def(_dneg , "dneg" , "b" , NULL , T_DOUBLE , 0, false); | |
294 def(_ishl , "ishl" , "b" , NULL , T_INT , -1, false); | |
295 def(_lshl , "lshl" , "b" , NULL , T_LONG , -1, false); | |
296 def(_ishr , "ishr" , "b" , NULL , T_INT , -1, false); | |
297 def(_lshr , "lshr" , "b" , NULL , T_LONG , -1, false); | |
298 def(_iushr , "iushr" , "b" , NULL , T_INT , -1, false); | |
299 def(_lushr , "lushr" , "b" , NULL , T_LONG , -1, false); | |
300 def(_iand , "iand" , "b" , NULL , T_INT , -1, false); | |
301 def(_land , "land" , "b" , NULL , T_LONG , -2, false); | |
302 def(_ior , "ior" , "b" , NULL , T_INT , -1, false); | |
303 def(_lor , "lor" , "b" , NULL , T_LONG , -2, false); | |
304 def(_ixor , "ixor" , "b" , NULL , T_INT , -1, false); | |
305 def(_lxor , "lxor" , "b" , NULL , T_LONG , -2, false); | |
306 def(_iinc , "iinc" , "bic" , "wbiicc", T_VOID , 0, false); | |
307 def(_i2l , "i2l" , "b" , NULL , T_LONG , 1, false); | |
308 def(_i2f , "i2f" , "b" , NULL , T_FLOAT , 0, false); | |
309 def(_i2d , "i2d" , "b" , NULL , T_DOUBLE , 1, false); | |
310 def(_l2i , "l2i" , "b" , NULL , T_INT , -1, false); | |
311 def(_l2f , "l2f" , "b" , NULL , T_FLOAT , -1, false); | |
312 def(_l2d , "l2d" , "b" , NULL , T_DOUBLE , 0, false); | |
313 def(_f2i , "f2i" , "b" , NULL , T_INT , 0, false); | |
314 def(_f2l , "f2l" , "b" , NULL , T_LONG , 1, false); | |
315 def(_f2d , "f2d" , "b" , NULL , T_DOUBLE , 1, false); | |
316 def(_d2i , "d2i" , "b" , NULL , T_INT , -1, false); | |
317 def(_d2l , "d2l" , "b" , NULL , T_LONG , 0, false); | |
318 def(_d2f , "d2f" , "b" , NULL , T_FLOAT , -1, false); | |
319 def(_i2b , "i2b" , "b" , NULL , T_BYTE , 0, false); | |
320 def(_i2c , "i2c" , "b" , NULL , T_CHAR , 0, false); | |
321 def(_i2s , "i2s" , "b" , NULL , T_SHORT , 0, false); | |
322 def(_lcmp , "lcmp" , "b" , NULL , T_VOID , -3, false); | |
323 def(_fcmpl , "fcmpl" , "b" , NULL , T_VOID , -1, false); | |
324 def(_fcmpg , "fcmpg" , "b" , NULL , T_VOID , -1, false); | |
325 def(_dcmpl , "dcmpl" , "b" , NULL , T_VOID , -3, false); | |
326 def(_dcmpg , "dcmpg" , "b" , NULL , T_VOID , -3, false); | |
327 def(_ifeq , "ifeq" , "boo" , NULL , T_VOID , -1, false); | |
328 def(_ifne , "ifne" , "boo" , NULL , T_VOID , -1, false); | |
329 def(_iflt , "iflt" , "boo" , NULL , T_VOID , -1, false); | |
330 def(_ifge , "ifge" , "boo" , NULL , T_VOID , -1, false); | |
331 def(_ifgt , "ifgt" , "boo" , NULL , T_VOID , -1, false); | |
332 def(_ifle , "ifle" , "boo" , NULL , T_VOID , -1, false); | |
333 def(_if_icmpeq , "if_icmpeq" , "boo" , NULL , T_VOID , -2, false); | |
334 def(_if_icmpne , "if_icmpne" , "boo" , NULL , T_VOID , -2, false); | |
335 def(_if_icmplt , "if_icmplt" , "boo" , NULL , T_VOID , -2, false); | |
336 def(_if_icmpge , "if_icmpge" , "boo" , NULL , T_VOID , -2, false); | |
337 def(_if_icmpgt , "if_icmpgt" , "boo" , NULL , T_VOID , -2, false); | |
338 def(_if_icmple , "if_icmple" , "boo" , NULL , T_VOID , -2, false); | |
339 def(_if_acmpeq , "if_acmpeq" , "boo" , NULL , T_VOID , -2, false); | |
340 def(_if_acmpne , "if_acmpne" , "boo" , NULL , T_VOID , -2, false); | |
341 def(_goto , "goto" , "boo" , NULL , T_VOID , 0, false); | |
342 def(_jsr , "jsr" , "boo" , NULL , T_INT , 0, false); | |
343 def(_ret , "ret" , "bi" , "wbii" , T_VOID , 0, false); | |
344 def(_tableswitch , "tableswitch" , "" , NULL , T_VOID , -1, false); // may have backward branches | |
345 def(_lookupswitch , "lookupswitch" , "" , NULL , T_VOID , -1, false); // rewriting in interpreter | |
346 def(_ireturn , "ireturn" , "b" , NULL , T_INT , -1, true); | |
347 def(_lreturn , "lreturn" , "b" , NULL , T_LONG , -2, true); | |
348 def(_freturn , "freturn" , "b" , NULL , T_FLOAT , -1, true); | |
349 def(_dreturn , "dreturn" , "b" , NULL , T_DOUBLE , -2, true); | |
350 def(_areturn , "areturn" , "b" , NULL , T_OBJECT , -1, true); | |
351 def(_return , "return" , "b" , NULL , T_VOID , 0, true); | |
352 def(_getstatic , "getstatic" , "bjj" , NULL , T_ILLEGAL, 1, true ); | |
353 def(_putstatic , "putstatic" , "bjj" , NULL , T_ILLEGAL, -1, true ); | |
354 def(_getfield , "getfield" , "bjj" , NULL , T_ILLEGAL, 0, true ); | |
355 def(_putfield , "putfield" , "bjj" , NULL , T_ILLEGAL, -2, true ); | |
356 def(_invokevirtual , "invokevirtual" , "bjj" , NULL , T_ILLEGAL, -1, true); | |
357 def(_invokespecial , "invokespecial" , "bjj" , NULL , T_ILLEGAL, -1, true); | |
358 def(_invokestatic , "invokestatic" , "bjj" , NULL , T_ILLEGAL, 0, true); | |
359 def(_invokeinterface , "invokeinterface" , "bjj__", NULL , T_ILLEGAL, -1, true); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
470
diff
changeset
|
360 def(_invokedynamic , "invokedynamic" , "bjjjj", NULL , T_ILLEGAL, -1, true ); |
0 | 361 def(_new , "new" , "bii" , NULL , T_OBJECT , 1, true ); |
362 def(_newarray , "newarray" , "bc" , NULL , T_OBJECT , 0, true ); | |
363 def(_anewarray , "anewarray" , "bii" , NULL , T_OBJECT , 0, true ); | |
364 def(_arraylength , "arraylength" , "b" , NULL , T_VOID , 0, true ); | |
365 def(_athrow , "athrow" , "b" , NULL , T_VOID , -1, true ); | |
366 def(_checkcast , "checkcast" , "bii" , NULL , T_OBJECT , 0, true ); | |
367 def(_instanceof , "instanceof" , "bii" , NULL , T_INT , 0, true ); | |
368 def(_monitorenter , "monitorenter" , "b" , NULL , T_VOID , -1, true ); | |
369 def(_monitorexit , "monitorexit" , "b" , NULL , T_VOID , -1, true ); | |
370 def(_wide , "wide" , "" , NULL , T_VOID , 0, false); | |
371 def(_multianewarray , "multianewarray" , "biic" , NULL , T_OBJECT , 1, true ); | |
372 def(_ifnull , "ifnull" , "boo" , NULL , T_VOID , -1, false); | |
373 def(_ifnonnull , "ifnonnull" , "boo" , NULL , T_VOID , -1, false); | |
374 def(_goto_w , "goto_w" , "boooo", NULL , T_VOID , 0, false); | |
375 def(_jsr_w , "jsr_w" , "boooo", NULL , T_INT , 0, false); | |
376 def(_breakpoint , "breakpoint" , "" , NULL , T_VOID , 0, true); | |
377 | |
378 // JVM bytecodes | |
379 // bytecode bytecode name format wide f. result tp stk traps std code | |
380 | |
381 def(_fast_agetfield , "fast_agetfield" , "bjj" , NULL , T_OBJECT , 0, true , _getfield ); | |
382 def(_fast_bgetfield , "fast_bgetfield" , "bjj" , NULL , T_INT , 0, true , _getfield ); | |
383 def(_fast_cgetfield , "fast_cgetfield" , "bjj" , NULL , T_CHAR , 0, true , _getfield ); | |
384 def(_fast_dgetfield , "fast_dgetfield" , "bjj" , NULL , T_DOUBLE , 0, true , _getfield ); | |
385 def(_fast_fgetfield , "fast_fgetfield" , "bjj" , NULL , T_FLOAT , 0, true , _getfield ); | |
386 def(_fast_igetfield , "fast_igetfield" , "bjj" , NULL , T_INT , 0, true , _getfield ); | |
387 def(_fast_lgetfield , "fast_lgetfield" , "bjj" , NULL , T_LONG , 0, true , _getfield ); | |
388 def(_fast_sgetfield , "fast_sgetfield" , "bjj" , NULL , T_SHORT , 0, true , _getfield ); | |
389 | |
390 def(_fast_aputfield , "fast_aputfield" , "bjj" , NULL , T_OBJECT , 0, true , _putfield ); | |
391 def(_fast_bputfield , "fast_bputfield" , "bjj" , NULL , T_INT , 0, true , _putfield ); | |
392 def(_fast_cputfield , "fast_cputfield" , "bjj" , NULL , T_CHAR , 0, true , _putfield ); | |
393 def(_fast_dputfield , "fast_dputfield" , "bjj" , NULL , T_DOUBLE , 0, true , _putfield ); | |
394 def(_fast_fputfield , "fast_fputfield" , "bjj" , NULL , T_FLOAT , 0, true , _putfield ); | |
395 def(_fast_iputfield , "fast_iputfield" , "bjj" , NULL , T_INT , 0, true , _putfield ); | |
396 def(_fast_lputfield , "fast_lputfield" , "bjj" , NULL , T_LONG , 0, true , _putfield ); | |
397 def(_fast_sputfield , "fast_sputfield" , "bjj" , NULL , T_SHORT , 0, true , _putfield ); | |
398 | |
399 def(_fast_aload_0 , "fast_aload_0" , "b" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
400 def(_fast_iaccess_0 , "fast_iaccess_0" , "b_jj" , NULL , T_INT , 1, true , _aload_0 ); | |
401 def(_fast_aaccess_0 , "fast_aaccess_0" , "b_jj" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
402 def(_fast_faccess_0 , "fast_faccess_0" , "b_jj" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
403 | |
404 def(_fast_iload , "fast_iload" , "bi" , NULL , T_INT , 1, false, _iload); | |
405 def(_fast_iload2 , "fast_iload2" , "bi_i" , NULL , T_INT , 2, false, _iload); | |
406 def(_fast_icaload , "fast_icaload" , "bi_" , NULL , T_INT , 0, false, _iload); | |
407 | |
408 // Faster method invocation. | |
409 def(_fast_invokevfinal , "fast_invokevfinal" , "bjj" , NULL , T_ILLEGAL, -1, true, _invokevirtual ); | |
410 | |
411 def(_fast_linearswitch , "fast_linearswitch" , "" , NULL , T_VOID , -1, false, _lookupswitch ); | |
412 def(_fast_binaryswitch , "fast_binaryswitch" , "" , NULL , T_VOID , -1, false, _lookupswitch ); | |
413 | |
414 def(_return_register_finalizer , "return_register_finalizer" , "b" , NULL , T_VOID , 0, true, _return); | |
415 | |
416 def(_shouldnotreachhere , "_shouldnotreachhere" , "b" , NULL , T_VOID , 0, false); | |
417 | |
418 // platform specific JVM bytecodes | |
419 pd_initialize(); | |
420 | |
421 // compare can_trap information for each bytecode with the | |
422 // can_trap information for the corresponding base bytecode | |
423 // (if a rewritten bytecode can trap, so must the base bytecode) | |
424 #ifdef ASSERT | |
425 { for (int i = 0; i < number_of_codes; i++) { | |
426 if (is_defined(i)) { | |
427 Code code = cast(i); | |
428 Code java = java_code(code); | |
429 if (can_trap(code) && !can_trap(java)) fatal2("%s can trap => %s can trap, too", name(code), name(java)); | |
430 } | |
431 } | |
432 } | |
433 #endif | |
434 | |
435 // initialization successful | |
436 _is_initialized = true; | |
437 } | |
438 | |
439 | |
440 void bytecodes_init() { | |
441 Bytecodes::initialize(); | |
442 } | |
443 | |
444 // Restore optimization | |
445 #ifdef _M_AMD64 | |
446 #pragma optimize ("", on) | |
447 #endif |