hotspot/src/share/vm/c1/c1_Runtime1.cpp
changeset 13952 e3cf184080bc
parent 13728 882756847a04
child 14488 ab48109f7d1b
equal deleted inserted replaced
13918:b01a48301e67 13952:e3cf184080bc
   325   NOT_PRODUCT(_new_type_array_slowcase_cnt++;)
   325   NOT_PRODUCT(_new_type_array_slowcase_cnt++;)
   326   // Note: no handle for klass needed since they are not used
   326   // Note: no handle for klass needed since they are not used
   327   //       anymore after new_typeArray() and no GC can happen before.
   327   //       anymore after new_typeArray() and no GC can happen before.
   328   //       (This may have to change if this code changes!)
   328   //       (This may have to change if this code changes!)
   329   assert(klass->is_klass(), "not a class");
   329   assert(klass->is_klass(), "not a class");
   330   BasicType elt_type = typeArrayKlass::cast(klass)->element_type();
   330   BasicType elt_type = TypeArrayKlass::cast(klass)->element_type();
   331   oop obj = oopFactory::new_typeArray(elt_type, length, CHECK);
   331   oop obj = oopFactory::new_typeArray(elt_type, length, CHECK);
   332   thread->set_vm_result(obj);
   332   thread->set_vm_result(obj);
   333   // This is pretty rare but this runtime patch is stressful to deoptimization
   333   // This is pretty rare but this runtime patch is stressful to deoptimization
   334   // if we deoptimize here so force a deopt to stress the path.
   334   // if we deoptimize here so force a deopt to stress the path.
   335   if (DeoptimizeALot) {
   335   if (DeoptimizeALot) {
   344 
   344 
   345   // Note: no handle for klass needed since they are not used
   345   // Note: no handle for klass needed since they are not used
   346   //       anymore after new_objArray() and no GC can happen before.
   346   //       anymore after new_objArray() and no GC can happen before.
   347   //       (This may have to change if this code changes!)
   347   //       (This may have to change if this code changes!)
   348   assert(array_klass->is_klass(), "not a class");
   348   assert(array_klass->is_klass(), "not a class");
   349   Klass* elem_klass = objArrayKlass::cast(array_klass)->element_klass();
   349   Klass* elem_klass = ObjArrayKlass::cast(array_klass)->element_klass();
   350   objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
   350   objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
   351   thread->set_vm_result(obj);
   351   thread->set_vm_result(obj);
   352   // This is pretty rare but this runtime patch is stressful to deoptimization
   352   // This is pretty rare but this runtime patch is stressful to deoptimization
   353   // if we deoptimize here so force a deopt to stress the path.
   353   // if we deoptimize here so force a deopt to stress the path.
   354   if (DeoptimizeALot) {
   354   if (DeoptimizeALot) {
   360 JRT_ENTRY(void, Runtime1::new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims))
   360 JRT_ENTRY(void, Runtime1::new_multi_array(JavaThread* thread, Klass* klass, int rank, jint* dims))
   361   NOT_PRODUCT(_new_multi_array_slowcase_cnt++;)
   361   NOT_PRODUCT(_new_multi_array_slowcase_cnt++;)
   362 
   362 
   363   assert(klass->is_klass(), "not a class");
   363   assert(klass->is_klass(), "not a class");
   364   assert(rank >= 1, "rank must be nonzero");
   364   assert(rank >= 1, "rank must be nonzero");
   365   oop obj = arrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
   365   oop obj = ArrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
   366   thread->set_vm_result(obj);
   366   thread->set_vm_result(obj);
   367 JRT_END
   367 JRT_END
   368 
   368 
   369 
   369 
   370 JRT_ENTRY(void, Runtime1::unimplemented_entry(JavaThread* thread, StubID id))
   370 JRT_ENTRY(void, Runtime1::unimplemented_entry(JavaThread* thread, StubID id))
  1232     bs->write_ref_array_pre(dst_addr, length);
  1232     bs->write_ref_array_pre(dst_addr, length);
  1233     Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
  1233     Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
  1234     bs->write_ref_array((HeapWord*)dst_addr, length);
  1234     bs->write_ref_array((HeapWord*)dst_addr, length);
  1235     return ac_ok;
  1235     return ac_ok;
  1236   } else {
  1236   } else {
  1237     Klass* bound = objArrayKlass::cast(dst->klass())->element_klass();
  1237     Klass* bound = ObjArrayKlass::cast(dst->klass())->element_klass();
  1238     Klass* stype = objArrayKlass::cast(src->klass())->element_klass();
  1238     Klass* stype = ObjArrayKlass::cast(src->klass())->element_klass();
  1239     if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
  1239     if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
  1240       // Elements are guaranteed to be subtypes, so no check necessary
  1240       // Elements are guaranteed to be subtypes, so no check necessary
  1241       bs->write_ref_array_pre(dst_addr, length);
  1241       bs->write_ref_array_pre(dst_addr, length);
  1242       Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
  1242       Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
  1243       bs->write_ref_array((HeapWord*)dst_addr, length);
  1243       bs->write_ref_array((HeapWord*)dst_addr, length);
  1261 
  1261 
  1262   if (length == 0) return ac_ok;
  1262   if (length == 0) return ac_ok;
  1263   if (src->is_typeArray()) {
  1263   if (src->is_typeArray()) {
  1264     Klass* const klass_oop = src->klass();
  1264     Klass* const klass_oop = src->klass();
  1265     if (klass_oop != dst->klass()) return ac_failed;
  1265     if (klass_oop != dst->klass()) return ac_failed;
  1266     typeArrayKlass* klass = typeArrayKlass::cast(klass_oop);
  1266     TypeArrayKlass* klass = TypeArrayKlass::cast(klass_oop);
  1267     const int l2es = klass->log2_element_size();
  1267     const int l2es = klass->log2_element_size();
  1268     const int ihs = klass->array_header_in_bytes() / wordSize;
  1268     const int ihs = klass->array_header_in_bytes() / wordSize;
  1269     char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es);
  1269     char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es);
  1270     char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es);
  1270     char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es);
  1271     // Potential problem: memmove is not guaranteed to be word atomic
  1271     // Potential problem: memmove is not guaranteed to be word atomic