src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

changeset 2781
e1162778c1c8
parent 2489
f966c66b5463
child 3153
5cceda753a4a
equal deleted inserted replaced
2780:e6beb62de02d 2781:e1162778c1c8
324 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info); 324 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info);
325 } 325 }
326 326
327 if (obj_store) { 327 if (obj_store) {
328 // Needs GC write barriers. 328 // Needs GC write barriers.
329 pre_barrier(LIR_OprFact::address(array_addr), false, NULL); 329 pre_barrier(LIR_OprFact::address(array_addr), LIR_OprFact::illegalOpr /* pre_val */,
330 true /* do_load */, false /* patch */, NULL);
330 __ move(value.result(), array_addr, null_check_info); 331 __ move(value.result(), array_addr, null_check_info);
331 // Seems to be a precise 332 // Seems to be a precise
332 post_barrier(LIR_OprFact::address(array_addr), value.result()); 333 post_barrier(LIR_OprFact::address(array_addr), value.result());
333 } else { 334 } else {
334 __ move(value.result(), array_addr, null_check_info); 335 __ move(value.result(), array_addr, null_check_info);
792 } 793 }
793 __ leal(LIR_OprFact::address(a), addr); 794 __ leal(LIR_OprFact::address(a), addr);
794 795
795 if (type == objectType) { // Write-barrier needed for Object fields. 796 if (type == objectType) { // Write-barrier needed for Object fields.
796 // Do the pre-write barrier, if any. 797 // Do the pre-write barrier, if any.
797 pre_barrier(addr, false, NULL); 798 pre_barrier(addr, LIR_OprFact::illegalOpr /* pre_val */,
799 true /* do_load */, false /* patch */, NULL);
798 } 800 }
799 801
800 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience 802 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience
801 if (type == objectType) 803 if (type == objectType)
802 __ cas_obj(addr, cmp.result(), val.result(), ill, ill); 804 __ cas_obj(addr, cmp.result(), val.result(), ill, ill);
1337 } else { 1339 } else {
1338 LIR_Address* addr = new LIR_Address(src, offset, type); 1340 LIR_Address* addr = new LIR_Address(src, offset, type);
1339 bool is_obj = (type == T_ARRAY || type == T_OBJECT); 1341 bool is_obj = (type == T_ARRAY || type == T_OBJECT);
1340 if (is_obj) { 1342 if (is_obj) {
1341 // Do the pre-write barrier, if any. 1343 // Do the pre-write barrier, if any.
1342 pre_barrier(LIR_OprFact::address(addr), false, NULL); 1344 pre_barrier(LIR_OprFact::address(addr), LIR_OprFact::illegalOpr /* pre_val */,
1345 true /* do_load */, false /* patch */, NULL);
1343 __ move(data, addr); 1346 __ move(data, addr);
1344 assert(src->is_register(), "must be register"); 1347 assert(src->is_register(), "must be register");
1345 // Seems to be a precise address 1348 // Seems to be a precise address
1346 post_barrier(LIR_OprFact::address(addr), data); 1349 post_barrier(LIR_OprFact::address(addr), data);
1347 } else { 1350 } else {

mercurial