Mercurial > hg > graal-compiler
annotate src/share/vm/interpreter/templateTable.hpp @ 1091:6aa7255741f3
6906727: UseCompressedOops: some card-marking fixes related to object arrays
Summary: Introduced a new write_ref_array(HeapWords* start, size_t count) method that does the requisite MemRegion range calculation so (some of the) clients of the erstwhile write_ref_array(MemRegion mr) do not need to worry. This removed all external uses of array_size(), which was also simplified and made private. Asserts were added to catch other possible issues. Further, less essential, fixes stemming from this investigation are deferred to CR 6904516 (to follow shortly in hs17).
Reviewed-by: kvn, coleenp, jmasa
author | ysr |
---|---|
date | Thu, 03 Dec 2009 15:01:57 -0800 |
parents | bd02caa94611 |
children | c18cbe5936b8 ab102d5d923e |
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 #ifndef CC_INTERP | |
26 // All the necessary definitions used for (bytecode) template generation. Instead of | |
27 // spreading the implementation functionality for each bytecode in the interpreter | |
28 // and the snippet generator, a template is assigned to each bytecode which can be | |
29 // used to generate the bytecode's implementation if needed. | |
30 | |
31 | |
32 // A Template describes the properties of a code template for a given bytecode | |
33 // and provides a generator to generate the code template. | |
34 | |
35 class Template VALUE_OBJ_CLASS_SPEC { | |
36 private: | |
37 enum Flags { | |
38 uses_bcp_bit, // set if template needs the bcp pointing to bytecode | |
39 does_dispatch_bit, // set if template dispatches on its own | |
40 calls_vm_bit, // set if template calls the vm | |
41 wide_bit // set if template belongs to a wide instruction | |
42 }; | |
43 | |
44 typedef void (*generator)(int arg); | |
45 | |
46 int _flags; // describes interpreter template properties (bcp unknown) | |
47 TosState _tos_in; // tos cache state before template execution | |
48 TosState _tos_out; // tos cache state after template execution | |
49 generator _gen; // template code generator | |
50 int _arg; // argument for template code generator | |
51 | |
52 void initialize(int flags, TosState tos_in, TosState tos_out, generator gen, int arg); | |
53 | |
54 friend class TemplateTable; | |
55 | |
56 public: | |
57 Bytecodes::Code bytecode() const; | |
58 bool is_valid() const { return _gen != NULL; } | |
59 bool uses_bcp() const { return (_flags & (1 << uses_bcp_bit )) != 0; } | |
60 bool does_dispatch() const { return (_flags & (1 << does_dispatch_bit)) != 0; } | |
61 bool calls_vm() const { return (_flags & (1 << calls_vm_bit )) != 0; } | |
62 bool is_wide() const { return (_flags & (1 << wide_bit )) != 0; } | |
63 TosState tos_in() const { return _tos_in; } | |
64 TosState tos_out() const { return _tos_out; } | |
65 void generate(InterpreterMacroAssembler* masm); | |
66 }; | |
67 | |
68 | |
69 // The TemplateTable defines all Templates and provides accessor functions | |
70 // to get the template for a given bytecode. | |
71 | |
72 class TemplateTable: AllStatic { | |
73 public: | |
74 enum Operation { add, sub, mul, div, rem, _and, _or, _xor, shl, shr, ushr }; | |
75 enum Condition { equal, not_equal, less, less_equal, greater, greater_equal }; | |
76 | |
77 private: | |
78 static bool _is_initialized; // true if TemplateTable has been initialized | |
79 static Template _template_table [Bytecodes::number_of_codes]; | |
80 static Template _template_table_wide[Bytecodes::number_of_codes]; | |
81 | |
82 static Template* _desc; // the current template to be generated | |
83 static Bytecodes::Code bytecode() { return _desc->bytecode(); } | |
84 | |
342 | 85 static BarrierSet* _bs; // Cache the barrier set. |
0 | 86 public: |
87 //%note templates_1 | |
88 static InterpreterMacroAssembler* _masm; // the assembler used when generating templates | |
89 | |
90 private: | |
91 | |
92 // special registers | |
93 static inline Address at_bcp(int offset); | |
94 | |
95 // helpers | |
96 static void unimplemented_bc(); | |
97 static void patch_bytecode(Bytecodes::Code bc, Register scratch1, | |
98 Register scratch2, bool load_bc_in_scratch = true); | |
99 | |
100 // C calls | |
101 static void call_VM(Register oop_result, address entry_point); | |
102 static void call_VM(Register oop_result, address entry_point, Register arg_1); | |
103 static void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2); | |
104 static void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3); | |
105 | |
106 // these overloadings are not presently used on SPARC: | |
107 static void call_VM(Register oop_result, Register last_java_sp, address entry_point); | |
108 static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1); | |
109 static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2); | |
110 static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3); | |
111 | |
112 // bytecodes | |
113 static void nop(); | |
114 | |
115 static void aconst_null(); | |
116 static void iconst(int value); | |
117 static void lconst(int value); | |
118 static void fconst(int value); | |
119 static void dconst(int value); | |
120 | |
121 static void bipush(); | |
122 static void sipush(); | |
123 static void ldc(bool wide); | |
124 static void ldc2_w(); | |
125 | |
126 static void locals_index(Register reg, int offset = 1); | |
127 static void iload(); | |
128 static void fast_iload(); | |
129 static void fast_iload2(); | |
130 static void fast_icaload(); | |
131 static void lload(); | |
132 static void fload(); | |
133 static void dload(); | |
134 static void aload(); | |
135 | |
136 static void locals_index_wide(Register reg); | |
137 static void wide_iload(); | |
138 static void wide_lload(); | |
139 static void wide_fload(); | |
140 static void wide_dload(); | |
141 static void wide_aload(); | |
142 | |
143 static void iaload(); | |
144 static void laload(); | |
145 static void faload(); | |
146 static void daload(); | |
147 static void aaload(); | |
148 static void baload(); | |
149 static void caload(); | |
150 static void saload(); | |
151 | |
152 static void iload(int n); | |
153 static void lload(int n); | |
154 static void fload(int n); | |
155 static void dload(int n); | |
156 static void aload(int n); | |
157 static void aload_0(); | |
158 | |
159 static void istore(); | |
160 static void lstore(); | |
161 static void fstore(); | |
162 static void dstore(); | |
163 static void astore(); | |
164 | |
165 static void wide_istore(); | |
166 static void wide_lstore(); | |
167 static void wide_fstore(); | |
168 static void wide_dstore(); | |
169 static void wide_astore(); | |
170 | |
171 static void iastore(); | |
172 static void lastore(); | |
173 static void fastore(); | |
174 static void dastore(); | |
175 static void aastore(); | |
176 static void bastore(); | |
177 static void castore(); | |
178 static void sastore(); | |
179 | |
180 static void istore(int n); | |
181 static void lstore(int n); | |
182 static void fstore(int n); | |
183 static void dstore(int n); | |
184 static void astore(int n); | |
185 | |
186 static void pop(); | |
187 static void pop2(); | |
188 static void dup(); | |
189 static void dup_x1(); | |
190 static void dup_x2(); | |
191 static void dup2(); | |
192 static void dup2_x1(); | |
193 static void dup2_x2(); | |
194 static void swap(); | |
195 | |
196 static void iop2(Operation op); | |
197 static void lop2(Operation op); | |
198 static void fop2(Operation op); | |
199 static void dop2(Operation op); | |
200 | |
201 static void idiv(); | |
202 static void irem(); | |
203 | |
204 static void lmul(); | |
205 static void ldiv(); | |
206 static void lrem(); | |
207 static void lshl(); | |
208 static void lshr(); | |
209 static void lushr(); | |
210 | |
211 static void ineg(); | |
212 static void lneg(); | |
213 static void fneg(); | |
214 static void dneg(); | |
215 | |
216 static void iinc(); | |
217 static void wide_iinc(); | |
218 static void convert(); | |
219 static void lcmp(); | |
220 | |
221 static void float_cmp (bool is_float, int unordered_result); | |
222 static void float_cmp (int unordered_result); | |
223 static void double_cmp(int unordered_result); | |
224 | |
225 static void count_calls(Register method, Register temp); | |
226 static void branch(bool is_jsr, bool is_wide); | |
227 static void if_0cmp (Condition cc); | |
228 static void if_icmp (Condition cc); | |
229 static void if_nullcmp(Condition cc); | |
230 static void if_acmp (Condition cc); | |
231 | |
232 static void _goto(); | |
233 static void jsr(); | |
234 static void ret(); | |
235 static void wide_ret(); | |
236 | |
237 static void goto_w(); | |
238 static void jsr_w(); | |
239 | |
240 static void tableswitch(); | |
241 static void lookupswitch(); | |
242 static void fast_linearswitch(); | |
243 static void fast_binaryswitch(); | |
244 | |
245 static void _return(TosState state); | |
246 | |
247 static void resolve_cache_and_index(int byte_no, Register cache, Register index); | |
248 static void load_invoke_cp_cache_entry(int byte_no, | |
249 Register method, | |
250 Register itable_index, | |
251 Register flags, | |
252 bool is_invokevirtual = false, | |
253 bool is_virtual_final = false); | |
254 static void load_field_cp_cache_entry(Register obj, | |
255 Register cache, | |
256 Register index, | |
257 Register offset, | |
258 Register flags, | |
259 bool is_static); | |
260 static void invokevirtual(int byte_no); | |
261 static void invokespecial(int byte_no); | |
262 static void invokestatic(int byte_no); | |
263 static void invokeinterface(int byte_no); | |
726
be93aad57795
6655646: dynamic languages need dynamically linked call sites
jrose
parents:
342
diff
changeset
|
264 static void invokedynamic(int byte_no); |
0 | 265 static void fast_invokevfinal(int byte_no); |
266 | |
267 static void getfield_or_static(int byte_no, bool is_static); | |
268 static void putfield_or_static(int byte_no, bool is_static); | |
269 static void getfield(int byte_no); | |
270 static void putfield(int byte_no); | |
271 static void getstatic(int byte_no); | |
272 static void putstatic(int byte_no); | |
273 static void pop_and_check_object(Register obj); | |
274 | |
275 static void _new(); | |
276 static void newarray(); | |
277 static void anewarray(); | |
278 static void arraylength(); | |
279 static void checkcast(); | |
280 static void instanceof(); | |
281 | |
282 static void athrow(); | |
283 | |
284 static void monitorenter(); | |
285 static void monitorexit(); | |
286 | |
287 static void wide(); | |
288 static void multianewarray(); | |
289 | |
290 static void fast_xaccess(TosState state); | |
291 static void fast_accessfield(TosState state); | |
292 static void fast_storefield(TosState state); | |
293 | |
294 static void _breakpoint(); | |
295 | |
296 static void shouldnotreachhere(); | |
297 | |
298 // jvmti support | |
299 static void jvmti_post_field_access(Register cache, Register index, bool is_static, bool has_tos); | |
300 static void jvmti_post_field_mod(Register cache, Register index, bool is_static); | |
301 static void jvmti_post_fast_field_mod(); | |
302 | |
303 // debugging of TemplateGenerator | |
304 static void transition(TosState tos_in, TosState tos_out);// checks if in/out states expected by template generator correspond to table entries | |
305 | |
306 // initialization helpers | |
307 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)( ), char filler ); | |
308 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg ), int arg ); | |
309 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg ); | |
310 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos); | |
311 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op); | |
312 static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc); | |
313 | |
314 friend class Template; | |
315 | |
316 // InterpreterMacroAssembler::is_a(), etc., need TemplateTable::call_VM(). | |
317 friend class InterpreterMacroAssembler; | |
318 | |
319 public: | |
320 // Initialization | |
321 static void initialize(); | |
322 static void pd_initialize(); | |
323 | |
324 // Templates | |
325 static Template* template_for (Bytecodes::Code code) { Bytecodes::check (code); return &_template_table [code]; } | |
326 static Template* template_for_wide(Bytecodes::Code code) { Bytecodes::wide_check(code); return &_template_table_wide[code]; } | |
327 | |
328 // Platform specifics | |
329 #include "incls/_templateTable_pd.hpp.incl" | |
330 }; | |
331 #endif /* !CC_INTERP */ |