271
272 __ should_not_reach_here();
273 return oop_maps;
274 }
275
276 static OopMapSet* generate_exception_throw_with_stack_parms(StubAssembler* sasm, address target,
277 int stack_parms) {
278 // Make a frame and preserve the caller's caller-save registers.
279 const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
280 const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
281 OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
282
283 int call_offset = 0;
284 switch (stack_parms) {
285 case 3:
286 __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
287 case 2:
288 __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
289 case 1:
290 __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
291 call_offset = __ call_RT(noreg, noreg, target);
292 break;
293 default: Unimplemented(); break;
294 }
295 OopMapSet* oop_maps = new OopMapSet();
296 oop_maps->add_gc_map(call_offset, oop_map);
297
298 __ should_not_reach_here();
299 return oop_maps;
300 }
301
302
303 OopMapSet* Runtime1::generate_stub_call(StubAssembler* sasm, Register result, address target,
304 Register arg1, Register arg2, Register arg3) {
305 // Make a frame and preserve the caller's caller-save registers.
306 OopMap* oop_map = save_live_registers(sasm);
307
308 int call_offset;
309 if (arg1 == noreg) {
310 call_offset = __ call_RT(result, noreg, target);
321 restore_live_registers(sasm, result, noreg);
322 __ blr();
323 return oop_maps;
324 }
325
326 static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register result, address target,
327 int stack_parms, bool do_return = true) {
328 // Make a frame and preserve the caller's caller-save registers.
329 const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
330 const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
331 OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
332
333 int call_offset = 0;
334 switch (stack_parms) {
335 case 3:
336 __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
337 case 2:
338 __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
339 case 1:
340 __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
341 call_offset = __ call_RT(result, noreg, target);
342 break;
343 default: Unimplemented(); break;
344 }
345 OopMapSet* oop_maps = new OopMapSet();
346 oop_maps->add_gc_map(call_offset, oop_map);
347
348 restore_live_registers(sasm, result, noreg);
349 if (do_return) __ blr();
350 return oop_maps;
351 }
352
353
354 OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
355 // Make a frame and preserve the caller's caller-save registers.
356 OopMap* oop_map = save_live_registers(sasm);
357
358 // Call the runtime patching routine, returns non-zero if nmethod got deopted.
359 int call_offset = __ call_RT(noreg, noreg, target);
360 OopMapSet* oop_maps = new OopMapSet();
|
271
272 __ should_not_reach_here();
273 return oop_maps;
274 }
275
276 static OopMapSet* generate_exception_throw_with_stack_parms(StubAssembler* sasm, address target,
277 int stack_parms) {
278 // Make a frame and preserve the caller's caller-save registers.
279 const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
280 const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
281 OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
282
283 int call_offset = 0;
284 switch (stack_parms) {
285 case 3:
286 __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
287 case 2:
288 __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
289 case 1:
290 __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
291 case 0:
292 call_offset = __ call_RT(noreg, noreg, target);
293 break;
294 default: Unimplemented(); break;
295 }
296 OopMapSet* oop_maps = new OopMapSet();
297 oop_maps->add_gc_map(call_offset, oop_map);
298
299 __ should_not_reach_here();
300 return oop_maps;
301 }
302
303
304 OopMapSet* Runtime1::generate_stub_call(StubAssembler* sasm, Register result, address target,
305 Register arg1, Register arg2, Register arg3) {
306 // Make a frame and preserve the caller's caller-save registers.
307 OopMap* oop_map = save_live_registers(sasm);
308
309 int call_offset;
310 if (arg1 == noreg) {
311 call_offset = __ call_RT(result, noreg, target);
322 restore_live_registers(sasm, result, noreg);
323 __ blr();
324 return oop_maps;
325 }
326
327 static OopMapSet* stub_call_with_stack_parms(StubAssembler* sasm, Register result, address target,
328 int stack_parms, bool do_return = true) {
329 // Make a frame and preserve the caller's caller-save registers.
330 const int parm_size_in_bytes = align_up(stack_parms << LogBytesPerWord, frame::alignment_in_bytes);
331 const int padding = parm_size_in_bytes - (stack_parms << LogBytesPerWord);
332 OopMap* oop_map = save_live_registers(sasm, true, noreg, parm_size_in_bytes);
333
334 int call_offset = 0;
335 switch (stack_parms) {
336 case 3:
337 __ ld(R6_ARG4, frame_size_in_bytes + padding + 16, R1_SP);
338 case 2:
339 __ ld(R5_ARG3, frame_size_in_bytes + padding + 8, R1_SP);
340 case 1:
341 __ ld(R4_ARG2, frame_size_in_bytes + padding + 0, R1_SP);
342 case 0:
343 call_offset = __ call_RT(result, noreg, target);
344 break;
345 default: Unimplemented(); break;
346 }
347 OopMapSet* oop_maps = new OopMapSet();
348 oop_maps->add_gc_map(call_offset, oop_map);
349
350 restore_live_registers(sasm, result, noreg);
351 if (do_return) __ blr();
352 return oop_maps;
353 }
354
355
356 OopMapSet* Runtime1::generate_patching(StubAssembler* sasm, address target) {
357 // Make a frame and preserve the caller's caller-save registers.
358 OopMap* oop_map = save_live_registers(sasm);
359
360 // Call the runtime patching routine, returns non-zero if nmethod got deopted.
361 int call_offset = __ call_RT(noreg, noreg, target);
362 OopMapSet* oop_maps = new OopMapSet();
|