694 __ set_info("dtrace_object_alloc", dont_gc_arguments);
695 // // We can't gc here so skip the oopmap but make sure that all
696 // // the live registers get saved.
697 // save_live_registers(sasm);
698 //
699 // __ save_thread(L7_thread_cache);
700 // __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc),
701 // relocInfo::runtime_call_type);
702 // __ delayed()->mov(I0, O0);
703 // __ restore_thread(L7_thread_cache);
704 //
705 // restore_live_registers(sasm);
706 // __ ret();
707 // __ delayed()->restore();
708 }
709 break;
710
711 #if INCLUDE_ALL_GCS
712 case g1_pre_barrier_slow_id:
713 {
714 BarrierSet* bs = Universe::heap()->barrier_set();
715 if (bs->kind() != BarrierSet::G1BarrierSet) {
716 goto unimplemented_entry;
717 }
718
719 __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
720
721 // Using stack slots: pre_val (pre-pushed), spill tmp, spill tmp2.
722 const int stack_slots = 3;
723 Register pre_val = R0; // previous value of memory
724 Register tmp = R14;
725 Register tmp2 = R15;
726
727 Label refill, restart, marking_not_active;
728 int satb_q_active_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset());
729 int satb_q_index_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset());
730 int satb_q_buf_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
731
732 // Spill
733 __ std(tmp, -16, R1_SP);
734 __ std(tmp2, -24, R1_SP);
765 __ ld(tmp, -16, R1_SP);
766 __ blr();
767
768 __ bind(refill);
769 const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_slots) * BytesPerWord;
770 __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
771 __ mflr(R0);
772 __ std(R0, _abi(lr), R1_SP);
773 __ push_frame_reg_args(nbytes_save, R0); // dummy frame for C call
774 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SATBMarkQueueSet::handle_zero_index_for_thread), R16_thread);
775 __ pop_frame();
776 __ ld(R0, _abi(lr), R1_SP);
777 __ mtlr(R0);
778 __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
779 __ b(restart);
780 }
781 break;
782
783 case g1_post_barrier_slow_id:
784 {
785 BarrierSet* bs = Universe::heap()->barrier_set();
786 if (bs->kind() != BarrierSet::G1BarrierSet) {
787 goto unimplemented_entry;
788 }
789
790 __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
791
792 // Using stack slots: spill addr, spill tmp2
793 const int stack_slots = 2;
794 Register tmp = R0;
795 Register addr = R14;
796 Register tmp2 = R15;
797 jbyte* byte_map_base = ci_card_table_address();
798
799 Label restart, refill, ret;
800
801 // Spill
802 __ std(addr, -8, R1_SP);
803 __ std(tmp2, -16, R1_SP);
804
805 __ srdi(addr, R0, CardTable::card_shift); // Addr is passed in R0.
|
694 __ set_info("dtrace_object_alloc", dont_gc_arguments);
695 // // We can't gc here so skip the oopmap but make sure that all
696 // // the live registers get saved.
697 // save_live_registers(sasm);
698 //
699 // __ save_thread(L7_thread_cache);
700 // __ call(CAST_FROM_FN_PTR(address, SharedRuntime::dtrace_object_alloc),
701 // relocInfo::runtime_call_type);
702 // __ delayed()->mov(I0, O0);
703 // __ restore_thread(L7_thread_cache);
704 //
705 // restore_live_registers(sasm);
706 // __ ret();
707 // __ delayed()->restore();
708 }
709 break;
710
711 #if INCLUDE_ALL_GCS
712 case g1_pre_barrier_slow_id:
713 {
714 BarrierSet* bs = BarrierSet::barrier_set();
715 if (bs->kind() != BarrierSet::G1BarrierSet) {
716 goto unimplemented_entry;
717 }
718
719 __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
720
721 // Using stack slots: pre_val (pre-pushed), spill tmp, spill tmp2.
722 const int stack_slots = 3;
723 Register pre_val = R0; // previous value of memory
724 Register tmp = R14;
725 Register tmp2 = R15;
726
727 Label refill, restart, marking_not_active;
728 int satb_q_active_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset());
729 int satb_q_index_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset());
730 int satb_q_buf_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
731
732 // Spill
733 __ std(tmp, -16, R1_SP);
734 __ std(tmp2, -24, R1_SP);
765 __ ld(tmp, -16, R1_SP);
766 __ blr();
767
768 __ bind(refill);
769 const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_slots) * BytesPerWord;
770 __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
771 __ mflr(R0);
772 __ std(R0, _abi(lr), R1_SP);
773 __ push_frame_reg_args(nbytes_save, R0); // dummy frame for C call
774 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SATBMarkQueueSet::handle_zero_index_for_thread), R16_thread);
775 __ pop_frame();
776 __ ld(R0, _abi(lr), R1_SP);
777 __ mtlr(R0);
778 __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
779 __ b(restart);
780 }
781 break;
782
783 case g1_post_barrier_slow_id:
784 {
785 BarrierSet* bs = BarrierSet::barrier_set();
786 if (bs->kind() != BarrierSet::G1BarrierSet) {
787 goto unimplemented_entry;
788 }
789
790 __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
791
792 // Using stack slots: spill addr, spill tmp2
793 const int stack_slots = 2;
794 Register tmp = R0;
795 Register addr = R14;
796 Register tmp2 = R15;
797 jbyte* byte_map_base = ci_card_table_address();
798
799 Label restart, refill, ret;
800
801 // Spill
802 __ std(addr, -8, R1_SP);
803 __ std(tmp2, -16, R1_SP);
804
805 __ srdi(addr, R0, CardTable::card_shift); // Addr is passed in R0.
|