1556 __ pop(rcx);
1557 __ pop(rsi);
1558 __ ret(0);
1559 }
1560 break;
1561
1562 #if INCLUDE_ALL_GCS
1563 case g1_pre_barrier_slow_id:
1564 {
1565 StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
1566 // arg0 : previous value of memory
1567
1568 BarrierSet* bs = BarrierSet::barrier_set();
1569 if (bs->kind() != BarrierSet::G1BarrierSet && bs->kind() != BarrierSet::Shenandoah) {
1570 __ movptr(rax, (int)id);
1571 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
1572 __ should_not_reach_here();
1573 break;
1574 }
1575
1576 if (bs->kind() == BarrierSet::Shenandoah && !(ShenandoahSATBBarrier || ShenandoahConditionalSATBBarrier || ShenandoahStoreValEnqueueBarrier)) {
1577 break;
1578 }
1579
1580 __ push(rax);
1581 __ push(rdx);
1582
1583 const Register pre_val = rax;
1584 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1585 const Register tmp = rdx;
1586
1587 NOT_LP64(__ get_thread(thread);)
1588
1589 Address queue_active(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_active_offset()
1590 : ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
1591 Address queue_index(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_index_offset()
1592 : ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
1593 Address buffer(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_buffer_offset()
1594 : ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
1595
1596 Label done;
1597 Label runtime;
1598
1599 if (UseShenandoahGC) {
1600 Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
1601 __ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::PARTIAL | ShenandoahHeap::TRAVERSAL);
1602 __ jcc(Assembler::zero, done);
1603 } else {
1604 assert(UseG1GC, "Should be");
1605 // Is marking still active?
1606 if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
1607 __ cmpl(queue_active, 0);
1608 } else {
1609 assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
1610 __ cmpb(queue_active, 0);
1611 }
1612 __ jcc(Assembler::equal, done);
1613 }
1614
1615 // Can we store original value in the thread's buffer?
1616
1617 __ movptr(tmp, queue_index);
1618 __ testptr(tmp, tmp);
1619 __ jcc(Assembler::zero, runtime);
1620 __ subptr(tmp, wordSize);
1621 __ movptr(queue_index, tmp);
|
1556 __ pop(rcx);
1557 __ pop(rsi);
1558 __ ret(0);
1559 }
1560 break;
1561
1562 #if INCLUDE_ALL_GCS
1563 case g1_pre_barrier_slow_id:
1564 {
1565 StubFrame f(sasm, "g1_pre_barrier", dont_gc_arguments);
1566 // arg0 : previous value of memory
1567
1568 BarrierSet* bs = BarrierSet::barrier_set();
1569 if (bs->kind() != BarrierSet::G1BarrierSet && bs->kind() != BarrierSet::Shenandoah) {
1570 __ movptr(rax, (int)id);
1571 __ call_RT(noreg, noreg, CAST_FROM_FN_PTR(address, unimplemented_entry), rax);
1572 __ should_not_reach_here();
1573 break;
1574 }
1575
1576 if (bs->kind() == BarrierSet::Shenandoah && !(ShenandoahSATBBarrier || ShenandoahStoreValEnqueueBarrier)) {
1577 break;
1578 }
1579
1580 __ push(rax);
1581 __ push(rdx);
1582
1583 const Register pre_val = rax;
1584 const Register thread = NOT_LP64(rax) LP64_ONLY(r15_thread);
1585 const Register tmp = rdx;
1586
1587 NOT_LP64(__ get_thread(thread);)
1588
1589 Address queue_active(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_active_offset()
1590 : ShenandoahThreadLocalData::satb_mark_queue_active_offset()));
1591 Address queue_index(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_index_offset()
1592 : ShenandoahThreadLocalData::satb_mark_queue_index_offset()));
1593 Address buffer(thread, in_bytes(UseG1GC ? G1ThreadLocalData::satb_mark_queue_buffer_offset()
1594 : ShenandoahThreadLocalData::satb_mark_queue_buffer_offset()));
1595
1596 Label done;
1597 Label runtime;
1598
1599 if (UseShenandoahGC) {
1600 Address gc_state(thread, in_bytes(ShenandoahThreadLocalData::gc_state_offset()));
1601 __ testb(gc_state, ShenandoahHeap::MARKING | ShenandoahHeap::TRAVERSAL);
1602 __ jcc(Assembler::zero, done);
1603 } else {
1604 assert(UseG1GC, "Should be");
1605 // Is marking still active?
1606 if (in_bytes(SATBMarkQueue::byte_width_of_active()) == 4) {
1607 __ cmpl(queue_active, 0);
1608 } else {
1609 assert(in_bytes(SATBMarkQueue::byte_width_of_active()) == 1, "Assumption");
1610 __ cmpb(queue_active, 0);
1611 }
1612 __ jcc(Assembler::equal, done);
1613 }
1614
1615 // Can we store original value in the thread's buffer?
1616
1617 __ movptr(tmp, queue_index);
1618 __ testptr(tmp, tmp);
1619 __ jcc(Assembler::zero, runtime);
1620 __ subptr(tmp, wordSize);
1621 __ movptr(queue_index, tmp);
|