68 static const Address d_tmp;
69
70 // dispatch routines
71 void dispatch_next(TosState state, int step = 0, bool generate_poll = false);
72 void dispatch_via (TosState state, address* table);
73 void load_dispatch_table(Register dst, address* table);
74 void dispatch_Lbyte_code(TosState state, Register bytecode, address* table, bool generate_poll = false);
75
76 // Called by shared interpreter generator.
77 void dispatch_prolog(TosState state, int step = 0);
78 void dispatch_epilog(TosState state, int step = 0);
79
80 // Super call_VM calls - correspond to MacroAssembler::call_VM(_leaf) calls.
81 void super_call_VM_leaf(Register thread_cache, address entry_point, Register arg_1);
82 void super_call_VM(Register thread_cache, Register oop_result, Register last_java_sp,
83 address entry_point, Register arg_1, Register arg_2, bool check_exception = true);
84
85 // Generate a subtype check: branch to ok_is_subtype if sub_klass is
86 // a subtype of super_klass. Blows registers tmp1, tmp2 and tmp3.
87 void gen_subtype_check(Register sub_klass, Register super_klass,
88 Register tmp1, Register tmp2, Register tmp3, Label &ok_is_subtype);
89
90 // Load object from cpool->resolved_references(index).
91 void load_resolved_reference_at_index(Register result, Register index, Register tmp1, Register tmp2,
92 Label *L_handle_null = nullptr);
93
94 // load cpool->resolved_klass_at(index)
95 void load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass);
96
97 void load_receiver(Register Rparam_count, Register Rrecv_dst);
98
99 // helpers for expression stack
100 void pop_i( Register r = R17_tos);
101 void pop_ptr( Register r = R17_tos);
102 void pop_l( Register r = R17_tos);
103 void pop_f(FloatRegister f = F15_ftos);
104 void pop_d(FloatRegister f = F15_ftos );
105
106 void push_i( Register r = R17_tos);
107 void push_ptr( Register r = R17_tos);
108 void push_l( Register r = R17_tos);
238 void test_method_data_pointer(Label& zero_continue);
239 void verify_method_data_pointer();
240
241 void set_mdp_data_at(int constant, Register value);
242
243 void increment_mdp_data_at(int constant, Register counter_addr, Register Rbumped_count, bool decrement = false);
244
245 void increment_mdp_data_at(Register counter_addr, Register Rbumped_count, bool decrement = false);
246 void increment_mdp_data_at(Register reg, int constant, Register scratch, Register Rbumped_count, bool decrement = false);
247
248 void set_mdp_flag_at(int flag_constant, Register scratch);
249 void test_mdp_data_at(int offset, Register value, Label& not_equal_continue, Register test_out);
250
251 void update_mdp_by_offset(int offset_of_disp, Register scratch);
252 void update_mdp_by_offset(Register reg, int offset_of_disp,
253 Register scratch);
254 void update_mdp_by_constant(int constant);
255 void update_mdp_for_ret(TosState state, Register return_bci);
256
257 void profile_taken_branch(Register scratch, Register bumped_count);
258 void profile_not_taken_branch(Register scratch1, Register scratch2);
259 void profile_call(Register scratch1, Register scratch2);
260 void profile_final_call(Register scratch1, Register scratch2);
261 void profile_virtual_call(Register Rreceiver, Register Rscratch1, Register Rscratch2);
262 void profile_typecheck(Register Rklass, Register Rscratch1, Register Rscratch2);
263 void profile_ret(TosState state, Register return_bci, Register scratch1, Register scratch2);
264 void profile_switch_default(Register scratch1, Register scratch2);
265 void profile_switch_case(Register index, Register scratch1,Register scratch2, Register scratch3);
266 void profile_null_seen(Register Rscratch1, Register Rscratch2);
267
268 // Argument and return type profiling.
269 void profile_obj_type(Register obj, Register mdo_addr_base, RegisterOrConstant mdo_addr_offs, Register tmp, Register tmp2);
270 void profile_arguments_type(Register callee, Register tmp1, Register tmp2, bool is_virtual);
271 void profile_return_type(Register ret, Register tmp1, Register tmp2);
272 void profile_parameters_type(Register tmp1, Register tmp2, Register tmp3, Register tmp4);
273
274 // Debugging
275 void verify_oop(Register reg, TosState state = atos); // only if +VerifyOops && state == atos
276 void verify_oop_or_return_address(Register reg, Register rtmp); // for astore
277
278 typedef enum { NotifyJVMTI, SkipNotifyJVMTI } NotifyMethodExitMode;
279
280 // Support for jvmdi/jvmpi.
281 void notify_method_entry();
282 void notify_method_exit(bool is_native_method, TosState state,
283 NotifyMethodExitMode mode, bool check_exceptions);
284 };
285
286 #endif // CPU_PPC_INTERP_MASM_PPC_HPP
|
68 static const Address d_tmp;
69
70 // dispatch routines
71 void dispatch_next(TosState state, int step = 0, bool generate_poll = false);
72 void dispatch_via (TosState state, address* table);
73 void load_dispatch_table(Register dst, address* table);
74 void dispatch_Lbyte_code(TosState state, Register bytecode, address* table, bool generate_poll = false);
75
76 // Called by shared interpreter generator.
77 void dispatch_prolog(TosState state, int step = 0);
78 void dispatch_epilog(TosState state, int step = 0);
79
80 // Super call_VM calls - correspond to MacroAssembler::call_VM(_leaf) calls.
81 void super_call_VM_leaf(Register thread_cache, address entry_point, Register arg_1);
82 void super_call_VM(Register thread_cache, Register oop_result, Register last_java_sp,
83 address entry_point, Register arg_1, Register arg_2, bool check_exception = true);
84
85 // Generate a subtype check: branch to ok_is_subtype if sub_klass is
86 // a subtype of super_klass. Blows registers tmp1, tmp2 and tmp3.
87 void gen_subtype_check(Register sub_klass, Register super_klass,
88 Register tmp1, Register tmp2, Register tmp3, Label &ok_is_subtype, bool profile = true);
89
90 // Load object from cpool->resolved_references(index).
91 void load_resolved_reference_at_index(Register result, Register index, Register tmp1, Register tmp2,
92 Label *L_handle_null = nullptr);
93
94 // load cpool->resolved_klass_at(index)
95 void load_resolved_klass_at_offset(Register Rcpool, Register Roffset, Register Rklass);
96
97 void load_receiver(Register Rparam_count, Register Rrecv_dst);
98
99 // helpers for expression stack
100 void pop_i( Register r = R17_tos);
101 void pop_ptr( Register r = R17_tos);
102 void pop_l( Register r = R17_tos);
103 void pop_f(FloatRegister f = F15_ftos);
104 void pop_d(FloatRegister f = F15_ftos );
105
106 void push_i( Register r = R17_tos);
107 void push_ptr( Register r = R17_tos);
108 void push_l( Register r = R17_tos);
238 void test_method_data_pointer(Label& zero_continue);
239 void verify_method_data_pointer();
240
241 void set_mdp_data_at(int constant, Register value);
242
243 void increment_mdp_data_at(int constant, Register counter_addr, Register Rbumped_count, bool decrement = false);
244
245 void increment_mdp_data_at(Register counter_addr, Register Rbumped_count, bool decrement = false);
246 void increment_mdp_data_at(Register reg, int constant, Register scratch, Register Rbumped_count, bool decrement = false);
247
248 void set_mdp_flag_at(int flag_constant, Register scratch);
249 void test_mdp_data_at(int offset, Register value, Label& not_equal_continue, Register test_out);
250
251 void update_mdp_by_offset(int offset_of_disp, Register scratch);
252 void update_mdp_by_offset(Register reg, int offset_of_disp,
253 Register scratch);
254 void update_mdp_by_constant(int constant);
255 void update_mdp_for_ret(TosState state, Register return_bci);
256
257 void profile_taken_branch(Register scratch, Register bumped_count);
258 void profile_not_taken_branch(Register scratch1, Register scratch2, bool acmp = false);
259 void profile_call(Register scratch1, Register scratch2);
260 void profile_final_call(Register scratch1, Register scratch2);
261 void profile_virtual_call(Register Rreceiver, Register Rscratch1, Register Rscratch2);
262 void profile_typecheck(Register Rklass, Register Rscratch1, Register Rscratch2);
263 void profile_ret(TosState state, Register return_bci, Register scratch1, Register scratch2);
264 void profile_switch_default(Register scratch1, Register scratch2);
265 void profile_switch_case(Register index, Register scratch1,Register scratch2, Register scratch3);
266 void profile_null_seen(Register Rscratch1, Register Rscratch2);
267
268 template <class ArrayData> void profile_array_type(Register array, Register tmp1, Register tmp2);
269
270 void profile_multiple_element_types(Register element, Register tmp1, Register tmp2, Register tmp3);
271 void profile_element_type(Register element, Register tmp1, Register tmp2);
272 void profile_acmp(Register left, Register right, Register tmp1, Register tmp2);
273
274 // Argument and return type profiling.
275 void profile_obj_type(Register obj, Register mdo_addr_base, RegisterOrConstant mdo_addr_offs, Register tmp, Register tmp2);
276 void profile_arguments_type(Register callee, Register tmp1, Register tmp2, bool is_virtual);
277 void profile_return_type(Register ret, Register tmp1, Register tmp2);
278 void profile_parameters_type(Register tmp1, Register tmp2, Register tmp3, Register tmp4);
279
280 // Debugging
281 void verify_oop(Register reg, TosState state = atos); // only if +VerifyOops && state == atos
282 void verify_oop_or_return_address(Register reg, Register rtmp); // for astore
283
284 typedef enum { NotifyJVMTI, SkipNotifyJVMTI } NotifyMethodExitMode;
285
286 // Support for jvmdi/jvmpi.
287 void notify_method_entry();
288 void notify_method_exit(bool is_native_method, TosState state,
289 NotifyMethodExitMode mode, bool check_exceptions);
290
291 // Allocate instance in "obj" and read in the content of the inline field
292 // NOTES:
293 // - input holder object via "obj", which must be r0,
294 // will return new instance via the same reg
295 void read_flat_field(Register entry, Register obj);
296 void write_flat_field(Register entry, Register tmp1, Register tmp2, Register obj, Register field_offset, Register value);
297 };
298
299 #endif // CPU_PPC_INTERP_MASM_PPC_HPP
|