hotspot/src/share/vm/opto/library_call.cpp
changeset 9102 4708a4aefb33
parent 9100 860ba6f8b53f
child 9182 ab3e9e0925ad
child 9327 23532ae85295
equal deleted inserted replaced
9101:ff58f9a8e31c 9102:4708a4aefb33
  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() {