170
171 // Implementation of StubFrame
172
173 class StubFrame: public StackObj {
174 private:
175 StubAssembler* _sasm;
176 bool _return_state;
177
178 public:
179 StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state=requires_return);
180 void load_argument(int offset_in_words, Register reg);
181
182 ~StubFrame();
183 };;
184
185 void StubAssembler::prologue(const char* name, bool must_gc_arguments) {
186 set_info(name, must_gc_arguments);
187 enter();
188 }
189
190 void StubAssembler::epilogue() {
191 leave();
192 ret();
193 }
194
195 #define __ _sasm->
196
197 StubFrame::StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state) {
198 _sasm = sasm;
199 _return_state = return_state;
200 __ prologue(name, must_gc_arguments);
201 }
202
203 // load parameters that were stored with LIR_Assembler::store_parameter
204 // Note: offsets for store_parameter and load_argument must match
205 void StubFrame::load_argument(int offset_in_words, Register reg) {
206 __ load_parameter(offset_in_words, reg);
207 }
208
209
210 StubFrame::~StubFrame() {
339 void Runtime1::initialize_pd() {
340 int i = 0;
341 int sp_offset = 0;
342 const int step = 2; // SP offsets are in halfwords
343
344 // all float registers are saved explicitly
345 for (i = 0; i < FrameMap::nof_fpu_regs; i++) {
346 fpu_reg_save_offsets[i] = sp_offset;
347 sp_offset += step;
348 }
349
350 // a slot reserved for stack 16-byte alignment, see MacroAssembler::push_reg
351 sp_offset += step;
352 // we save x5 ~ x31, except x0 ~ x4: loop starts from x5
353 for (i = 5; i < FrameMap::nof_cpu_regs; i++) {
354 cpu_reg_save_offsets[i] = sp_offset;
355 sp_offset += step;
356 }
357 }
358
359 // target: the entry point of the method that creates and posts the exception oop
360 // has_argument: true if the exception needs arguments (passed in t0 and t1)
361
362 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
363 // make a frame and preserve the caller's caller-save registers
364 OopMap* oop_map = save_live_registers(sasm);
365 assert_cond(oop_map != nullptr);
366 int call_offset = 0;
367 if (!has_argument) {
368 call_offset = __ call_RT(noreg, noreg, target);
369 } else {
370 __ mv(c_rarg1, t0);
371 __ mv(c_rarg2, t1);
372 call_offset = __ call_RT(noreg, noreg, target);
373 }
374 OopMapSet* oop_maps = new OopMapSet();
375 assert_cond(oop_maps != nullptr);
376 oop_maps->add_gc_map(call_offset, oop_map);
377
378 return oop_maps;
|
170
171 // Implementation of StubFrame
172
173 class StubFrame: public StackObj {
174 private:
175 StubAssembler* _sasm;
176 bool _return_state;
177
178 public:
179 StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state=requires_return);
180 void load_argument(int offset_in_words, Register reg);
181
182 ~StubFrame();
183 };;
184
185 void StubAssembler::prologue(const char* name, bool must_gc_arguments) {
186 set_info(name, must_gc_arguments);
187 enter();
188 }
189
190 void StubAssembler::epilogue(bool use_pop) {
191 leave();
192 ret();
193 }
194
195 #define __ _sasm->
196
197 StubFrame::StubFrame(StubAssembler* sasm, const char* name, bool must_gc_arguments, return_state_t return_state) {
198 _sasm = sasm;
199 _return_state = return_state;
200 __ prologue(name, must_gc_arguments);
201 }
202
203 // load parameters that were stored with LIR_Assembler::store_parameter
204 // Note: offsets for store_parameter and load_argument must match
205 void StubFrame::load_argument(int offset_in_words, Register reg) {
206 __ load_parameter(offset_in_words, reg);
207 }
208
209
210 StubFrame::~StubFrame() {
339 void Runtime1::initialize_pd() {
340 int i = 0;
341 int sp_offset = 0;
342 const int step = 2; // SP offsets are in halfwords
343
344 // all float registers are saved explicitly
345 for (i = 0; i < FrameMap::nof_fpu_regs; i++) {
346 fpu_reg_save_offsets[i] = sp_offset;
347 sp_offset += step;
348 }
349
350 // a slot reserved for stack 16-byte alignment, see MacroAssembler::push_reg
351 sp_offset += step;
352 // we save x5 ~ x31, except x0 ~ x4: loop starts from x5
353 for (i = 5; i < FrameMap::nof_cpu_regs; i++) {
354 cpu_reg_save_offsets[i] = sp_offset;
355 sp_offset += step;
356 }
357 }
358
359 uint Runtime1::runtime_blob_current_thread_offset(frame f) {
360 Unimplemented();
361 return 0;
362 }
363
364 // target: the entry point of the method that creates and posts the exception oop
365 // has_argument: true if the exception needs arguments (passed in t0 and t1)
366
367 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
368 // make a frame and preserve the caller's caller-save registers
369 OopMap* oop_map = save_live_registers(sasm);
370 assert_cond(oop_map != nullptr);
371 int call_offset = 0;
372 if (!has_argument) {
373 call_offset = __ call_RT(noreg, noreg, target);
374 } else {
375 __ mv(c_rarg1, t0);
376 __ mv(c_rarg2, t1);
377 call_offset = __ call_RT(noreg, noreg, target);
378 }
379 OopMapSet* oop_maps = new OopMapSet();
380 assert_cond(oop_maps != nullptr);
381 oop_maps->add_gc_map(call_offset, oop_map);
382
383 return oop_maps;
|