--- a/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Mon Aug 29 17:42:39 2011 -0700
+++ b/hotspot/src/cpu/sparc/vm/c1_Runtime1_sparc.cpp Wed Aug 31 10:16:02 2011 -0700
@@ -834,14 +834,16 @@
int satb_q_buf_byte_offset =
in_bytes(JavaThread::satb_mark_queue_offset() +
PtrQueue::byte_offset_of_buf());
+
__ bind(restart);
+ // Load the index into the SATB buffer. PtrQueue::_index is a
+ // size_t so ld_ptr is appropriate
__ ld_ptr(G2_thread, satb_q_index_byte_offset, tmp);
- __ br_on_reg_cond(Assembler::rc_z, /*annul*/false,
- Assembler::pn, tmp, refill);
+ // index == 0?
+ __ cmp_and_brx_short(tmp, G0, Assembler::equal, Assembler::pn, refill);
- // If the branch is taken, no harm in executing this in the delay slot.
- __ delayed()->ld_ptr(G2_thread, satb_q_buf_byte_offset, tmp2);
+ __ ld_ptr(G2_thread, satb_q_buf_byte_offset, tmp2);
__ sub(tmp, oopSize, tmp);
__ st_ptr(pre_val, tmp2, tmp); // [_buf + index] := <address_of_card>
@@ -901,11 +903,8 @@
__ set(rs, cardtable); // cardtable := <card table base>
__ ldub(addr, cardtable, tmp); // tmp := [addr + cardtable]
- __ br_on_reg_cond(Assembler::rc_nz, /*annul*/false, Assembler::pt,
- tmp, not_already_dirty);
- // Get cardtable + tmp into a reg by itself -- useful in the take-the-branch
- // case, harmless if not.
- __ delayed()->add(addr, cardtable, tmp2);
+ assert(CardTableModRefBS::dirty_card_val() == 0, "otherwise check this code");
+ __ cmp_and_br_short(tmp, G0, Assembler::notEqual, Assembler::pt, not_already_dirty);
// We didn't take the branch, so we're already dirty: return.
// Use return-from-leaf
@@ -914,6 +913,10 @@
// Not dirty.
__ bind(not_already_dirty);
+
+ // Get cardtable + tmp into a reg by itself
+ __ add(addr, cardtable, tmp2);
+
// First, dirty it.
__ stb(G0, tmp2, 0); // [cardPtr] := 0 (i.e., dirty).
@@ -929,13 +932,17 @@
int dirty_card_q_buf_byte_offset =
in_bytes(JavaThread::dirty_card_queue_offset() +
PtrQueue::byte_offset_of_buf());
+
__ bind(restart);
+
+ // Get the index into the update buffer. PtrQueue::_index is
+ // a size_t so ld_ptr is appropriate here.
__ ld_ptr(G2_thread, dirty_card_q_index_byte_offset, tmp3);
- __ br_on_reg_cond(Assembler::rc_z, /*annul*/false, Assembler::pn,
- tmp3, refill);
- // If the branch is taken, no harm in executing this in the delay slot.
- __ delayed()->ld_ptr(G2_thread, dirty_card_q_buf_byte_offset, tmp4);
+ // index == 0?
+ __ cmp_and_brx_short(tmp3, G0, Assembler::equal, Assembler::pn, refill);
+
+ __ ld_ptr(G2_thread, dirty_card_q_buf_byte_offset, tmp4);
__ sub(tmp3, oopSize, tmp3);
__ st_ptr(tmp2, tmp4, tmp3); // [_buf + index] := <address_of_card>