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