< prev index next >
src/hotspot/cpu/ppc/c1_Runtime1_ppc.cpp
BarrierSetC1
#include "runtime/signature.hpp"
#include "runtime/vframeArray.hpp"
#include "utilities/align.hpp"
#include "utilities/macros.hpp"
#include "vmreg_ppc.inline.hpp"
- #if INCLUDE_ALL_GCS
- #include "gc/g1/g1BarrierSet.hpp"
- #include "gc/g1/g1CardTable.hpp"
- #include "gc/g1/g1ThreadLocalData.hpp"
- #endif
// Implementation of StubAssembler
int StubAssembler::call_RT(Register oop_result1, Register metadata_result,
address entry_point, int number_of_arguments) {
***************
// __ ret();
// __ delayed()->restore();
}
break;
- #if INCLUDE_ALL_GCS
- case g1_pre_barrier_slow_id:
- {
- BarrierSet* bs = BarrierSet::barrier_set();
- if (bs->kind() != BarrierSet::G1BarrierSet) {
- goto unimplemented_entry;
- }
-
- __ set_info("g1_pre_barrier_slow_id", dont_gc_arguments);
-
- // Using stack slots: pre_val (pre-pushed), spill tmp, spill tmp2.
- const int stack_slots = 3;
- Register pre_val = R0; // previous value of memory
- Register tmp = R14;
- Register tmp2 = R15;
-
- Label refill, restart, marking_not_active;
- int satb_q_active_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_active_offset());
- int satb_q_index_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_index_offset());
- int satb_q_buf_byte_offset = in_bytes(G1ThreadLocalData::satb_mark_queue_buffer_offset());
-
- // Spill
- __ std(tmp, -16, R1_SP);
- __ std(tmp2, -24, R1_SP);
-
- // Is marking still active?
- if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
- __ lwz(tmp, satb_q_active_byte_offset, R16_thread);
- } else {
- assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
- __ lbz(tmp, satb_q_active_byte_offset, R16_thread);
- }
- __ cmpdi(CCR0, tmp, 0);
- __ beq(CCR0, marking_not_active);
-
- __ bind(restart);
- // Load the index into the SATB buffer. SATBMarkQueue::_index is a
- // size_t so ld_ptr is appropriate.
- __ ld(tmp, satb_q_index_byte_offset, R16_thread);
-
- // index == 0?
- __ cmpdi(CCR0, tmp, 0);
- __ beq(CCR0, refill);
-
- __ ld(tmp2, satb_q_buf_byte_offset, R16_thread);
- __ ld(pre_val, -8, R1_SP); // Load from stack.
- __ addi(tmp, tmp, -oopSize);
-
- __ std(tmp, satb_q_index_byte_offset, R16_thread);
- __ stdx(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card>
-
- __ bind(marking_not_active);
- // Restore temp registers and return-from-leaf.
- __ ld(tmp2, -24, R1_SP);
- __ ld(tmp, -16, R1_SP);
- __ blr();
-
- __ bind(refill);
- const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_slots) * BytesPerWord;
- __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
- __ mflr(R0);
- __ std(R0, _abi(lr), R1_SP);
- __ push_frame_reg_args(nbytes_save, R0); // dummy frame for C call
- __ call_VM_leaf(CAST_FROM_FN_PTR(address, SATBMarkQueueSet::handle_zero_index_for_thread), R16_thread);
- __ pop_frame();
- __ ld(R0, _abi(lr), R1_SP);
- __ mtlr(R0);
- __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
- __ b(restart);
- }
- break;
-
- case g1_post_barrier_slow_id:
- {
- BarrierSet* bs = BarrierSet::barrier_set();
- if (bs->kind() != BarrierSet::G1BarrierSet) {
- goto unimplemented_entry;
- }
-
- __ set_info("g1_post_barrier_slow_id", dont_gc_arguments);
-
- // Using stack slots: spill addr, spill tmp2
- const int stack_slots = 2;
- Register tmp = R0;
- Register addr = R14;
- Register tmp2 = R15;
- jbyte* byte_map_base = ci_card_table_address();
-
- Label restart, refill, ret;
-
- // Spill
- __ std(addr, -8, R1_SP);
- __ std(tmp2, -16, R1_SP);
-
- __ srdi(addr, R0, CardTable::card_shift); // Addr is passed in R0.
- __ load_const_optimized(/*cardtable*/ tmp2, byte_map_base, tmp);
- __ add(addr, tmp2, addr);
- __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
-
- // Return if young card.
- __ cmpwi(CCR0, tmp, G1CardTable::g1_young_card_val());
- __ beq(CCR0, ret);
-
- // Return if sequential consistent value is already dirty.
- __ membar(Assembler::StoreLoad);
- __ lbz(tmp, 0, addr); // tmp := [addr + cardtable]
-
- __ cmpwi(CCR0, tmp, G1CardTable::dirty_card_val());
- __ beq(CCR0, ret);
-
- // Not dirty.
-
- // First, dirty it.
- __ li(tmp, G1CardTable::dirty_card_val());
- __ stb(tmp, 0, addr);
-
- int dirty_card_q_index_byte_offset = in_bytes(G1ThreadLocalData::dirty_card_queue_index_offset());
- int dirty_card_q_buf_byte_offset = in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset());
-
- __ bind(restart);
-
- // Get the index into the update buffer. DirtyCardQueue::_index is
- // a size_t so ld_ptr is appropriate here.
- __ ld(tmp2, dirty_card_q_index_byte_offset, R16_thread);
-
- // index == 0?
- __ cmpdi(CCR0, tmp2, 0);
- __ beq(CCR0, refill);
-
- __ ld(tmp, dirty_card_q_buf_byte_offset, R16_thread);
- __ addi(tmp2, tmp2, -oopSize);
-
- __ std(tmp2, dirty_card_q_index_byte_offset, R16_thread);
- __ add(tmp2, tmp, tmp2);
- __ std(addr, 0, tmp2); // [_buf + index] := <address_of_card>
-
- // Restore temp registers and return-from-leaf.
- __ bind(ret);
- __ ld(tmp2, -16, R1_SP);
- __ ld(addr, -8, R1_SP);
- __ blr();
-
- __ bind(refill);
- const int nbytes_save = (MacroAssembler::num_volatile_regs + stack_slots) * BytesPerWord;
- __ save_volatile_gprs(R1_SP, -nbytes_save); // except R0
- __ mflr(R0);
- __ std(R0, _abi(lr), R1_SP);
- __ push_frame_reg_args(nbytes_save, R0); // dummy frame for C call
- __ call_VM_leaf(CAST_FROM_FN_PTR(address, DirtyCardQueueSet::handle_zero_index_for_thread), R16_thread);
- __ pop_frame();
- __ ld(R0, _abi(lr), R1_SP);
- __ mtlr(R0);
- __ restore_volatile_gprs(R1_SP, -nbytes_save); // except R0
- __ b(restart);
- }
- break;
- #endif // INCLUDE_ALL_GCS
-
case predicate_failed_trap_id:
{
__ set_info("predicate_failed_trap", dont_gc_arguments);
OopMap* oop_map = save_live_registers(sasm);
***************
__ bctr();
}
break;
default:
- unimplemented_entry:
{
__ set_info("unimplemented entry", dont_gc_arguments);
__ mflr(R0);
__ std(R0, _abi(lr), R1_SP);
__ push_frame(frame::abi_reg_args_size, R0); // empty dummy frame
< prev index next >