comparison src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @ 342:37f87013dfd8

6711316: Open source the Garbage-First garbage collector Summary: First mercurial integration of the code for the Garbage-First garbage collector. Reviewed-by: apetrusenko, iveresov, jmasa, sgoldman, tonyp, ysr
author ysr
date Thu, 05 Jun 2008 15:57:56 -0700
parents d5fc211aea19
children 1ee8caae33af
comparison
equal deleted inserted replaced
189:0b27f3512f9e 342:37f87013dfd8
292 CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info); 292 CodeEmitInfo* store_check_info = new CodeEmitInfo(range_check_info);
293 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info); 293 __ store_check(value.result(), array.result(), tmp1, tmp2, tmp3, store_check_info);
294 } 294 }
295 295
296 if (obj_store) { 296 if (obj_store) {
297 // Needs GC write barriers.
298 pre_barrier(LIR_OprFact::address(array_addr), false, NULL);
297 __ move(value.result(), array_addr, null_check_info); 299 __ move(value.result(), array_addr, null_check_info);
298 // Seems to be a precise 300 // Seems to be a precise
299 post_barrier(LIR_OprFact::address(array_addr), value.result()); 301 post_barrier(LIR_OprFact::address(array_addr), value.result());
300 } else { 302 } else {
301 __ move(value.result(), array_addr, null_check_info); 303 __ move(value.result(), array_addr, null_check_info);
743 745
744 LIR_Opr addr = new_pointer_register(); 746 LIR_Opr addr = new_pointer_register();
745 __ move(obj.result(), addr); 747 __ move(obj.result(), addr);
746 __ add(addr, offset.result(), addr); 748 __ add(addr, offset.result(), addr);
747 749
748 750 if (type == objectType) { // Write-barrier needed for Object fields.
751 // Do the pre-write barrier, if any.
752 pre_barrier(addr, false, NULL);
753 }
749 754
750 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience 755 LIR_Opr ill = LIR_OprFact::illegalOpr; // for convenience
751 if (type == objectType) 756 if (type == objectType)
752 __ cas_obj(addr, cmp.result(), val.result(), ill, ill); 757 __ cas_obj(addr, cmp.result(), val.result(), ill, ill);
753 else if (type == intType) 758 else if (type == intType)
1248 __ move(tmp, addr); 1253 __ move(tmp, addr);
1249 } else { 1254 } else {
1250 LIR_Address* addr = new LIR_Address(src, offset, type); 1255 LIR_Address* addr = new LIR_Address(src, offset, type);
1251 bool is_obj = (type == T_ARRAY || type == T_OBJECT); 1256 bool is_obj = (type == T_ARRAY || type == T_OBJECT);
1252 if (is_obj) { 1257 if (is_obj) {
1258 // Do the pre-write barrier, if any.
1259 pre_barrier(LIR_OprFact::address(addr), false, NULL);
1253 __ move(data, addr); 1260 __ move(data, addr);
1254 assert(src->is_register(), "must be register"); 1261 assert(src->is_register(), "must be register");
1255 // Seems to be a precise address 1262 // Seems to be a precise address
1256 post_barrier(LIR_OprFact::address(addr), data); 1263 post_barrier(LIR_OprFact::address(addr), data);
1257 } else { 1264 } else {