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: |