< prev index next >

src/hotspot/cpu/arm/templateTable_arm.cpp

Print this page




 211         } else if (obj.disp() != 0) {
 212           __ add(store_addr, obj.base(), obj.disp());
 213         }
 214 
 215         __ g1_write_barrier_pre(store_addr, new_val, tmp1, tmp2, tmp3);
 216         if (is_null) {
 217           __ store_heap_oop_null(new_val, Address(store_addr));
 218         } else {
 219           // G1 barrier needs uncompressed oop for region cross check.
 220           Register val_to_store = new_val;
 221           if (UseCompressedOops) {
 222             val_to_store = tmp1;
 223             __ mov(val_to_store, new_val);
 224           }
 225           __ store_heap_oop(val_to_store, Address(store_addr)); // blows val_to_store:
 226           val_to_store = noreg;
 227           __ g1_write_barrier_post(store_addr, new_val, tmp1, tmp2, tmp3);
 228         }
 229       }
 230       break;










 231 #endif // INCLUDE_ALL_GCS
 232     case BarrierSet::CardTableBarrierSet:
 233       {
 234         if (is_null) {
 235           __ store_heap_oop_null(new_val, obj);
 236         } else {
 237           assert (!precise || (obj.index() == noreg && obj.disp() == 0),
 238                   "store check address should be calculated beforehand");
 239 
 240           __ store_check_part1(tmp1);
 241           __ store_heap_oop(new_val, obj); // blows new_val:
 242           new_val = noreg;
 243           __ store_check_part2(obj.base(), tmp1, tmp2);
 244         }
 245       }
 246       break;
 247     case BarrierSet::ModRef:
 248       ShouldNotReachHere();
 249       break;
 250     default:




 211         } else if (obj.disp() != 0) {
 212           __ add(store_addr, obj.base(), obj.disp());
 213         }
 214 
 215         __ g1_write_barrier_pre(store_addr, new_val, tmp1, tmp2, tmp3);
 216         if (is_null) {
 217           __ store_heap_oop_null(new_val, Address(store_addr));
 218         } else {
 219           // G1 barrier needs uncompressed oop for region cross check.
 220           Register val_to_store = new_val;
 221           if (UseCompressedOops) {
 222             val_to_store = tmp1;
 223             __ mov(val_to_store, new_val);
 224           }
 225           __ store_heap_oop(val_to_store, Address(store_addr)); // blows val_to_store:
 226           val_to_store = noreg;
 227           __ g1_write_barrier_post(store_addr, new_val, tmp1, tmp2, tmp3);
 228         }
 229       }
 230       break;
 231     case BarrierSet::Epsilon:
 232       {
 233         if (is_null) {
 234           __ store_heap_oop_null(new_val, obj);
 235         } else {
 236           __ store_heap_oop(new_val, obj); // blows new_val:
 237           new_val = noreg;
 238         }
 239       }
 240       break;
 241 #endif // INCLUDE_ALL_GCS
 242     case BarrierSet::CardTableBarrierSet:
 243       {
 244         if (is_null) {
 245           __ store_heap_oop_null(new_val, obj);
 246         } else {
 247           assert (!precise || (obj.index() == noreg && obj.disp() == 0),
 248                   "store check address should be calculated beforehand");
 249 
 250           __ store_check_part1(tmp1);
 251           __ store_heap_oop(new_val, obj); // blows new_val:
 252           new_val = noreg;
 253           __ store_check_part2(obj.base(), tmp1, tmp2);
 254         }
 255       }
 256       break;
 257     case BarrierSet::ModRef:
 258       ShouldNotReachHere();
 259       break;
 260     default:


< prev index next >