Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openjdk-multiarch-jdk8u
Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/interpreter/templateTable.hpp
32285 views
1
/*
2
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_VM_INTERPRETER_TEMPLATETABLE_HPP
26
#define SHARE_VM_INTERPRETER_TEMPLATETABLE_HPP
27
28
#include "interpreter/bytecodes.hpp"
29
#include "memory/allocation.hpp"
30
#include "runtime/frame.hpp"
31
#if defined INTERP_MASM_MD_HPP
32
# include INTERP_MASM_MD_HPP
33
#elif defined TARGET_ARCH_x86
34
# include "interp_masm_x86.hpp"
35
#elif defined TARGET_ARCH_MODEL_aarch32
36
# include "interp_masm_aarch32.hpp"
37
#elif defined TARGET_ARCH_MODEL_aarch64
38
# include "interp_masm_aarch64.hpp"
39
#elif defined TARGET_ARCH_MODEL_sparc
40
# include "interp_masm_sparc.hpp"
41
#elif defined TARGET_ARCH_MODEL_zero
42
# include "interp_masm_zero.hpp"
43
#elif defined TARGET_ARCH_MODEL_ppc_64
44
# include "interp_masm_ppc_64.hpp"
45
#endif
46
47
#ifndef CC_INTERP
48
// All the necessary definitions used for (bytecode) template generation. Instead of
49
// spreading the implementation functionality for each bytecode in the interpreter
50
// and the snippet generator, a template is assigned to each bytecode which can be
51
// used to generate the bytecode's implementation if needed.
52
53
54
// A Template describes the properties of a code template for a given bytecode
55
// and provides a generator to generate the code template.
56
57
class Template VALUE_OBJ_CLASS_SPEC {
58
private:
59
enum Flags {
60
uses_bcp_bit, // set if template needs the bcp pointing to bytecode
61
does_dispatch_bit, // set if template dispatches on its own
62
calls_vm_bit, // set if template calls the vm
63
wide_bit // set if template belongs to a wide instruction
64
};
65
66
typedef void (*generator)(int arg);
67
68
int _flags; // describes interpreter template properties (bcp unknown)
69
TosState _tos_in; // tos cache state before template execution
70
TosState _tos_out; // tos cache state after template execution
71
generator _gen; // template code generator
72
int _arg; // argument for template code generator
73
74
void initialize(int flags, TosState tos_in, TosState tos_out, generator gen, int arg);
75
76
friend class TemplateTable;
77
78
public:
79
Bytecodes::Code bytecode() const;
80
bool is_valid() const { return _gen != NULL; }
81
bool uses_bcp() const { return (_flags & (1 << uses_bcp_bit )) != 0; }
82
bool does_dispatch() const { return (_flags & (1 << does_dispatch_bit)) != 0; }
83
bool calls_vm() const { return (_flags & (1 << calls_vm_bit )) != 0; }
84
bool is_wide() const { return (_flags & (1 << wide_bit )) != 0; }
85
TosState tos_in() const { return _tos_in; }
86
TosState tos_out() const { return _tos_out; }
87
void generate(InterpreterMacroAssembler* masm);
88
};
89
90
91
// The TemplateTable defines all Templates and provides accessor functions
92
// to get the template for a given bytecode.
93
94
class TemplateTable: AllStatic {
95
public:
96
enum Operation { add, sub, mul, div, rem, _and, _or, _xor, shl, shr, ushr };
97
enum Condition { equal, not_equal, less, less_equal, greater, greater_equal };
98
enum CacheByte { f1_byte = 1, f2_byte = 2 }; // byte_no codes
99
100
private:
101
static bool _is_initialized; // true if TemplateTable has been initialized
102
static Template _template_table [Bytecodes::number_of_codes];
103
static Template _template_table_wide[Bytecodes::number_of_codes];
104
105
static Template* _desc; // the current template to be generated
106
static Bytecodes::Code bytecode() { return _desc->bytecode(); }
107
108
static BarrierSet* _bs; // Cache the barrier set.
109
public:
110
//%note templates_1
111
static InterpreterMacroAssembler* _masm; // the assembler used when generating templates
112
113
private:
114
115
// special registers
116
static inline Address at_bcp(int offset);
117
118
// helpers
119
static void unimplemented_bc();
120
static void patch_bytecode(Bytecodes::Code bc, Register bc_reg,
121
Register temp_reg, bool load_bc_into_bc_reg = true, int byte_no = -1);
122
123
// C calls
124
static void call_VM(Register oop_result, address entry_point);
125
static void call_VM(Register oop_result, address entry_point, Register arg_1);
126
static void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2);
127
static void call_VM(Register oop_result, address entry_point, Register arg_1, Register arg_2, Register arg_3);
128
129
// these overloadings are not presently used on SPARC:
130
static void call_VM(Register oop_result, Register last_java_sp, address entry_point);
131
static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1);
132
static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2);
133
static void call_VM(Register oop_result, Register last_java_sp, address entry_point, Register arg_1, Register arg_2, Register arg_3);
134
135
// bytecodes
136
static void nop();
137
138
static void aconst_null();
139
static void iconst(int value);
140
static void lconst(int value);
141
static void fconst(int value);
142
static void dconst(int value);
143
144
static void bipush();
145
static void sipush();
146
static void ldc(bool wide);
147
static void ldc2_w();
148
static void fast_aldc(bool wide);
149
150
static void locals_index(Register reg, int offset = 1);
151
static void iload();
152
static void fast_iload();
153
static void fast_iload2();
154
static void fast_icaload();
155
static void lload();
156
static void fload();
157
static void dload();
158
static void aload();
159
160
static void locals_index_wide(Register reg);
161
static void wide_iload();
162
static void wide_lload();
163
static void wide_fload();
164
static void wide_dload();
165
static void wide_aload();
166
167
static void iaload();
168
static void laload();
169
static void faload();
170
static void daload();
171
static void aaload();
172
static void baload();
173
static void caload();
174
static void saload();
175
176
static void iload(int n);
177
static void lload(int n);
178
static void fload(int n);
179
static void dload(int n);
180
static void aload(int n);
181
static void aload_0();
182
183
static void istore();
184
static void lstore();
185
static void fstore();
186
static void dstore();
187
static void astore();
188
189
static void wide_istore();
190
static void wide_lstore();
191
static void wide_fstore();
192
static void wide_dstore();
193
static void wide_astore();
194
195
static void iastore();
196
static void lastore();
197
static void fastore();
198
static void dastore();
199
static void aastore();
200
static void bastore();
201
static void castore();
202
static void sastore();
203
204
static void istore(int n);
205
static void lstore(int n);
206
static void fstore(int n);
207
static void dstore(int n);
208
static void astore(int n);
209
210
static void pop();
211
static void pop2();
212
static void dup();
213
static void dup_x1();
214
static void dup_x2();
215
static void dup2();
216
static void dup2_x1();
217
static void dup2_x2();
218
static void swap();
219
220
static void iop2(Operation op);
221
static void lop2(Operation op);
222
static void fop2(Operation op);
223
static void dop2(Operation op);
224
225
static void idiv();
226
static void irem();
227
228
static void lmul();
229
static void ldiv();
230
static void lrem();
231
static void lshl();
232
static void lshr();
233
static void lushr();
234
235
static void ineg();
236
static void lneg();
237
static void fneg();
238
static void dneg();
239
240
static void iinc();
241
static void wide_iinc();
242
static void convert();
243
static void lcmp();
244
245
static void float_cmp (bool is_float, int unordered_result);
246
static void float_cmp (int unordered_result);
247
static void double_cmp(int unordered_result);
248
249
static void count_calls(Register method, Register temp);
250
static void branch(bool is_jsr, bool is_wide);
251
static void if_0cmp (Condition cc);
252
static void if_icmp (Condition cc);
253
static void if_nullcmp(Condition cc);
254
static void if_acmp (Condition cc);
255
256
static void _goto();
257
static void jsr();
258
static void ret();
259
static void wide_ret();
260
261
static void goto_w();
262
static void jsr_w();
263
264
static void tableswitch();
265
static void lookupswitch();
266
static void fast_linearswitch();
267
static void fast_binaryswitch();
268
269
static void _return(TosState state);
270
271
static void resolve_cache_and_index(int byte_no, // one of 1,2,11
272
Register cache, // output for CP cache
273
Register index, // output for CP index
274
size_t index_size); // one of 1,2,4
275
static void load_invoke_cp_cache_entry(int byte_no,
276
Register method,
277
Register itable_index,
278
Register flags,
279
bool is_invokevirtual,
280
bool is_virtual_final,
281
bool is_invokedynamic);
282
static void load_field_cp_cache_entry(Register obj,
283
Register cache,
284
Register index,
285
Register offset,
286
Register flags,
287
bool is_static);
288
static void invokevirtual(int byte_no);
289
static void invokespecial(int byte_no);
290
static void invokestatic(int byte_no);
291
static void invokeinterface(int byte_no);
292
static void invokedynamic(int byte_no);
293
static void invokehandle(int byte_no);
294
static void fast_invokevfinal(int byte_no);
295
296
static void getfield_or_static(int byte_no, bool is_static);
297
static void putfield_or_static(int byte_no, bool is_static);
298
static void getfield(int byte_no);
299
static void putfield(int byte_no);
300
static void getstatic(int byte_no);
301
static void putstatic(int byte_no);
302
static void pop_and_check_object(Register obj);
303
304
static void _new();
305
static void newarray();
306
static void anewarray();
307
static void arraylength();
308
static void checkcast();
309
static void instanceof();
310
311
static void athrow();
312
313
static void monitorenter();
314
static void monitorexit();
315
316
static void wide();
317
static void multianewarray();
318
319
static void fast_xaccess(TosState state);
320
static void fast_accessfield(TosState state);
321
static void fast_storefield(TosState state);
322
323
static void _breakpoint();
324
325
static void shouldnotreachhere();
326
327
// jvmti support
328
static void jvmti_post_field_access(Register cache, Register index, bool is_static, bool has_tos);
329
static void jvmti_post_field_mod(Register cache, Register index, bool is_static);
330
static void jvmti_post_fast_field_mod();
331
332
// debugging of TemplateGenerator
333
static void transition(TosState tos_in, TosState tos_out);// checks if in/out states expected by template generator correspond to table entries
334
335
// initialization helpers
336
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)( ), char filler );
337
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(int arg ), int arg );
338
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(bool arg ), bool arg );
339
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(TosState tos), TosState tos);
340
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Operation op), Operation op);
341
static void def(Bytecodes::Code code, int flags, TosState in, TosState out, void (*gen)(Condition cc), Condition cc);
342
343
friend class Template;
344
345
// InterpreterMacroAssembler::is_a(), etc., need TemplateTable::call_VM().
346
friend class InterpreterMacroAssembler;
347
348
public:
349
// Initialization
350
static void initialize();
351
static void pd_initialize();
352
353
// Templates
354
static Template* template_for (Bytecodes::Code code) { Bytecodes::check (code); return &_template_table [code]; }
355
static Template* template_for_wide(Bytecodes::Code code) { Bytecodes::wide_check(code); return &_template_table_wide[code]; }
356
357
// Platform specifics
358
#if defined TEMPLATETABLE_MD_HPP
359
# include TEMPLATETABLE_MD_HPP
360
#elif defined TARGET_ARCH_MODEL_x86_32
361
# include "templateTable_x86_32.hpp"
362
#elif defined TARGET_ARCH_MODEL_x86_64
363
# include "templateTable_x86_64.hpp"
364
#elif defined TARGET_ARCH_MODEL_aarch32
365
# include "templateTable_aarch32.hpp"
366
#elif defined TARGET_ARCH_MODEL_aarch64
367
# include "templateTable_aarch64.hpp"
368
#elif defined TARGET_ARCH_MODEL_sparc
369
# include "templateTable_sparc.hpp"
370
#elif defined TARGET_ARCH_MODEL_zero
371
# include "templateTable_zero.hpp"
372
#elif defined TARGET_ARCH_MODEL_ppc_64
373
# include "templateTable_ppc_64.hpp"
374
#endif
375
376
};
377
#endif /* !CC_INTERP */
378
379
#endif // SHARE_VM_INTERPRETER_TEMPLATETABLE_HPP
380
381