1 /* |
1 /* |
2 * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. |
2 * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * |
4 * |
5 * This code is free software; you can redistribute it and/or modify it |
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 |
6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. |
7 * published by the Free Software Foundation. |
83 inline address* frame::O0_addr() const { return (address*) &younger_sp()[ I0->sp_offset_in_saved_window()]; } |
83 inline address* frame::O0_addr() const { return (address*) &younger_sp()[ I0->sp_offset_in_saved_window()]; } |
84 |
84 |
85 inline intptr_t* frame::sender_sp() const { return fp(); } |
85 inline intptr_t* frame::sender_sp() const { return fp(); } |
86 |
86 |
87 inline intptr_t* frame::real_fp() const { return fp(); } |
87 inline intptr_t* frame::real_fp() const { return fp(); } |
88 |
|
89 // Used only in frame::oopmapreg_to_location |
|
90 // This return a value in VMRegImpl::slot_size |
|
91 inline int frame::pd_oop_map_offset_adjustment() const { |
|
92 return _sp_adjustment_by_callee * VMRegImpl::slots_per_word; |
|
93 } |
|
94 |
88 |
95 inline intptr_t** frame::interpreter_frame_locals_addr() const { |
89 inline intptr_t** frame::interpreter_frame_locals_addr() const { |
96 return (intptr_t**) sp_addr_at( Llocals->sp_offset_in_saved_window()); |
90 return (intptr_t**) sp_addr_at( Llocals->sp_offset_in_saved_window()); |
97 } |
91 } |
98 |
92 |
189 const Argument link = Argument(0, false); |
183 const Argument link = Argument(0, false); |
190 return (JavaCallWrapper**)&sp()[link.as_in().as_register()->sp_offset_in_saved_window()]; |
184 return (JavaCallWrapper**)&sp()[link.as_in().as_register()->sp_offset_in_saved_window()]; |
191 } |
185 } |
192 |
186 |
193 |
187 |
194 inline int frame::local_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors) { |
|
195 // always allocate non-argument locals 0..5 as if they were arguments: |
|
196 int allocated_above_frame = nof_args; |
|
197 if (allocated_above_frame < callee_register_argument_save_area_words) |
|
198 allocated_above_frame = callee_register_argument_save_area_words; |
|
199 if (allocated_above_frame > max_nof_locals) |
|
200 allocated_above_frame = max_nof_locals; |
|
201 |
|
202 // Note: monitors (BasicLock blocks) are never allocated in argument slots |
|
203 //assert(local_index >= 0 && local_index < max_nof_locals, "bad local index"); |
|
204 if (local_index < allocated_above_frame) |
|
205 return local_index + callee_register_argument_save_area_sp_offset; |
|
206 else |
|
207 return local_index - (max_nof_locals + max_nof_monitors*2) + compiler_frame_vm_locals_fp_offset; |
|
208 } |
|
209 |
|
210 inline int frame::monitor_offset_for_compiler(int local_index, int nof_args, int max_nof_locals, int max_nof_monitors) { |
|
211 assert(local_index >= max_nof_locals && ((local_index - max_nof_locals) & 1) && (local_index - max_nof_locals) < max_nof_monitors*2, "bad monitor index"); |
|
212 |
|
213 // The compiler uses the __higher__ of two indexes allocated to the monitor. |
|
214 // Increasing local indexes are mapped to increasing memory locations, |
|
215 // so the start of the BasicLock is associated with the __lower__ index. |
|
216 |
|
217 int offset = (local_index-1) - (max_nof_locals + max_nof_monitors*2) + compiler_frame_vm_locals_fp_offset; |
|
218 |
|
219 // We allocate monitors aligned zero mod 8: |
|
220 assert((offset & 1) == 0, "monitor must be an an even address."); |
|
221 // This works because all monitors are allocated after |
|
222 // all locals, and because the highest address corresponding to any |
|
223 // monitor index is always even. |
|
224 assert((compiler_frame_vm_locals_fp_offset & 1) == 0, "end of monitors must be even address"); |
|
225 |
|
226 return offset; |
|
227 } |
|
228 |
|
229 inline int frame::min_local_offset_for_compiler(int nof_args, int max_nof_locals, int max_nof_monitors) { |
|
230 // always allocate non-argument locals 0..5 as if they were arguments: |
|
231 int allocated_above_frame = nof_args; |
|
232 if (allocated_above_frame < callee_register_argument_save_area_words) |
|
233 allocated_above_frame = callee_register_argument_save_area_words; |
|
234 if (allocated_above_frame > max_nof_locals) |
|
235 allocated_above_frame = max_nof_locals; |
|
236 |
|
237 int allocated_in_frame = (max_nof_locals + max_nof_monitors*2) - allocated_above_frame; |
|
238 |
|
239 return compiler_frame_vm_locals_fp_offset - allocated_in_frame; |
|
240 } |
|
241 |
|
242 // On SPARC, the %lN and %iN registers are non-volatile. |
|
243 inline bool frame::volatile_across_calls(Register reg) { |
|
244 // This predicate is (presently) applied only to temporary registers, |
|
245 // and so it need not recognize non-volatile globals. |
|
246 return reg->is_out() || reg->is_global(); |
|
247 } |
|
248 |
|
249 inline oop frame::saved_oop_result(RegisterMap* map) const { |
188 inline oop frame::saved_oop_result(RegisterMap* map) const { |
250 return *((oop*) map->location(O0->as_VMReg())); |
189 return *((oop*) map->location(O0->as_VMReg())); |
251 } |
190 } |
252 |
191 |
253 inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) { |
192 inline void frame::set_saved_oop_result(RegisterMap* map, oop obj) { |