349
350 static void restore_live_registers_without_return(StubAssembler* sasm, bool restore_fpu_registers = HaveVFP) {
351 restore_live_registers(sasm, true, true, false, restore_fpu_registers);
352 }
353
354 void StubAssembler::save_live_registers() {
355 ::save_live_registers(this);
356 }
357
358 void StubAssembler::restore_live_registers_without_return() {
359 ::restore_live_registers_without_return(this);
360 }
361
362 void Runtime1::initialize_pd() {
363 }
364
365
366 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
367 OopMap* oop_map = save_live_registers(sasm);
368
369 if (has_argument) {
370 __ ldr(R1, Address(SP, arg1_offset));
371 }
372
373 int call_offset = __ call_RT(noreg, noreg, target);
374 OopMapSet* oop_maps = new OopMapSet();
375 oop_maps->add_gc_map(call_offset, oop_map);
376
377 DEBUG_ONLY(STOP("generate_exception_throw");) // Should not reach here
378 return oop_maps;
379 }
380
381
382 static void restore_sp_for_method_handle(StubAssembler* sasm) {
383 // Restore SP from its saved reg (FP) if the exception PC is a MethodHandle call site.
384 __ ldr_s32(Rtemp, Address(Rthread, JavaThread::is_method_handle_return_offset()));
385 #ifdef AARCH64
386 Label skip;
387 __ cbz(Rtemp, skip);
388 __ mov(SP, Rmh_SP_save);
389 __ bind(skip);
390 #else
391 __ cmp(Rtemp, 0);
392 __ mov(SP, Rmh_SP_save, ne);
393 #endif // AARCH64
|
349
350 static void restore_live_registers_without_return(StubAssembler* sasm, bool restore_fpu_registers = HaveVFP) {
351 restore_live_registers(sasm, true, true, false, restore_fpu_registers);
352 }
353
354 void StubAssembler::save_live_registers() {
355 ::save_live_registers(this);
356 }
357
358 void StubAssembler::restore_live_registers_without_return() {
359 ::restore_live_registers_without_return(this);
360 }
361
362 void Runtime1::initialize_pd() {
363 }
364
365
366 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
367 OopMap* oop_map = save_live_registers(sasm);
368
369 int call_offset;
370 if (has_argument) {
371 __ ldr(R1, Address(SP, arg1_offset));
372 __ ldr(R2, Address(SP, arg2_offset));
373 call_offset = __ call_RT(noreg, noreg, target, R1, R2);
374 } else {
375 call_offset = __ call_RT(noreg, noreg, target);
376 }
377
378 OopMapSet* oop_maps = new OopMapSet();
379 oop_maps->add_gc_map(call_offset, oop_map);
380
381 DEBUG_ONLY(STOP("generate_exception_throw");) // Should not reach here
382 return oop_maps;
383 }
384
385
386 static void restore_sp_for_method_handle(StubAssembler* sasm) {
387 // Restore SP from its saved reg (FP) if the exception PC is a MethodHandle call site.
388 __ ldr_s32(Rtemp, Address(Rthread, JavaThread::is_method_handle_return_offset()));
389 #ifdef AARCH64
390 Label skip;
391 __ cbz(Rtemp, skip);
392 __ mov(SP, Rmh_SP_save);
393 __ bind(skip);
394 #else
395 __ cmp(Rtemp, 0);
396 __ mov(SP, Rmh_SP_save, ne);
397 #endif // AARCH64
|