< prev index next >

src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

Print this page

        

*** 41,50 **** --- 41,54 ---- #define __ gen()->lir(__FILE__, __LINE__)-> #else #define __ gen()->lir()-> #endif + #if INCLUDE_ALL_GCS + #include "gc_implementation/shenandoah/c1/shenandoahBarrierSetC1.hpp" + #endif + // Item will be loaded into a byte register; Intel only void LIRItem::load_byte_item() { load_item(); LIR_Opr res = result();
*** 784,795 **** pre_barrier(addr, LIR_OprFact::illegalOpr /* pre_val */, true /* do_load */, false /* patch */, NULL); } LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience ! if (type == objectType) __ cas_obj(addr, cmp.result(), val.result(), ill, ill); else if (type == intType) __ cas_int(addr, cmp.result(), val.result(), ill, ill); else if (type == longType) __ cas_long(addr, cmp.result(), val.result(), ill, ill); else { --- 788,810 ---- pre_barrier(addr, LIR_OprFact::illegalOpr /* pre_val */, true /* do_load */, false /* patch */, NULL); } LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience ! if (type == objectType) { ! #if INCLUDE_ALL_GCS ! if (UseShenandoahGC && ShenandoahCASBarrier) { ! LIR_Opr result = rlock_result(x); ! __ cas_obj(addr, cmp.result(), val.result(), new_register(T_OBJECT), new_register(T_OBJECT), result); ! // Shenandoah C1 barrier would do all result management itself, shortcut here. ! return; ! } else ! #endif ! { __ cas_obj(addr, cmp.result(), val.result(), ill, ill); + } + } else if (type == intType) __ cas_int(addr, cmp.result(), val.result(), ill, ill); else if (type == longType) __ cas_long(addr, cmp.result(), val.result(), ill, ill); else {
*** 1483,1492 **** --- 1498,1515 ---- // Do the pre-write barrier, if any. pre_barrier(LIR_OprFact::address(addr), LIR_OprFact::illegalOpr /* pre_val */, true /* do_load */, false /* patch */, NULL); } __ xchg(LIR_OprFact::address(addr), dst, dst, LIR_OprFact::illegalOpr); + + #if INCLUDE_ALL_GCS + if (UseShenandoahGC && is_obj) { + LIR_Opr tmp = ShenandoahBarrierSet::barrier_set()->bsc1()->load_reference_barrier(this, dst, LIR_OprFact::addressConst(0)); + __ move(tmp, dst); + } + #endif + if (is_obj) { // Seems to be a precise address post_barrier(LIR_OprFact::address(addr), data); } }
< prev index next >