< prev index next >

src/cpu/x86/vm/templateTable_x86.cpp

Print this page
rev 13055 : Implement barriers for maintaining connection matrix.


 165           }
 166         } else {
 167           __ lea(rdx, obj);
 168         }
 169 
 170         Register rtmp    = LP64_ONLY(r8)         NOT_LP64(rsi);
 171         Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
 172 
 173         NOT_LP64(__ get_thread(rcx));
 174         NOT_LP64(__ save_bcp());
 175 
 176         __ g1_write_barrier_pre(rdx /* obj */,
 177                                 rbx /* pre_val */,
 178                                 rthread /* thread */,
 179                                 rtmp  /* tmp */,
 180                                 val != noreg /* tosca_live */,
 181                                 false /* expand_call */);
 182         if (val == noreg) {
 183           __ store_heap_oop_null(Address(rdx, 0));
 184         } else {



 185           // G1 barrier needs uncompressed oop for region cross check.
 186           Register new_val = val;
 187           if (UseCompressedOops) {
 188             new_val = rbx;
 189             __ movptr(new_val, val);
 190           }
 191           // For Shenandoah, make sure we only store refs into to-space.
 192           oopDesc::bs()->interpreter_read_barrier(_masm, val);
 193 
 194           __ store_heap_oop(Address(rdx, 0), val);

 195           __ g1_write_barrier_post(rdx /* store_adr */,
 196                                    new_val /* new_val */,
 197                                    rthread /* thread */,
 198                                    rtmp /* tmp */,
 199                                    rbx /* tmp2 */);








 200         }
 201         NOT_LP64( __ restore_bcp());
 202       }
 203       break;
 204 #endif // INCLUDE_ALL_GCS
 205     case BarrierSet::CardTableForRS:
 206     case BarrierSet::CardTableExtension:
 207       {
 208         if (val == noreg) {
 209           __ store_heap_oop_null(obj);
 210         } else {
 211           __ store_heap_oop(obj, val);
 212           // flatten object address if needed
 213           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 214             __ store_check(obj.base());
 215           } else {
 216             __ lea(rdx, obj);
 217             __ store_check(rdx);
 218           }
 219         }




 165           }
 166         } else {
 167           __ lea(rdx, obj);
 168         }
 169 
 170         Register rtmp    = LP64_ONLY(r8)         NOT_LP64(rsi);
 171         Register rthread = LP64_ONLY(r15_thread) NOT_LP64(rcx);
 172 
 173         NOT_LP64(__ get_thread(rcx));
 174         NOT_LP64(__ save_bcp());
 175 
 176         __ g1_write_barrier_pre(rdx /* obj */,
 177                                 rbx /* pre_val */,
 178                                 rthread /* thread */,
 179                                 rtmp  /* tmp */,
 180                                 val != noreg /* tosca_live */,
 181                                 false /* expand_call */);
 182         if (val == noreg) {
 183           __ store_heap_oop_null(Address(rdx, 0));
 184         } else {
 185           // For Shenandoah, make sure we only store refs into to-space.
 186           oopDesc::bs()->interpreter_read_barrier(_masm, val);
 187 
 188           // G1 barrier needs uncompressed oop for region cross check.
 189           Register new_val = val;
 190           if (UseCompressedOops) {
 191             new_val = rbx;
 192             __ movptr(new_val, val);
 193           }


 194 
 195           __ store_heap_oop(Address(rdx, 0), val);
 196           if (UseG1GC) {
 197             __ g1_write_barrier_post(rdx /* store_adr */,
 198                                      new_val /* new_val */,
 199                                      rthread /* thread */,
 200                                      rtmp /* tmp */,
 201                                      rbx /* tmp2 */);
 202           } else {
 203             assert(UseShenandoahGC, "sanity");
 204             __ shenandoah_write_barrier_post(rdx /* store_adr */,
 205                                              new_val /* new_val */,
 206                                              rthread /* thread */,
 207                                              rtmp /* tmp */,
 208                                              rbx /* tmp2 */);
 209           }
 210         }
 211         NOT_LP64( __ restore_bcp());
 212       }
 213       break;
 214 #endif // INCLUDE_ALL_GCS
 215     case BarrierSet::CardTableForRS:
 216     case BarrierSet::CardTableExtension:
 217       {
 218         if (val == noreg) {
 219           __ store_heap_oop_null(obj);
 220         } else {
 221           __ store_heap_oop(obj, val);
 222           // flatten object address if needed
 223           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 224             __ store_check(obj.base());
 225           } else {
 226             __ lea(rdx, obj);
 227             __ store_check(rdx);
 228           }
 229         }


< prev index next >