src/cpu/x86/vm/c1_LIRGenerator_x86.cpp

changeset 797
f8199438385b
parent 739
dc7f315e41f7
parent 791
1ee8caae33af
child 1040
98cb887364d3
equal deleted inserted replaced
751:5fa96a5a7e76 797:f8199438385b
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 {

mercurial