300 CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info); |
300 CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info); |
301 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info); |
301 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info); |
302 } |
302 } |
303 |
303 |
304 if (obj_store) { |
304 if (obj_store) { |
|
305 // Needs GC write barriers. |
|
306 pre_barrier(LIR_OprFact::address(array_addr), false, NULL); |
305 __ move(value.result(), array_addr, null_check_info); |
307 __ move(value.result(), array_addr, null_check_info); |
306 // Seems to be a precise |
308 // Seems to be a precise |
307 post_barrier(LIR_OprFact::address(array_addr), value.result()); |
309 post_barrier(LIR_OprFact::address(array_addr), value.result()); |
308 } else { |
310 } else { |
309 __ move(value.result(), array_addr, null_check_info); |
311 __ move(value.result(), array_addr, null_check_info); |
754 |
756 |
755 LIR_Opr addr = new_pointer_register(); |
757 LIR_Opr addr = new_pointer_register(); |
756 __ move(obj.result(), addr); |
758 __ move(obj.result(), addr); |
757 __ add(addr, offset.result(), addr); |
759 __ add(addr, offset.result(), addr); |
758 |
760 |
759 |
761 if (type == objectType) { // Write-barrier needed for Object fields. |
|
762 // Do the pre-write barrier, if any. |
|
763 pre_barrier(addr, false, NULL); |
|
764 } |
760 |
765 |
761 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience |
766 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience |
762 if (type == objectType) |
767 if (type == objectType) |
763 __ cas_obj(addr, cmp.result(), val.result(), ill, ill); |
768 __ cas_obj(addr, cmp.result(), val.result(), ill, ill); |
764 else if (type == intType) |
769 else if (type == intType) |
1284 __ move(tmp, addr); |
1289 __ move(tmp, addr); |
1285 } else { |
1290 } else { |
1286 LIR_Address* addr = new LIR_Address(src, offset, type); |
1291 LIR_Address* addr = new LIR_Address(src, offset, type); |
1287 bool is_obj = (type == T_ARRAY || type == T_OBJECT); |
1292 bool is_obj = (type == T_ARRAY || type == T_OBJECT); |
1288 if (is_obj) { |
1293 if (is_obj) { |
|
1294 // Do the pre-write barrier, if any. |
|
1295 pre_barrier(LIR_OprFact::address(addr), false, NULL); |
1289 __ move(data, addr); |
1296 __ move(data, addr); |
1290 assert(src->is_register(), "must be register"); |
1297 assert(src->is_register(), "must be register"); |
1291 // Seems to be a precise address |
1298 // Seems to be a precise address |
1292 post_barrier(LIR_OprFact::address(addr), data); |
1299 post_barrier(LIR_OprFact::address(addr), data); |
1293 } else { |
1300 } else { |