4290 push(_gvn.transform(result_val)); |
4290 push(_gvn.transform(result_val)); |
4291 |
4291 |
4292 return true; |
4292 return true; |
4293 } |
4293 } |
4294 |
4294 |
4295 |
|
4296 // constants for computing the copy function |
|
4297 enum { |
|
4298 COPYFUNC_UNALIGNED = 0, |
|
4299 COPYFUNC_ALIGNED = 1, // src, dest aligned to HeapWordSize |
|
4300 COPYFUNC_CONJOINT = 0, |
|
4301 COPYFUNC_DISJOINT = 2 // src != dest, or transfer can descend |
|
4302 }; |
|
4303 |
|
4304 // Note: The condition "disjoint" applies also for overlapping copies |
|
4305 // where an descending copy is permitted (i.e., dest_offset <= src_offset). |
|
4306 static address |
|
4307 select_arraycopy_function(BasicType t, bool aligned, bool disjoint, const char* &name, bool dest_uninitialized) { |
|
4308 int selector = |
|
4309 (aligned ? COPYFUNC_ALIGNED : COPYFUNC_UNALIGNED) + |
|
4310 (disjoint ? COPYFUNC_DISJOINT : COPYFUNC_CONJOINT); |
|
4311 |
|
4312 #define RETURN_STUB(xxx_arraycopy) { \ |
|
4313 name = #xxx_arraycopy; \ |
|
4314 return StubRoutines::xxx_arraycopy(); } |
|
4315 |
|
4316 #define RETURN_STUB_PARM(xxx_arraycopy, parm) { \ |
|
4317 name = #xxx_arraycopy; \ |
|
4318 return StubRoutines::xxx_arraycopy(parm); } |
|
4319 |
|
4320 switch (t) { |
|
4321 case T_BYTE: |
|
4322 case T_BOOLEAN: |
|
4323 switch (selector) { |
|
4324 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jbyte_arraycopy); |
|
4325 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jbyte_arraycopy); |
|
4326 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jbyte_disjoint_arraycopy); |
|
4327 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jbyte_disjoint_arraycopy); |
|
4328 } |
|
4329 case T_CHAR: |
|
4330 case T_SHORT: |
|
4331 switch (selector) { |
|
4332 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jshort_arraycopy); |
|
4333 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jshort_arraycopy); |
|
4334 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jshort_disjoint_arraycopy); |
|
4335 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jshort_disjoint_arraycopy); |
|
4336 } |
|
4337 case T_INT: |
|
4338 case T_FLOAT: |
|
4339 switch (selector) { |
|
4340 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jint_arraycopy); |
|
4341 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jint_arraycopy); |
|
4342 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jint_disjoint_arraycopy); |
|
4343 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jint_disjoint_arraycopy); |
|
4344 } |
|
4345 case T_DOUBLE: |
|
4346 case T_LONG: |
|
4347 switch (selector) { |
|
4348 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jlong_arraycopy); |
|
4349 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jlong_arraycopy); |
|
4350 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB(jlong_disjoint_arraycopy); |
|
4351 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB(arrayof_jlong_disjoint_arraycopy); |
|
4352 } |
|
4353 case T_ARRAY: |
|
4354 case T_OBJECT: |
|
4355 switch (selector) { |
|
4356 case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED: RETURN_STUB_PARM(oop_arraycopy, dest_uninitialized); |
|
4357 case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED: RETURN_STUB_PARM(arrayof_oop_arraycopy, dest_uninitialized); |
|
4358 case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED: RETURN_STUB_PARM(oop_disjoint_arraycopy, dest_uninitialized); |
|
4359 case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED: RETURN_STUB_PARM(arrayof_oop_disjoint_arraycopy, dest_uninitialized); |
|
4360 } |
|
4361 default: |
|
4362 ShouldNotReachHere(); |
|
4363 return NULL; |
|
4364 } |
|
4365 |
|
4366 #undef RETURN_STUB |
|
4367 #undef RETURN_STUB_PARM |
|
4368 } |
|
4369 |
|
4370 //------------------------------basictype2arraycopy---------------------------- |
4295 //------------------------------basictype2arraycopy---------------------------- |
4371 address LibraryCallKit::basictype2arraycopy(BasicType t, |
4296 address LibraryCallKit::basictype2arraycopy(BasicType t, |
4372 Node* src_offset, |
4297 Node* src_offset, |
4373 Node* dest_offset, |
4298 Node* dest_offset, |
4374 bool disjoint_bases, |
4299 bool disjoint_bases, |
4397 } else if (src_offset == dest_offset && src_offset != NULL) { |
4322 } else if (src_offset == dest_offset && src_offset != NULL) { |
4398 // This can occur if the offsets are identical non-constants. |
4323 // This can occur if the offsets are identical non-constants. |
4399 disjoint = true; |
4324 disjoint = true; |
4400 } |
4325 } |
4401 |
4326 |
4402 return select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized); |
4327 return StubRoutines::select_arraycopy_function(t, aligned, disjoint, name, dest_uninitialized); |
4403 } |
4328 } |
4404 |
4329 |
4405 |
4330 |
4406 //------------------------------inline_arraycopy----------------------- |
4331 //------------------------------inline_arraycopy----------------------- |
4407 bool LibraryCallKit::inline_arraycopy() { |
4332 bool LibraryCallKit::inline_arraycopy() { |