< prev index next >

src/share/vm/opto/arraycopynode.cpp

Print this page




 237       // We don't know if arguments are arrays
 238       return false;
 239     }
 240 
 241     BasicType src_elem  = ary_src->klass()->as_array_klass()->element_type()->basic_type();
 242     BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
 243     if (src_elem  == T_ARRAY)  src_elem  = T_OBJECT;
 244     if (dest_elem == T_ARRAY)  dest_elem = T_OBJECT;
 245 
 246     if (src_elem != dest_elem || dest_elem == T_VOID) {
 247       // We don't know if arguments are arrays of the same type
 248       return false;
 249     }
 250 
 251     if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() || !GraphKit::use_ReduceInitialCardMarks())) {
 252       // It's an object array copy but we can't emit the card marking
 253       // that is needed
 254       return false;
 255     }
 256 






 257     value_type = ary_src->elem();
 258 
 259     base_src = src;
 260     base_dest = dest;
 261 
 262     uint shift  = exact_log2(type2aelembytes(dest_elem));
 263     uint header = arrayOopDesc::base_offset_in_bytes(dest_elem);
 264 
 265     adr_src = src;
 266     adr_dest = dest;
 267 
 268     src_offset = Compile::conv_I2X_index(phase, src_offset, ary_src->size());
 269     dest_offset = Compile::conv_I2X_index(phase, dest_offset, ary_dest->size());
 270 
 271     Node* src_scale = phase->transform(new LShiftXNode(src_offset, phase->intcon(shift)));
 272     Node* dest_scale = phase->transform(new LShiftXNode(dest_offset, phase->intcon(shift)));
 273 
 274     adr_src = phase->transform(new AddPNode(base_src, adr_src, src_scale));
 275     adr_dest = phase->transform(new AddPNode(base_dest, adr_dest, dest_scale));
 276 




 237       // We don't know if arguments are arrays
 238       return false;
 239     }
 240 
 241     BasicType src_elem  = ary_src->klass()->as_array_klass()->element_type()->basic_type();
 242     BasicType dest_elem = ary_dest->klass()->as_array_klass()->element_type()->basic_type();
 243     if (src_elem  == T_ARRAY)  src_elem  = T_OBJECT;
 244     if (dest_elem == T_ARRAY)  dest_elem = T_OBJECT;
 245 
 246     if (src_elem != dest_elem || dest_elem == T_VOID) {
 247       // We don't know if arguments are arrays of the same type
 248       return false;
 249     }
 250 
 251     if (dest_elem == T_OBJECT && (!is_alloc_tightly_coupled() || !GraphKit::use_ReduceInitialCardMarks())) {
 252       // It's an object array copy but we can't emit the card marking
 253       // that is needed
 254       return false;
 255     }
 256 
 257     if (UseShenandoahGC && dest_elem == T_OBJECT) {
 258       // TODO: Disabled. We need to resolve the loaded values before storing them into
 259       // the copy object. Or call out to the clone barrier that takes care of it.
 260       return false;
 261     }
 262 
 263     value_type = ary_src->elem();
 264 
 265     base_src = src;
 266     base_dest = dest;
 267 
 268     uint shift  = exact_log2(type2aelembytes(dest_elem));
 269     uint header = arrayOopDesc::base_offset_in_bytes(dest_elem);
 270 
 271     adr_src = src;
 272     adr_dest = dest;
 273 
 274     src_offset = Compile::conv_I2X_index(phase, src_offset, ary_src->size());
 275     dest_offset = Compile::conv_I2X_index(phase, dest_offset, ary_dest->size());
 276 
 277     Node* src_scale = phase->transform(new LShiftXNode(src_offset, phase->intcon(shift)));
 278     Node* dest_scale = phase->transform(new LShiftXNode(dest_offset, phase->intcon(shift)));
 279 
 280     adr_src = phase->transform(new AddPNode(base_src, adr_src, src_scale));
 281     adr_dest = phase->transform(new AddPNode(base_dest, adr_dest, dest_scale));
 282 


< prev index next >