src/share/vm/runtime/stubRoutines.cpp

changeset 2606
0ac769a57c64
parent 2314
f95d63e2154a
child 2728
13bc79b5c9c8
     1.1 --- a/src/share/vm/runtime/stubRoutines.cpp	Tue Mar 01 10:27:15 2011 -0800
     1.2 +++ b/src/share/vm/runtime/stubRoutines.cpp	Tue Mar 01 14:56:48 2011 -0800
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -80,30 +80,36 @@
    1.11  jint    StubRoutines::_fpu_subnormal_bias2[3]                   = { 0, 0, 0 };
    1.12  
    1.13  // Compiled code entry points default values
    1.14 -// The dafault functions don't have separate disjoint versions.
    1.15 +// The default functions don't have separate disjoint versions.
    1.16  address StubRoutines::_jbyte_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
    1.17  address StubRoutines::_jshort_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
    1.18  address StubRoutines::_jint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
    1.19  address StubRoutines::_jlong_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
    1.20  address StubRoutines::_oop_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
    1.21 +address StubRoutines::_oop_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
    1.22  address StubRoutines::_jbyte_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
    1.23  address StubRoutines::_jshort_disjoint_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
    1.24  address StubRoutines::_jint_disjoint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
    1.25  address StubRoutines::_jlong_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
    1.26  address StubRoutines::_oop_disjoint_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
    1.27 +address StubRoutines::_oop_disjoint_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
    1.28  
    1.29  address StubRoutines::_arrayof_jbyte_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
    1.30  address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
    1.31  address StubRoutines::_arrayof_jint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
    1.32  address StubRoutines::_arrayof_jlong_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
    1.33  address StubRoutines::_arrayof_oop_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
    1.34 +address StubRoutines::_arrayof_oop_arraycopy_uninit      = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
    1.35  address StubRoutines::_arrayof_jbyte_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
    1.36  address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
    1.37  address StubRoutines::_arrayof_jint_disjoint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
    1.38  address StubRoutines::_arrayof_jlong_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
    1.39 -address StubRoutines::_arrayof_oop_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
    1.40 +address StubRoutines::_arrayof_oop_disjoint_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
    1.41 +address StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
    1.42 +
    1.43  
    1.44  address StubRoutines::_checkcast_arraycopy               = NULL;
    1.45 +address StubRoutines::_checkcast_arraycopy_uninit        = NULL;
    1.46  address StubRoutines::_unsafe_arraycopy                  = NULL;
    1.47  address StubRoutines::_generic_arraycopy                 = NULL;
    1.48  
    1.49 @@ -282,12 +288,12 @@
    1.50  // Default versions of arraycopy functions
    1.51  //
    1.52  
    1.53 -static void gen_arraycopy_barrier_pre(oop* dest, size_t count) {
    1.54 +static void gen_arraycopy_barrier_pre(oop* dest, size_t count, bool dest_uninitialized) {
    1.55      assert(count != 0, "count should be non-zero");
    1.56      assert(count <= (size_t)max_intx, "count too large");
    1.57      BarrierSet* bs = Universe::heap()->barrier_set();
    1.58      assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt");
    1.59 -    bs->write_ref_array_pre(dest, (int)count);
    1.60 +    bs->write_ref_array_pre(dest, (int)count, dest_uninitialized);
    1.61  }
    1.62  
    1.63  static void gen_arraycopy_barrier(oop* dest, size_t count) {
    1.64 @@ -330,7 +336,17 @@
    1.65    SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
    1.66  #endif // !PRODUCT
    1.67    assert(count != 0, "count should be non-zero");
    1.68 -  gen_arraycopy_barrier_pre(dest, count);
    1.69 +  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/false);
    1.70 +  Copy::conjoint_oops_atomic(src, dest, count);
    1.71 +  gen_arraycopy_barrier(dest, count);
    1.72 +JRT_END
    1.73 +
    1.74 +JRT_LEAF(void, StubRoutines::oop_copy_uninit(oop* src, oop* dest, size_t count))
    1.75 +#ifndef PRODUCT
    1.76 +  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
    1.77 +#endif // !PRODUCT
    1.78 +  assert(count != 0, "count should be non-zero");
    1.79 +  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/true);
    1.80    Copy::conjoint_oops_atomic(src, dest, count);
    1.81    gen_arraycopy_barrier(dest, count);
    1.82  JRT_END
    1.83 @@ -368,11 +384,20 @@
    1.84    SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
    1.85  #endif // !PRODUCT
    1.86    assert(count != 0, "count should be non-zero");
    1.87 -  gen_arraycopy_barrier_pre((oop *) dest, count);
    1.88 +  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/false);
    1.89    Copy::arrayof_conjoint_oops(src, dest, count);
    1.90    gen_arraycopy_barrier((oop *) dest, count);
    1.91  JRT_END
    1.92  
    1.93 +JRT_LEAF(void, StubRoutines::arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count))
    1.94 +#ifndef PRODUCT
    1.95 +  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
    1.96 +#endif // !PRODUCT
    1.97 +  assert(count != 0, "count should be non-zero");
    1.98 +  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/true);
    1.99 +  Copy::arrayof_conjoint_oops(src, dest, count);
   1.100 +  gen_arraycopy_barrier((oop *) dest, count);
   1.101 +JRT_END
   1.102  
   1.103  address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) {
   1.104  #define RETURN_STUB(xxx_fill) { \

mercurial