< prev index next >

src/hotspot/cpu/x86/c1_Runtime1_x86.cpp

Print this page
rev 50076 : Fold Partial GC into Traversal GC


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);


< prev index next >