Mercurial > hg > truffle
annotate src/share/vm/interpreter/bytecodes.cpp @ 1721:413ad0331a0c
6977924: Changes for 6975078 produce build error with certain gcc versions
Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error.
Reviewed-by: jcoomes, ysr, phh
author | johnc |
---|---|
date | Wed, 18 Aug 2010 10:59:06 -0700 |
parents | 136b78722a08 |
children | f95d63e2154a |
rev | line source |
---|---|
0 | 1 /* |
1579 | 2 * Copyright (c) 1997, 2010, 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:
1527
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
1527
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:
1527
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
25 #include "incls/_precompiled.incl" | |
26 #include "incls/_bytecodes.cpp.incl" | |
27 | |
28 | |
1526
daf617c34be6
6953588: hotspot\src\share\vm\interpreter\bytecodes.cpp doesn't compile with VS2010 on AMD64
prr
parents:
1135
diff
changeset
|
29 #if defined(WIN32) && (defined(_MSC_VER) && (_MSC_VER < 1600)) |
0 | 30 // Windows AMD64 Compiler Hangs compiling this file |
31 // unless optimization is off | |
32 #ifdef _M_AMD64 | |
33 #pragma optimize ("", off) | |
34 #endif | |
1526
daf617c34be6
6953588: hotspot\src\share\vm\interpreter\bytecodes.cpp doesn't compile with VS2010 on AMD64
prr
parents:
1135
diff
changeset
|
35 #endif |
0 | 36 |
37 | |
38 bool Bytecodes::_is_initialized = false; | |
39 const char* Bytecodes::_name [Bytecodes::number_of_codes]; | |
40 BasicType Bytecodes::_result_type [Bytecodes::number_of_codes]; | |
41 s_char Bytecodes::_depth [Bytecodes::number_of_codes]; | |
1565 | 42 u_char Bytecodes::_lengths [Bytecodes::number_of_codes]; |
0 | 43 Bytecodes::Code Bytecodes::_java_code [Bytecodes::number_of_codes]; |
1565 | 44 u_short Bytecodes::_flags [(1<<BitsPerByte)*2]; |
0 | 45 |
46 | |
47 Bytecodes::Code Bytecodes::code_at(methodOop method, int bci) { | |
48 return code_at(method->bcp_from(bci), method); | |
49 } | |
50 | |
51 Bytecodes::Code Bytecodes::non_breakpoint_code_at(address bcp, methodOop method) { | |
52 if (method == NULL) method = methodOopDesc::method_from_bcp(bcp); | |
53 return method->orig_bytecode_at(method->bci_from(bcp)); | |
54 } | |
55 | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
56 int Bytecodes::special_length_at(address bcp, address end) { |
0 | 57 Code code = code_at(bcp); |
58 switch (code) { | |
59 case _wide: | |
413
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
60 if (end != NULL && bcp + 1 >= end) { |
c7ec737733a6
6756528: Bytecodes::special_length_at reads past end of code buffer
kamg
parents:
0
diff
changeset
|
61 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
|
62 } |
0 | 63 return wide_length_for(cast(*(bcp + 1))); |
64 case _tableswitch: | |
65 { 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
|
66 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
|
67 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
|
68 } |
0 | 69 jlong lo = (jint)Bytes::get_Java_u4(aligned_bcp + 1*jintSize); |
70 jlong hi = (jint)Bytes::get_Java_u4(aligned_bcp + 2*jintSize); | |
71 jlong len = (aligned_bcp - bcp) + (3 + hi - lo + 1)*jintSize; | |
72 // only return len if it can be represented as a positive int; | |
73 // return -1 otherwise | |
74 return (len > 0 && len == (int)len) ? len : -1; | |
75 } | |
76 | |
77 case _lookupswitch: // fall through | |
78 case _fast_binaryswitch: // fall through | |
79 case _fast_linearswitch: | |
80 { 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
|
81 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
|
82 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
|
83 } |
0 | 84 jlong npairs = (jint)Bytes::get_Java_u4(aligned_bcp + jintSize); |
85 jlong len = (aligned_bcp - bcp) + (2 + 2*npairs)*jintSize; | |
86 // only return len if it can be represented as a positive int; | |
87 // return -1 otherwise | |
88 return (len > 0 && len == (int)len) ? len : -1; | |
89 } | |
90 } | |
1570 | 91 // Note: Length functions must return <=0 for invalid bytecodes. |
0 | 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"); | |
1565 | 125 int len = (format != NULL ? (int) strlen(format) : 0); |
126 int wlen = (wide_format != NULL ? (int) strlen(wide_format) : 0); | |
0 | 127 _name [code] = name; |
128 _result_type [code] = result_type; | |
129 _depth [code] = depth; | |
1565 | 130 _lengths [code] = (wlen << 4) | (len & 0xF); |
0 | 131 _java_code [code] = java_code; |
1565 | 132 int bc_flags = 0; |
133 if (can_trap) bc_flags |= _bc_can_trap; | |
134 if (java_code != code) bc_flags |= _bc_can_rewrite; | |
135 _flags[(u1)code+0*(1<<BitsPerByte)] = compute_flags(format, bc_flags); | |
136 _flags[(u1)code+1*(1<<BitsPerByte)] = compute_flags(wide_format, bc_flags); | |
137 assert(is_defined(code) == (format != NULL), ""); | |
138 assert(wide_is_defined(code) == (wide_format != NULL), ""); | |
139 assert(length_for(code) == len, ""); | |
140 assert(wide_length_for(code) == wlen, ""); | |
0 | 141 } |
142 | |
143 | |
144 // Format strings interpretation: | |
145 // | |
146 // b: bytecode | |
147 // c: signed constant, Java byte-ordering | |
1565 | 148 // i: unsigned local index, Java byte-ordering (I = native byte ordering) |
149 // j: unsigned CP cache index, Java byte-ordering (J = native byte ordering) | |
150 // k: unsigned CP index, Java byte-ordering | |
151 // o: branch offset, Java byte-ordering | |
0 | 152 // _: unused/ignored |
153 // w: wide bytecode | |
154 // | |
1565 | 155 // Note: The format strings are used for 2 purposes: |
0 | 156 // 1. to specify the length of the bytecode |
157 // (= number of characters in format string) | |
1565 | 158 // 2. to derive bytecode format flags (_fmt_has_k, etc.) |
0 | 159 // |
160 // Note: For bytecodes with variable length, the format string is the empty string. | |
161 | |
1565 | 162 int Bytecodes::compute_flags(const char* format, int more_flags) { |
163 if (format == NULL) return 0; // not even more_flags | |
164 int flags = more_flags; | |
165 const char* fp = format; | |
166 switch (*fp) { | |
167 case '\0': | |
168 flags |= _fmt_not_simple; // but variable | |
169 break; | |
170 case 'b': | |
171 flags |= _fmt_not_variable; // but simple | |
172 ++fp; // skip 'b' | |
173 break; | |
174 case 'w': | |
175 flags |= _fmt_not_variable | _fmt_not_simple; | |
176 ++fp; // skip 'w' | |
177 guarantee(*fp == 'b', "wide format must start with 'wb'"); | |
178 ++fp; // skip 'b' | |
179 break; | |
180 } | |
181 | |
182 int has_nbo = 0, has_jbo = 0, has_size = 0; | |
183 for (;;) { | |
184 int this_flag = 0; | |
185 char fc = *fp++; | |
186 switch (fc) { | |
187 case '\0': // end of string | |
188 assert(flags == (jchar)flags, "change _format_flags"); | |
189 return flags; | |
190 | |
191 case '_': continue; // ignore these | |
192 | |
193 case 'j': this_flag = _fmt_has_j; has_jbo = 1; break; | |
194 case 'k': this_flag = _fmt_has_k; has_jbo = 1; break; | |
195 case 'i': this_flag = _fmt_has_i; has_jbo = 1; break; | |
196 case 'c': this_flag = _fmt_has_c; has_jbo = 1; break; | |
197 case 'o': this_flag = _fmt_has_o; has_jbo = 1; break; | |
198 | |
199 // uppercase versions mark native byte order (from Rewriter) | |
200 // actually, only the 'J' case happens currently | |
201 case 'J': this_flag = _fmt_has_j; has_nbo = 1; break; | |
202 case 'K': this_flag = _fmt_has_k; has_nbo = 1; break; | |
203 case 'I': this_flag = _fmt_has_i; has_nbo = 1; break; | |
204 case 'C': this_flag = _fmt_has_c; has_nbo = 1; break; | |
205 case 'O': this_flag = _fmt_has_o; has_nbo = 1; break; | |
206 default: guarantee(false, "bad char in format"); | |
207 } | |
208 | |
209 flags |= this_flag; | |
210 | |
211 guarantee(!(has_jbo && has_nbo), "mixed byte orders in format"); | |
212 if (has_nbo) | |
213 flags |= _fmt_has_nbo; | |
214 | |
215 int this_size = 1; | |
216 if (*fp == fc) { | |
217 // advance beyond run of the same characters | |
218 this_size = 2; | |
219 while (*++fp == fc) this_size++; | |
220 switch (this_size) { | |
221 case 2: flags |= _fmt_has_u2; break; | |
222 case 4: flags |= _fmt_has_u4; break; | |
223 default: guarantee(false, "bad rep count in format"); | |
224 } | |
225 } | |
226 guarantee(has_size == 0 || // no field yet | |
227 this_size == has_size || // same size | |
228 this_size < has_size && *fp == '\0', // last field can be short | |
229 "mixed field sizes in format"); | |
230 has_size = this_size; | |
231 } | |
232 } | |
233 | |
0 | 234 void Bytecodes::initialize() { |
235 if (_is_initialized) return; | |
236 assert(number_of_codes <= 256, "too many bytecodes"); | |
237 | |
238 // initialize bytecode tables - didn't use static array initializers | |
239 // (such as {}) so we can do additional consistency checks and init- | |
240 // code is independent of actual bytecode numbering. | |
241 // | |
242 // Note 1: NULL for the format string means the bytecode doesn't exist | |
243 // in that form. | |
244 // | |
245 // Note 2: The result type is T_ILLEGAL for bytecodes where the top of stack | |
246 // type after execution is not only determined by the bytecode itself. | |
247 | |
248 // Java bytecodes | |
249 // bytecode bytecode name format wide f. result tp stk traps | |
250 def(_nop , "nop" , "b" , NULL , T_VOID , 0, false); | |
251 def(_aconst_null , "aconst_null" , "b" , NULL , T_OBJECT , 1, false); | |
252 def(_iconst_m1 , "iconst_m1" , "b" , NULL , T_INT , 1, false); | |
253 def(_iconst_0 , "iconst_0" , "b" , NULL , T_INT , 1, false); | |
254 def(_iconst_1 , "iconst_1" , "b" , NULL , T_INT , 1, false); | |
255 def(_iconst_2 , "iconst_2" , "b" , NULL , T_INT , 1, false); | |
256 def(_iconst_3 , "iconst_3" , "b" , NULL , T_INT , 1, false); | |
257 def(_iconst_4 , "iconst_4" , "b" , NULL , T_INT , 1, false); | |
258 def(_iconst_5 , "iconst_5" , "b" , NULL , T_INT , 1, false); | |
259 def(_lconst_0 , "lconst_0" , "b" , NULL , T_LONG , 2, false); | |
260 def(_lconst_1 , "lconst_1" , "b" , NULL , T_LONG , 2, false); | |
261 def(_fconst_0 , "fconst_0" , "b" , NULL , T_FLOAT , 1, false); | |
262 def(_fconst_1 , "fconst_1" , "b" , NULL , T_FLOAT , 1, false); | |
263 def(_fconst_2 , "fconst_2" , "b" , NULL , T_FLOAT , 1, false); | |
264 def(_dconst_0 , "dconst_0" , "b" , NULL , T_DOUBLE , 2, false); | |
265 def(_dconst_1 , "dconst_1" , "b" , NULL , T_DOUBLE , 2, false); | |
266 def(_bipush , "bipush" , "bc" , NULL , T_INT , 1, false); | |
267 def(_sipush , "sipush" , "bcc" , NULL , T_INT , 1, false); | |
1565 | 268 def(_ldc , "ldc" , "bk" , NULL , T_ILLEGAL, 1, true ); |
269 def(_ldc_w , "ldc_w" , "bkk" , NULL , T_ILLEGAL, 1, true ); | |
270 def(_ldc2_w , "ldc2_w" , "bkk" , NULL , T_ILLEGAL, 2, true ); | |
0 | 271 def(_iload , "iload" , "bi" , "wbii" , T_INT , 1, false); |
272 def(_lload , "lload" , "bi" , "wbii" , T_LONG , 2, false); | |
273 def(_fload , "fload" , "bi" , "wbii" , T_FLOAT , 1, false); | |
274 def(_dload , "dload" , "bi" , "wbii" , T_DOUBLE , 2, false); | |
275 def(_aload , "aload" , "bi" , "wbii" , T_OBJECT , 1, false); | |
276 def(_iload_0 , "iload_0" , "b" , NULL , T_INT , 1, false); | |
277 def(_iload_1 , "iload_1" , "b" , NULL , T_INT , 1, false); | |
278 def(_iload_2 , "iload_2" , "b" , NULL , T_INT , 1, false); | |
279 def(_iload_3 , "iload_3" , "b" , NULL , T_INT , 1, false); | |
280 def(_lload_0 , "lload_0" , "b" , NULL , T_LONG , 2, false); | |
281 def(_lload_1 , "lload_1" , "b" , NULL , T_LONG , 2, false); | |
282 def(_lload_2 , "lload_2" , "b" , NULL , T_LONG , 2, false); | |
283 def(_lload_3 , "lload_3" , "b" , NULL , T_LONG , 2, false); | |
284 def(_fload_0 , "fload_0" , "b" , NULL , T_FLOAT , 1, false); | |
285 def(_fload_1 , "fload_1" , "b" , NULL , T_FLOAT , 1, false); | |
286 def(_fload_2 , "fload_2" , "b" , NULL , T_FLOAT , 1, false); | |
287 def(_fload_3 , "fload_3" , "b" , NULL , T_FLOAT , 1, false); | |
288 def(_dload_0 , "dload_0" , "b" , NULL , T_DOUBLE , 2, false); | |
289 def(_dload_1 , "dload_1" , "b" , NULL , T_DOUBLE , 2, false); | |
290 def(_dload_2 , "dload_2" , "b" , NULL , T_DOUBLE , 2, false); | |
291 def(_dload_3 , "dload_3" , "b" , NULL , T_DOUBLE , 2, false); | |
292 def(_aload_0 , "aload_0" , "b" , NULL , T_OBJECT , 1, true ); // rewriting in interpreter | |
293 def(_aload_1 , "aload_1" , "b" , NULL , T_OBJECT , 1, false); | |
294 def(_aload_2 , "aload_2" , "b" , NULL , T_OBJECT , 1, false); | |
295 def(_aload_3 , "aload_3" , "b" , NULL , T_OBJECT , 1, false); | |
296 def(_iaload , "iaload" , "b" , NULL , T_INT , -1, true ); | |
297 def(_laload , "laload" , "b" , NULL , T_LONG , 0, true ); | |
298 def(_faload , "faload" , "b" , NULL , T_FLOAT , -1, true ); | |
299 def(_daload , "daload" , "b" , NULL , T_DOUBLE , 0, true ); | |
300 def(_aaload , "aaload" , "b" , NULL , T_OBJECT , -1, true ); | |
301 def(_baload , "baload" , "b" , NULL , T_INT , -1, true ); | |
302 def(_caload , "caload" , "b" , NULL , T_INT , -1, true ); | |
303 def(_saload , "saload" , "b" , NULL , T_INT , -1, true ); | |
304 def(_istore , "istore" , "bi" , "wbii" , T_VOID , -1, false); | |
305 def(_lstore , "lstore" , "bi" , "wbii" , T_VOID , -2, false); | |
306 def(_fstore , "fstore" , "bi" , "wbii" , T_VOID , -1, false); | |
307 def(_dstore , "dstore" , "bi" , "wbii" , T_VOID , -2, false); | |
308 def(_astore , "astore" , "bi" , "wbii" , T_VOID , -1, false); | |
309 def(_istore_0 , "istore_0" , "b" , NULL , T_VOID , -1, false); | |
310 def(_istore_1 , "istore_1" , "b" , NULL , T_VOID , -1, false); | |
311 def(_istore_2 , "istore_2" , "b" , NULL , T_VOID , -1, false); | |
312 def(_istore_3 , "istore_3" , "b" , NULL , T_VOID , -1, false); | |
313 def(_lstore_0 , "lstore_0" , "b" , NULL , T_VOID , -2, false); | |
314 def(_lstore_1 , "lstore_1" , "b" , NULL , T_VOID , -2, false); | |
315 def(_lstore_2 , "lstore_2" , "b" , NULL , T_VOID , -2, false); | |
316 def(_lstore_3 , "lstore_3" , "b" , NULL , T_VOID , -2, false); | |
317 def(_fstore_0 , "fstore_0" , "b" , NULL , T_VOID , -1, false); | |
318 def(_fstore_1 , "fstore_1" , "b" , NULL , T_VOID , -1, false); | |
319 def(_fstore_2 , "fstore_2" , "b" , NULL , T_VOID , -1, false); | |
320 def(_fstore_3 , "fstore_3" , "b" , NULL , T_VOID , -1, false); | |
321 def(_dstore_0 , "dstore_0" , "b" , NULL , T_VOID , -2, false); | |
322 def(_dstore_1 , "dstore_1" , "b" , NULL , T_VOID , -2, false); | |
323 def(_dstore_2 , "dstore_2" , "b" , NULL , T_VOID , -2, false); | |
324 def(_dstore_3 , "dstore_3" , "b" , NULL , T_VOID , -2, false); | |
325 def(_astore_0 , "astore_0" , "b" , NULL , T_VOID , -1, false); | |
326 def(_astore_1 , "astore_1" , "b" , NULL , T_VOID , -1, false); | |
327 def(_astore_2 , "astore_2" , "b" , NULL , T_VOID , -1, false); | |
328 def(_astore_3 , "astore_3" , "b" , NULL , T_VOID , -1, false); | |
329 def(_iastore , "iastore" , "b" , NULL , T_VOID , -3, true ); | |
330 def(_lastore , "lastore" , "b" , NULL , T_VOID , -4, true ); | |
331 def(_fastore , "fastore" , "b" , NULL , T_VOID , -3, true ); | |
332 def(_dastore , "dastore" , "b" , NULL , T_VOID , -4, true ); | |
333 def(_aastore , "aastore" , "b" , NULL , T_VOID , -3, true ); | |
334 def(_bastore , "bastore" , "b" , NULL , T_VOID , -3, true ); | |
335 def(_castore , "castore" , "b" , NULL , T_VOID , -3, true ); | |
336 def(_sastore , "sastore" , "b" , NULL , T_VOID , -3, true ); | |
337 def(_pop , "pop" , "b" , NULL , T_VOID , -1, false); | |
338 def(_pop2 , "pop2" , "b" , NULL , T_VOID , -2, false); | |
339 def(_dup , "dup" , "b" , NULL , T_VOID , 1, false); | |
340 def(_dup_x1 , "dup_x1" , "b" , NULL , T_VOID , 1, false); | |
341 def(_dup_x2 , "dup_x2" , "b" , NULL , T_VOID , 1, false); | |
342 def(_dup2 , "dup2" , "b" , NULL , T_VOID , 2, false); | |
343 def(_dup2_x1 , "dup2_x1" , "b" , NULL , T_VOID , 2, false); | |
344 def(_dup2_x2 , "dup2_x2" , "b" , NULL , T_VOID , 2, false); | |
345 def(_swap , "swap" , "b" , NULL , T_VOID , 0, false); | |
346 def(_iadd , "iadd" , "b" , NULL , T_INT , -1, false); | |
347 def(_ladd , "ladd" , "b" , NULL , T_LONG , -2, false); | |
348 def(_fadd , "fadd" , "b" , NULL , T_FLOAT , -1, false); | |
349 def(_dadd , "dadd" , "b" , NULL , T_DOUBLE , -2, false); | |
350 def(_isub , "isub" , "b" , NULL , T_INT , -1, false); | |
351 def(_lsub , "lsub" , "b" , NULL , T_LONG , -2, false); | |
352 def(_fsub , "fsub" , "b" , NULL , T_FLOAT , -1, false); | |
353 def(_dsub , "dsub" , "b" , NULL , T_DOUBLE , -2, false); | |
354 def(_imul , "imul" , "b" , NULL , T_INT , -1, false); | |
355 def(_lmul , "lmul" , "b" , NULL , T_LONG , -2, false); | |
356 def(_fmul , "fmul" , "b" , NULL , T_FLOAT , -1, false); | |
357 def(_dmul , "dmul" , "b" , NULL , T_DOUBLE , -2, false); | |
358 def(_idiv , "idiv" , "b" , NULL , T_INT , -1, true ); | |
359 def(_ldiv , "ldiv" , "b" , NULL , T_LONG , -2, true ); | |
360 def(_fdiv , "fdiv" , "b" , NULL , T_FLOAT , -1, false); | |
361 def(_ddiv , "ddiv" , "b" , NULL , T_DOUBLE , -2, false); | |
362 def(_irem , "irem" , "b" , NULL , T_INT , -1, true ); | |
363 def(_lrem , "lrem" , "b" , NULL , T_LONG , -2, true ); | |
364 def(_frem , "frem" , "b" , NULL , T_FLOAT , -1, false); | |
365 def(_drem , "drem" , "b" , NULL , T_DOUBLE , -2, false); | |
366 def(_ineg , "ineg" , "b" , NULL , T_INT , 0, false); | |
367 def(_lneg , "lneg" , "b" , NULL , T_LONG , 0, false); | |
368 def(_fneg , "fneg" , "b" , NULL , T_FLOAT , 0, false); | |
369 def(_dneg , "dneg" , "b" , NULL , T_DOUBLE , 0, false); | |
370 def(_ishl , "ishl" , "b" , NULL , T_INT , -1, false); | |
371 def(_lshl , "lshl" , "b" , NULL , T_LONG , -1, false); | |
372 def(_ishr , "ishr" , "b" , NULL , T_INT , -1, false); | |
373 def(_lshr , "lshr" , "b" , NULL , T_LONG , -1, false); | |
374 def(_iushr , "iushr" , "b" , NULL , T_INT , -1, false); | |
375 def(_lushr , "lushr" , "b" , NULL , T_LONG , -1, false); | |
376 def(_iand , "iand" , "b" , NULL , T_INT , -1, false); | |
377 def(_land , "land" , "b" , NULL , T_LONG , -2, false); | |
378 def(_ior , "ior" , "b" , NULL , T_INT , -1, false); | |
379 def(_lor , "lor" , "b" , NULL , T_LONG , -2, false); | |
380 def(_ixor , "ixor" , "b" , NULL , T_INT , -1, false); | |
381 def(_lxor , "lxor" , "b" , NULL , T_LONG , -2, false); | |
382 def(_iinc , "iinc" , "bic" , "wbiicc", T_VOID , 0, false); | |
383 def(_i2l , "i2l" , "b" , NULL , T_LONG , 1, false); | |
384 def(_i2f , "i2f" , "b" , NULL , T_FLOAT , 0, false); | |
385 def(_i2d , "i2d" , "b" , NULL , T_DOUBLE , 1, false); | |
386 def(_l2i , "l2i" , "b" , NULL , T_INT , -1, false); | |
387 def(_l2f , "l2f" , "b" , NULL , T_FLOAT , -1, false); | |
388 def(_l2d , "l2d" , "b" , NULL , T_DOUBLE , 0, false); | |
389 def(_f2i , "f2i" , "b" , NULL , T_INT , 0, false); | |
390 def(_f2l , "f2l" , "b" , NULL , T_LONG , 1, false); | |
391 def(_f2d , "f2d" , "b" , NULL , T_DOUBLE , 1, false); | |
392 def(_d2i , "d2i" , "b" , NULL , T_INT , -1, false); | |
393 def(_d2l , "d2l" , "b" , NULL , T_LONG , 0, false); | |
394 def(_d2f , "d2f" , "b" , NULL , T_FLOAT , -1, false); | |
395 def(_i2b , "i2b" , "b" , NULL , T_BYTE , 0, false); | |
396 def(_i2c , "i2c" , "b" , NULL , T_CHAR , 0, false); | |
397 def(_i2s , "i2s" , "b" , NULL , T_SHORT , 0, false); | |
398 def(_lcmp , "lcmp" , "b" , NULL , T_VOID , -3, false); | |
399 def(_fcmpl , "fcmpl" , "b" , NULL , T_VOID , -1, false); | |
400 def(_fcmpg , "fcmpg" , "b" , NULL , T_VOID , -1, false); | |
401 def(_dcmpl , "dcmpl" , "b" , NULL , T_VOID , -3, false); | |
402 def(_dcmpg , "dcmpg" , "b" , NULL , T_VOID , -3, false); | |
403 def(_ifeq , "ifeq" , "boo" , NULL , T_VOID , -1, false); | |
404 def(_ifne , "ifne" , "boo" , NULL , T_VOID , -1, false); | |
405 def(_iflt , "iflt" , "boo" , NULL , T_VOID , -1, false); | |
406 def(_ifge , "ifge" , "boo" , NULL , T_VOID , -1, false); | |
407 def(_ifgt , "ifgt" , "boo" , NULL , T_VOID , -1, false); | |
408 def(_ifle , "ifle" , "boo" , NULL , T_VOID , -1, false); | |
409 def(_if_icmpeq , "if_icmpeq" , "boo" , NULL , T_VOID , -2, false); | |
410 def(_if_icmpne , "if_icmpne" , "boo" , NULL , T_VOID , -2, false); | |
411 def(_if_icmplt , "if_icmplt" , "boo" , NULL , T_VOID , -2, false); | |
412 def(_if_icmpge , "if_icmpge" , "boo" , NULL , T_VOID , -2, false); | |
413 def(_if_icmpgt , "if_icmpgt" , "boo" , NULL , T_VOID , -2, false); | |
414 def(_if_icmple , "if_icmple" , "boo" , NULL , T_VOID , -2, false); | |
415 def(_if_acmpeq , "if_acmpeq" , "boo" , NULL , T_VOID , -2, false); | |
416 def(_if_acmpne , "if_acmpne" , "boo" , NULL , T_VOID , -2, false); | |
417 def(_goto , "goto" , "boo" , NULL , T_VOID , 0, false); | |
418 def(_jsr , "jsr" , "boo" , NULL , T_INT , 0, false); | |
419 def(_ret , "ret" , "bi" , "wbii" , T_VOID , 0, false); | |
420 def(_tableswitch , "tableswitch" , "" , NULL , T_VOID , -1, false); // may have backward branches | |
421 def(_lookupswitch , "lookupswitch" , "" , NULL , T_VOID , -1, false); // rewriting in interpreter | |
422 def(_ireturn , "ireturn" , "b" , NULL , T_INT , -1, true); | |
423 def(_lreturn , "lreturn" , "b" , NULL , T_LONG , -2, true); | |
424 def(_freturn , "freturn" , "b" , NULL , T_FLOAT , -1, true); | |
425 def(_dreturn , "dreturn" , "b" , NULL , T_DOUBLE , -2, true); | |
426 def(_areturn , "areturn" , "b" , NULL , T_OBJECT , -1, true); | |
427 def(_return , "return" , "b" , NULL , T_VOID , 0, true); | |
1565 | 428 def(_getstatic , "getstatic" , "bJJ" , NULL , T_ILLEGAL, 1, true ); |
429 def(_putstatic , "putstatic" , "bJJ" , NULL , T_ILLEGAL, -1, true ); | |
430 def(_getfield , "getfield" , "bJJ" , NULL , T_ILLEGAL, 0, true ); | |
431 def(_putfield , "putfield" , "bJJ" , NULL , T_ILLEGAL, -2, true ); | |
432 def(_invokevirtual , "invokevirtual" , "bJJ" , NULL , T_ILLEGAL, -1, true); | |
433 def(_invokespecial , "invokespecial" , "bJJ" , NULL , T_ILLEGAL, -1, true); | |
434 def(_invokestatic , "invokestatic" , "bJJ" , NULL , T_ILLEGAL, 0, true); | |
435 def(_invokeinterface , "invokeinterface" , "bJJ__", NULL , T_ILLEGAL, -1, true); | |
436 def(_invokedynamic , "invokedynamic" , "bJJJJ", NULL , T_ILLEGAL, 0, true ); | |
437 def(_new , "new" , "bkk" , NULL , T_OBJECT , 1, true ); | |
0 | 438 def(_newarray , "newarray" , "bc" , NULL , T_OBJECT , 0, true ); |
1565 | 439 def(_anewarray , "anewarray" , "bkk" , NULL , T_OBJECT , 0, true ); |
0 | 440 def(_arraylength , "arraylength" , "b" , NULL , T_VOID , 0, true ); |
441 def(_athrow , "athrow" , "b" , NULL , T_VOID , -1, true ); | |
1565 | 442 def(_checkcast , "checkcast" , "bkk" , NULL , T_OBJECT , 0, true ); |
443 def(_instanceof , "instanceof" , "bkk" , NULL , T_INT , 0, true ); | |
0 | 444 def(_monitorenter , "monitorenter" , "b" , NULL , T_VOID , -1, true ); |
445 def(_monitorexit , "monitorexit" , "b" , NULL , T_VOID , -1, true ); | |
446 def(_wide , "wide" , "" , NULL , T_VOID , 0, false); | |
1565 | 447 def(_multianewarray , "multianewarray" , "bkkc" , NULL , T_OBJECT , 1, true ); |
0 | 448 def(_ifnull , "ifnull" , "boo" , NULL , T_VOID , -1, false); |
449 def(_ifnonnull , "ifnonnull" , "boo" , NULL , T_VOID , -1, false); | |
450 def(_goto_w , "goto_w" , "boooo", NULL , T_VOID , 0, false); | |
451 def(_jsr_w , "jsr_w" , "boooo", NULL , T_INT , 0, false); | |
452 def(_breakpoint , "breakpoint" , "" , NULL , T_VOID , 0, true); | |
453 | |
454 // JVM bytecodes | |
455 // bytecode bytecode name format wide f. result tp stk traps std code | |
456 | |
1565 | 457 def(_fast_agetfield , "fast_agetfield" , "bJJ" , NULL , T_OBJECT , 0, true , _getfield ); |
458 def(_fast_bgetfield , "fast_bgetfield" , "bJJ" , NULL , T_INT , 0, true , _getfield ); | |
459 def(_fast_cgetfield , "fast_cgetfield" , "bJJ" , NULL , T_CHAR , 0, true , _getfield ); | |
460 def(_fast_dgetfield , "fast_dgetfield" , "bJJ" , NULL , T_DOUBLE , 0, true , _getfield ); | |
461 def(_fast_fgetfield , "fast_fgetfield" , "bJJ" , NULL , T_FLOAT , 0, true , _getfield ); | |
462 def(_fast_igetfield , "fast_igetfield" , "bJJ" , NULL , T_INT , 0, true , _getfield ); | |
463 def(_fast_lgetfield , "fast_lgetfield" , "bJJ" , NULL , T_LONG , 0, true , _getfield ); | |
464 def(_fast_sgetfield , "fast_sgetfield" , "bJJ" , NULL , T_SHORT , 0, true , _getfield ); | |
0 | 465 |
1565 | 466 def(_fast_aputfield , "fast_aputfield" , "bJJ" , NULL , T_OBJECT , 0, true , _putfield ); |
467 def(_fast_bputfield , "fast_bputfield" , "bJJ" , NULL , T_INT , 0, true , _putfield ); | |
468 def(_fast_cputfield , "fast_cputfield" , "bJJ" , NULL , T_CHAR , 0, true , _putfield ); | |
469 def(_fast_dputfield , "fast_dputfield" , "bJJ" , NULL , T_DOUBLE , 0, true , _putfield ); | |
470 def(_fast_fputfield , "fast_fputfield" , "bJJ" , NULL , T_FLOAT , 0, true , _putfield ); | |
471 def(_fast_iputfield , "fast_iputfield" , "bJJ" , NULL , T_INT , 0, true , _putfield ); | |
472 def(_fast_lputfield , "fast_lputfield" , "bJJ" , NULL , T_LONG , 0, true , _putfield ); | |
473 def(_fast_sputfield , "fast_sputfield" , "bJJ" , NULL , T_SHORT , 0, true , _putfield ); | |
0 | 474 |
475 def(_fast_aload_0 , "fast_aload_0" , "b" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
1565 | 476 def(_fast_iaccess_0 , "fast_iaccess_0" , "b_JJ" , NULL , T_INT , 1, true , _aload_0 ); |
477 def(_fast_aaccess_0 , "fast_aaccess_0" , "b_JJ" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
478 def(_fast_faccess_0 , "fast_faccess_0" , "b_JJ" , NULL , T_OBJECT , 1, true , _aload_0 ); | |
0 | 479 |
480 def(_fast_iload , "fast_iload" , "bi" , NULL , T_INT , 1, false, _iload); | |
481 def(_fast_iload2 , "fast_iload2" , "bi_i" , NULL , T_INT , 2, false, _iload); | |
482 def(_fast_icaload , "fast_icaload" , "bi_" , NULL , T_INT , 0, false, _iload); | |
483 | |
484 // Faster method invocation. | |
1565 | 485 def(_fast_invokevfinal , "fast_invokevfinal" , "bJJ" , NULL , T_ILLEGAL, -1, true, _invokevirtual ); |
0 | 486 |
487 def(_fast_linearswitch , "fast_linearswitch" , "" , NULL , T_VOID , -1, false, _lookupswitch ); | |
488 def(_fast_binaryswitch , "fast_binaryswitch" , "" , NULL , T_VOID , -1, false, _lookupswitch ); | |
489 | |
490 def(_return_register_finalizer , "return_register_finalizer" , "b" , NULL , T_VOID , 0, true, _return); | |
491 | |
1602 | 492 def(_fast_aldc , "fast_aldc" , "bj" , NULL , T_OBJECT, 1, true, _ldc ); |
493 def(_fast_aldc_w , "fast_aldc_w" , "bJJ" , NULL , T_OBJECT, 1, true, _ldc_w ); | |
494 | |
0 | 495 def(_shouldnotreachhere , "_shouldnotreachhere" , "b" , NULL , T_VOID , 0, false); |
496 | |
497 // platform specific JVM bytecodes | |
498 pd_initialize(); | |
499 | |
500 // compare can_trap information for each bytecode with the | |
501 // can_trap information for the corresponding base bytecode | |
502 // (if a rewritten bytecode can trap, so must the base bytecode) | |
503 #ifdef ASSERT | |
504 { for (int i = 0; i < number_of_codes; i++) { | |
505 if (is_defined(i)) { | |
506 Code code = cast(i); | |
507 Code java = java_code(code); | |
1490
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1135
diff
changeset
|
508 if (can_trap(code) && !can_trap(java)) |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1135
diff
changeset
|
509 fatal(err_msg("%s can trap => %s can trap, too", name(code), |
f03d0a26bf83
6888954: argument formatting for assert() and friends
jcoomes
parents:
1135
diff
changeset
|
510 name(java))); |
0 | 511 } |
512 } | |
513 } | |
514 #endif | |
515 | |
516 // initialization successful | |
517 _is_initialized = true; | |
518 } | |
519 | |
520 | |
521 void bytecodes_init() { | |
522 Bytecodes::initialize(); | |
523 } | |
524 | |
525 // Restore optimization | |
526 #ifdef _M_AMD64 | |
527 #pragma optimize ("", on) | |
528 #endif |