594 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
595 bool save_fpu_registers = true) {
596 __ save_live_registers_no_oop_map(save_fpu_registers);
597 return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
598 }
599
600 static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
601 __ restore_live_registers(restore_fpu_registers);
602 }
603
604 static void restore_live_registers_except_rax(StubAssembler* sasm, bool restore_fpu_registers = true) {
605 sasm->restore_live_registers_except_rax(restore_fpu_registers);
606 }
607
608
609 void Runtime1::initialize_pd() {
610 // nothing to do
611 }
612
613
614 // target: the entry point of the method that creates and posts the exception oop
615 // has_argument: true if the exception needs an argument (passed on stack because registers must be preserved)
616
617 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
618 // preserve all registers
619 int num_rt_args = has_argument ? 2 : 1;
620 OopMap* oop_map = save_live_registers(sasm, num_rt_args);
621
622 // now all registers are saved and can be used freely
623 // verify that no old value is used accidentally
624 __ invalidate_registers(true, true, true, true, true, true);
625
626 // registers used by this stub
627 const Register temp_reg = rbx;
628
629 // load argument for exception that is passed as an argument into the stub
630 if (has_argument) {
631 #ifdef _LP64
632 __ movptr(c_rarg1, Address(rbp, 2*BytesPerWord));
633 #else
634 __ movptr(temp_reg, Address(rbp, 2*BytesPerWord));
635 __ push(temp_reg);
636 #endif // _LP64
637 }
638 int call_offset = __ call_RT(noreg, noreg, target, num_rt_args - 1);
639
640 OopMapSet* oop_maps = new OopMapSet();
641 oop_maps->add_gc_map(call_offset, oop_map);
642
643 __ stop("should not reach here");
644
645 return oop_maps;
646 }
647
648
649 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
650 __ block_comment("generate_handle_exception");
651
652 // incoming parameters
653 const Register exception_oop = rax;
|
594 static OopMap* save_live_registers(StubAssembler* sasm, int num_rt_args,
595 bool save_fpu_registers = true) {
596 __ save_live_registers_no_oop_map(save_fpu_registers);
597 return generate_oop_map(sasm, num_rt_args, save_fpu_registers);
598 }
599
600 static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registers = true) {
601 __ restore_live_registers(restore_fpu_registers);
602 }
603
604 static void restore_live_registers_except_rax(StubAssembler* sasm, bool restore_fpu_registers = true) {
605 sasm->restore_live_registers_except_rax(restore_fpu_registers);
606 }
607
608
609 void Runtime1::initialize_pd() {
610 // nothing to do
611 }
612
613
614 // Target: the entry point of the method that creates and posts the exception oop.
615 // has_argument: true if the exception needs arguments (passed on the stack because
616 // registers must be preserved).
617 OopMapSet* Runtime1::generate_exception_throw(StubAssembler* sasm, address target, bool has_argument) {
618 // Preserve all registers.
619 int num_rt_args = has_argument ? (2 + 1) : 1;
620 OopMap* oop_map = save_live_registers(sasm, num_rt_args);
621
622 // Now all registers are saved and can be used freely.
623 // Verify that no old value is used accidentally.
624 __ invalidate_registers(true, true, true, true, true, true);
625
626 // Registers used by this stub.
627 const Register temp_reg = rbx;
628
629 // Load arguments for exception that are passed as arguments into the stub.
630 if (has_argument) {
631 #ifdef _LP64
632 __ movptr(c_rarg1, Address(rbp, 2*BytesPerWord));
633 __ movptr(c_rarg2, Address(rbp, 3*BytesPerWord));
634 #else
635 __ movptr(temp_reg, Address(rbp, 3*BytesPerWord));
636 __ push(temp_reg);
637 __ movptr(temp_reg, Address(rbp, 2*BytesPerWord));
638 __ push(temp_reg);
639 #endif // _LP64
640 }
641 int call_offset = __ call_RT(noreg, noreg, target, num_rt_args - 1);
642
643 OopMapSet* oop_maps = new OopMapSet();
644 oop_maps->add_gc_map(call_offset, oop_map);
645
646 __ stop("should not reach here");
647
648 return oop_maps;
649 }
650
651
652 OopMapSet* Runtime1::generate_handle_exception(StubID id, StubAssembler *sasm) {
653 __ block_comment("generate_handle_exception");
654
655 // incoming parameters
656 const Register exception_oop = rax;
|