< prev index next >

src/hotspot/cpu/riscv/interp_masm_riscv.hpp

Print this page

144 
145   void get_constant_pool(Register reg) {
146     get_const(reg);
147     ld(reg, Address(reg, in_bytes(ConstMethod::constants_offset())));
148   }
149 
150   void get_constant_pool_cache(Register reg) {
151     get_constant_pool(reg);
152     ld(reg, Address(reg, ConstantPool::cache_offset()));
153   }
154 
155   void get_cpool_and_tags(Register cpool, Register tags) {
156     get_constant_pool(cpool);
157     ld(tags, Address(cpool, ConstantPool::tags_offset()));
158   }
159 
160   void get_unsigned_2_byte_index_at_bcp(Register reg, int bcp_offset);
161   void get_cache_index_at_bcp(Register index, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
162   void get_method_counters(Register method, Register mcs, Label& skip);
163 











164   // Load cpool->resolved_references(index).
165   void load_resolved_reference_at_index(Register result, Register index, Register tmp = x15);
166 
167   // Load cpool->resolved_klass_at(index).
168   void load_resolved_klass_at_offset(Register cpool, Register index, Register klass, Register temp);
169 
170   void pop_ptr(Register r = x10);
171   void pop_i(Register r = x10);
172   void pop_l(Register r = x10);
173   void pop_f(FloatRegister r = f10);
174   void pop_d(FloatRegister r = f10);
175   void push_ptr(Register r = x10);
176   void push_i(Register r = x10);
177   void push_l(Register r = x10);
178   void push_f(FloatRegister r = f10);
179   void push_d(FloatRegister r = f10);
180 
181   void pop(TosState state); // transition vtos -> state
182   void push(TosState state); // transition state -> vtos
183 
184   void empty_expression_stack() {
185     ld(t0, Address(fp, frame::interpreter_frame_monitor_block_top_offset * wordSize));
186     shadd(esp, t0, fp, t0, LogBytesPerWord);
187     // null last_sp until next java call
188     sd(zr, Address(fp, frame::interpreter_frame_last_sp_offset * wordSize));
189   }
190 
191   // Helpers for swap and dup
192   void load_ptr(int n, Register val);
193   void store_ptr(int n, Register val);
194 
195   // Load float value from 'address'. The value is loaded onto the fp register f10.
196   void load_float(Address src);
197   void load_double(Address src);
198 
199   // Generate a subtype check: branch to ok_is_subtype if sub_klass is
200   // a subtype of super_klass.
201   void gen_subtype_check( Register sub_klass, Label &ok_is_subtype );
202 
203   // Dispatching
204   void dispatch_prolog(TosState state, int step = 0);
205   void dispatch_epilog(TosState state, int step = 0);
206   // dispatch via t0
207   void dispatch_only(TosState state, bool generate_poll = false, Register Rs = t0);
208   // dispatch normal table via t0 (assume t0 is loaded already)
209   void dispatch_only_normal(TosState state, Register Rs = t0);
210   void dispatch_only_noverify(TosState state, Register Rs = t0);
211   // load t0 from [xbcp + step] and dispatch via t0
212   void dispatch_next(TosState state, int step = 0, bool generate_poll = false);
213   // load t0 from [xbcp] and dispatch via t0 and table
214   void dispatch_via (TosState state, address* table);
215 
216   // jump to an invoked target
217   void prepare_to_jump_from_interpreted();
218   void jump_from_interpreted(Register method);
219 
220 
221   // Returning from interpreted functions

254   void increment_mdp_data_at(Register mdp_in, Register index, int constant);
255   void increment_mask_and_jump(Address counter_addr,
256                                int increment, Address mask,
257                                Register tmp1, Register tmp2,
258                                bool preloaded, Label* where);
259 
260   void set_mdp_flag_at(Register mdp_in, int flag_constant);
261   void test_mdp_data_at(Register mdp_in, int offset, Register value,
262                         Register test_value_out,
263                         Label& not_equal_continue);
264 
265   void update_mdp_by_offset(Register mdp_in, int offset_of_offset);
266   void update_mdp_by_offset(Register mdp_in, Register reg, int offset_of_disp);
267   void update_mdp_by_constant(Register mdp_in, int constant);
268   void update_mdp_for_ret(Register return_bci);
269 
270   // narrow int return value
271   void narrow(Register result);
272 
273   void profile_taken_branch(Register mdp);
274   void profile_not_taken_branch(Register mdp);
275   void profile_call(Register mdp);
276   void profile_final_call(Register mdp);
277   void profile_virtual_call(Register receiver, Register mdp);
278   void profile_ret(Register return_bci, Register mdp);
279   void profile_null_seen(Register mdp);
280   void profile_typecheck(Register mdp, Register klass);
281   void profile_typecheck_failed(Register mdp);
282   void profile_switch_default(Register mdp);
283   void profile_switch_case(Register index_in_scratch, Register mdp,
284                            Register temp);




285 
286   void profile_obj_type(Register obj, const Address& mdo_addr, Register tmp);
287   void profile_arguments_type(Register mdp, Register callee, Register tmp, bool is_virtual);
288   void profile_return_type(Register mdp, Register ret, Register tmp);
289   void profile_parameters_type(Register mdp, Register tmp1, Register tmp2, Register tmp3);
290 
291   typedef enum { NotifyJVMTI, SkipNotifyJVMTI } NotifyMethodExitMode;
292 
293   // support for jvmti/dtrace
294   void notify_method_entry();
295   void notify_method_exit(TosState state, NotifyMethodExitMode mode);
296 
297   JFR_ONLY(void enter_jfr_critical_section();)
298   JFR_ONLY(void leave_jfr_critical_section();)
299 
300   virtual void _call_Unimplemented(address call_site) {
301     save_bcp();
302     set_last_Java_frame(esp, fp, (address) pc(), t0);
303     MacroAssembler::_call_Unimplemented(call_site);
304   }

144 
145   void get_constant_pool(Register reg) {
146     get_const(reg);
147     ld(reg, Address(reg, in_bytes(ConstMethod::constants_offset())));
148   }
149 
150   void get_constant_pool_cache(Register reg) {
151     get_constant_pool(reg);
152     ld(reg, Address(reg, ConstantPool::cache_offset()));
153   }
154 
155   void get_cpool_and_tags(Register cpool, Register tags) {
156     get_constant_pool(cpool);
157     ld(tags, Address(cpool, ConstantPool::tags_offset()));
158   }
159 
160   void get_unsigned_2_byte_index_at_bcp(Register reg, int bcp_offset);
161   void get_cache_index_at_bcp(Register index, Register tmp, int bcp_offset, size_t index_size = sizeof(u2));
162   void get_method_counters(Register method, Register mcs, Label& skip);
163 
164   // Allocate instance in "obj" and read in the content of the inline field
165   // NOTES:
166   //   - input holder object via "obj", which must be x10,
167   //     will return new instance via the same reg
168   //   - assumes holder_klass and valueKlass field klass have both been resolved
169   void read_flat_field(Register entry, Register obj);
170 
171   void write_flat_field(Register entry, Register field_offset,
172                         Register tmp1, Register tmp2,
173                         Register obj);
174 
175   // Load cpool->resolved_references(index).
176   void load_resolved_reference_at_index(Register result, Register index, Register tmp = x15);
177 
178   // Load cpool->resolved_klass_at(index).
179   void load_resolved_klass_at_offset(Register cpool, Register index, Register klass, Register temp);
180 
181   void pop_ptr(Register r = x10);
182   void pop_i(Register r = x10);
183   void pop_l(Register r = x10);
184   void pop_f(FloatRegister r = f10);
185   void pop_d(FloatRegister r = f10);
186   void push_ptr(Register r = x10);
187   void push_i(Register r = x10);
188   void push_l(Register r = x10);
189   void push_f(FloatRegister r = f10);
190   void push_d(FloatRegister r = f10);
191 
192   void pop(TosState state); // transition vtos -> state
193   void push(TosState state); // transition state -> vtos
194 
195   void empty_expression_stack() {
196     ld(t0, Address(fp, frame::interpreter_frame_monitor_block_top_offset * wordSize));
197     shadd(esp, t0, fp, t0, LogBytesPerWord);
198     // null last_sp until next java call
199     sd(zr, Address(fp, frame::interpreter_frame_last_sp_offset * wordSize));
200   }
201 
202   // Helpers for swap and dup
203   void load_ptr(int n, Register val);
204   void store_ptr(int n, Register val);
205 
206   // Load float value from 'address'. The value is loaded onto the fp register f10.
207   void load_float(Address src);
208   void load_double(Address src);
209 
210   // Generate a subtype check: branch to ok_is_subtype if sub_klass is
211   // a subtype of super_klass.
212   void gen_subtype_check( Register sub_klass, Label &ok_is_subtype, bool profile = true);
213 
214   // Dispatching
215   void dispatch_prolog(TosState state, int step = 0);
216   void dispatch_epilog(TosState state, int step = 0);
217   // dispatch via t0
218   void dispatch_only(TosState state, bool generate_poll = false, Register Rs = t0);
219   // dispatch normal table via t0 (assume t0 is loaded already)
220   void dispatch_only_normal(TosState state, Register Rs = t0);
221   void dispatch_only_noverify(TosState state, Register Rs = t0);
222   // load t0 from [xbcp + step] and dispatch via t0
223   void dispatch_next(TosState state, int step = 0, bool generate_poll = false);
224   // load t0 from [xbcp] and dispatch via t0 and table
225   void dispatch_via (TosState state, address* table);
226 
227   // jump to an invoked target
228   void prepare_to_jump_from_interpreted();
229   void jump_from_interpreted(Register method);
230 
231 
232   // Returning from interpreted functions

265   void increment_mdp_data_at(Register mdp_in, Register index, int constant);
266   void increment_mask_and_jump(Address counter_addr,
267                                int increment, Address mask,
268                                Register tmp1, Register tmp2,
269                                bool preloaded, Label* where);
270 
271   void set_mdp_flag_at(Register mdp_in, int flag_constant);
272   void test_mdp_data_at(Register mdp_in, int offset, Register value,
273                         Register test_value_out,
274                         Label& not_equal_continue);
275 
276   void update_mdp_by_offset(Register mdp_in, int offset_of_offset);
277   void update_mdp_by_offset(Register mdp_in, Register reg, int offset_of_disp);
278   void update_mdp_by_constant(Register mdp_in, int constant);
279   void update_mdp_for_ret(Register return_bci);
280 
281   // narrow int return value
282   void narrow(Register result);
283 
284   void profile_taken_branch(Register mdp);
285   void profile_not_taken_branch(Register mdp, bool acmp = false);
286   void profile_call(Register mdp);
287   void profile_final_call(Register mdp);
288   void profile_virtual_call(Register receiver, Register mdp);
289   void profile_ret(Register return_bci, Register mdp);
290   void profile_null_seen(Register mdp);
291   void profile_typecheck(Register mdp, Register klass);
292   void profile_typecheck_failed(Register mdp);
293   void profile_switch_default(Register mdp);
294   void profile_switch_case(Register index_in_scratch, Register mdp,
295                            Register temp);
296   template <class ArrayData> void profile_array_type(Register mdp, Register array, Register tmp);
297   void profile_multiple_element_types(Register mdp, Register element, Register tmp, Register tmp2);
298   void profile_element_type(Register mdp, Register element, Register tmp);
299   void profile_acmp(Register mdp, Register left, Register right, Register tmp);
300 
301   void profile_obj_type(Register obj, const Address& mdo_addr, Register tmp);
302   void profile_arguments_type(Register mdp, Register callee, Register tmp, bool is_virtual);
303   void profile_return_type(Register mdp, Register ret, Register tmp);
304   void profile_parameters_type(Register mdp, Register tmp1, Register tmp2, Register tmp3);
305 
306   typedef enum { NotifyJVMTI, SkipNotifyJVMTI } NotifyMethodExitMode;
307 
308   // support for jvmti/dtrace
309   void notify_method_entry();
310   void notify_method_exit(TosState state, NotifyMethodExitMode mode);
311 
312   JFR_ONLY(void enter_jfr_critical_section();)
313   JFR_ONLY(void leave_jfr_critical_section();)
314 
315   virtual void _call_Unimplemented(address call_site) {
316     save_bcp();
317     set_last_Java_frame(esp, fp, (address) pc(), t0);
318     MacroAssembler::_call_Unimplemented(call_site);
319   }
< prev index next >