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
|