hotspot/src/share/vm/runtime/stubRoutines.cpp
author coleenp
Wed, 20 Mar 2013 08:04:54 -0400
changeset 16430 882cddc35bec
parent 14132 3c1437abcefd
child 17087 f0b76c4c93a0
permissions -rw-r--r--
8008217: CDS: Class data sharing limits the malloc heap on Solaris Summary: In 64bit VM move CDS archive address to 32G on all platforms using new flag SharedBaseAddress. In 32bit VM set CDS archive address to 3Gb on Linux and let other OSs pick the address. Reviewed-by: kvn, dcubed, zgu, hseigel
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13963
e5b53c306fb5 7197424: update copyright year to match last edit in jdk8 hotspot repository
mikael
parents: 13391
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 5403
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    26
#include "asm/codeBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    27
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    28
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    29
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    30
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    31
#include "runtime/stubRoutines.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    32
#include "runtime/timer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    33
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    34
#ifdef COMPILER2
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    35
#include "opto/runtime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6434
diff changeset
    36
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
// Implementation of StubRoutines - for a description
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
// of how to extend it, see the header file.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
// Class Variables
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
BufferBlob* StubRoutines::_code1                                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
BufferBlob* StubRoutines::_code2                                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
address StubRoutines::_call_stub_return_address                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
address StubRoutines::_call_stub_entry                          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
address StubRoutines::_catch_exception_entry                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
address StubRoutines::_forward_exception_entry                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
address StubRoutines::_throw_AbstractMethodError_entry          = NULL;
189
4248c8e21063 6664627: Merge changes made only in hotspot 11 forward to jdk 7
dcubed
parents: 1
diff changeset
    53
address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
address StubRoutines::_throw_NullPointerException_at_call_entry = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
address StubRoutines::_throw_StackOverflowError_entry           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
address StubRoutines::_handler_for_unsafe_access_entry          = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
jint    StubRoutines::_verify_oop_count                         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
address StubRoutines::_verify_oop_subroutine_entry              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
address StubRoutines::_atomic_xchg_entry                        = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
address StubRoutines::_atomic_xchg_ptr_entry                    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
address StubRoutines::_atomic_store_entry                       = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
address StubRoutines::_atomic_store_ptr_entry                   = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
address StubRoutines::_atomic_cmpxchg_entry                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
address StubRoutines::_atomic_cmpxchg_ptr_entry                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
address StubRoutines::_atomic_cmpxchg_long_entry                = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
address StubRoutines::_atomic_add_entry                         = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
address StubRoutines::_atomic_add_ptr_entry                     = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
address StubRoutines::_fence_entry                              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
address StubRoutines::_d2i_wrapper                              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
address StubRoutines::_d2l_wrapper                              = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
jint    StubRoutines::_fpu_cntrl_wrd_std                        = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
jint    StubRoutines::_fpu_cntrl_wrd_24                         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
jint    StubRoutines::_fpu_cntrl_wrd_64                         = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
jint    StubRoutines::_fpu_cntrl_wrd_trunc                      = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
jint    StubRoutines::_mxcsr_std                                = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
jint    StubRoutines::_fpu_subnormal_bias1[3]                   = { 0, 0, 0 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
jint    StubRoutines::_fpu_subnormal_bias2[3]                   = { 0, 0, 0 };
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
// Compiled code entry points default values
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
    81
// The default functions don't have separate disjoint versions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
address StubRoutines::_jbyte_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
address StubRoutines::_jshort_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
address StubRoutines::_jint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
address StubRoutines::_jlong_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
address StubRoutines::_oop_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
    87
address StubRoutines::_oop_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
address StubRoutines::_jbyte_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
address StubRoutines::_jshort_disjoint_arraycopy         = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
address StubRoutines::_jint_disjoint_arraycopy           = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
address StubRoutines::_jlong_disjoint_arraycopy          = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
address StubRoutines::_oop_disjoint_arraycopy            = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
    93
address StubRoutines::_oop_disjoint_arraycopy_uninit     = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy_uninit);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
address StubRoutines::_arrayof_jbyte_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
address StubRoutines::_arrayof_jint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
address StubRoutines::_arrayof_jlong_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
address StubRoutines::_arrayof_oop_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   100
address StubRoutines::_arrayof_oop_arraycopy_uninit      = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
address StubRoutines::_arrayof_jbyte_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
address StubRoutines::_arrayof_jint_disjoint_arraycopy   = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
address StubRoutines::_arrayof_jlong_disjoint_arraycopy  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   105
address StubRoutines::_arrayof_oop_disjoint_arraycopy    = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   106
address StubRoutines::_arrayof_oop_disjoint_arraycopy_uninit  = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy_uninit);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   107
10501
5bce84af0883 7059037: Use BIS for zeroing on T4
kvn
parents: 10004
diff changeset
   108
address StubRoutines::_zero_aligned_words = CAST_FROM_FN_PTR(address, Copy::zero_to_words);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
address StubRoutines::_checkcast_arraycopy               = NULL;
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   111
address StubRoutines::_checkcast_arraycopy_uninit        = NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
address StubRoutines::_unsafe_arraycopy                  = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
address StubRoutines::_generic_arraycopy                 = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   115
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   116
address StubRoutines::_jbyte_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   117
address StubRoutines::_jshort_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   118
address StubRoutines::_jint_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   119
address StubRoutines::_arrayof_jbyte_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   120
address StubRoutines::_arrayof_jshort_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   121
address StubRoutines::_arrayof_jint_fill;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   122
14132
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
   123
address StubRoutines::_aescrypt_encryptBlock               = NULL;
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
   124
address StubRoutines::_aescrypt_decryptBlock               = NULL;
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
   125
address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL;
3c1437abcefd 7184394: add intrinsics to use AES instructions
kvn
parents: 13974
diff changeset
   126
address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL;
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   127
4645
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   128
double (* StubRoutines::_intrinsic_log   )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   129
double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   130
double (* StubRoutines::_intrinsic_exp   )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   131
double (* StubRoutines::_intrinsic_pow   )(double, double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   132
double (* StubRoutines::_intrinsic_sin   )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   133
double (* StubRoutines::_intrinsic_cos   )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   134
double (* StubRoutines::_intrinsic_tan   )(double) = NULL;
0c5f5b94e93a 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 189
diff changeset
   135
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
// Initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
// Note: to break cycle with universe initialization, stubs are generated in two phases.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
// The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
// The second phase includes all other stubs (which may depend on universe being initialized.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
void StubRoutines::initialize1() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  if (_code1 == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    TraceTime timer("StubRoutines generation 1", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    _code1 = BufferBlob::create("StubRoutines (1)", code_size1);
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4886
diff changeset
   149
    if (_code1 == NULL) {
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5883
diff changeset
   150
      vm_exit_out_of_memory(code_size1, "CodeCache: no room for StubRoutines (1)");
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4886
diff changeset
   151
    }
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5883
diff changeset
   152
    CodeBuffer buffer(_code1);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
    StubGenerator_generate(&buffer, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
typedef void (*arraycopy_fn)(address src, address dst, int count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
// simple tests of generated arraycopy functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
static void test_arraycopy_func(address func, int alignment) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  int v = 0xcc;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  int v2 = 0x11;
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   165
  jlong lbuffer[8];
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   166
  jlong lbuffer2[8];
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   167
  address fbuffer  = (address) lbuffer;
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   168
  address fbuffer2 = (address) lbuffer2;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  unsigned int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  for (i = 0; i < sizeof(lbuffer); i++) {
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   171
    fbuffer[i] = v; fbuffer2[i] = v2;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
  }
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   173
  // C++ does not guarantee jlong[] array alignment to 8 bytes.
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   174
  // Use middle of array to check that memory before it is not modified.
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   175
  address buffer  = (address) round_to((intptr_t)&lbuffer[4], BytesPerLong);
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   176
  address buffer2 = (address) round_to((intptr_t)&lbuffer2[4], BytesPerLong);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  // do an aligned copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  ((arraycopy_fn)func)(buffer, buffer2, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  for (i = 0; i < sizeof(lbuffer); i++) {
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   180
    assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // adjust destination alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  ((arraycopy_fn)func)(buffer, buffer2 + alignment, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  for (i = 0; i < sizeof(lbuffer); i++) {
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   185
    assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // adjust source alignment
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  ((arraycopy_fn)func)(buffer + alignment, buffer2, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  for (i = 0; i < sizeof(lbuffer); i++) {
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   190
    assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
void StubRoutines::initialize2() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  if (_code2 == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
    TraceTime timer("StubRoutines generation 2", TraceStartupTime);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    _code2 = BufferBlob::create("StubRoutines (2)", code_size2);
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4886
diff changeset
   201
    if (_code2 == NULL) {
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5883
diff changeset
   202
      vm_exit_out_of_memory(code_size2, "CodeCache: no room for StubRoutines (2)");
5403
6b0dd9c75dde 6888954: argument formatting for assert() and friends
jcoomes
parents: 4886
diff changeset
   203
    }
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 5883
diff changeset
   204
    CodeBuffer buffer(_code2);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
    StubGenerator_generate(&buffer, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
#define TEST_ARRAYCOPY(type)                                                    \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  test_arraycopy_func(          type##_arraycopy(),          sizeof(type));     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  test_arraycopy_func(          type##_disjoint_arraycopy(), sizeof(type));     \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  test_arraycopy_func(arrayof_##type##_arraycopy(),          sizeof(HeapWord)); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  test_arraycopy_func(arrayof_##type##_disjoint_arraycopy(), sizeof(HeapWord))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   216
  // Make sure all the arraycopy stubs properly handle zero count
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  TEST_ARRAYCOPY(jbyte);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  TEST_ARRAYCOPY(jshort);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  TEST_ARRAYCOPY(jint);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  TEST_ARRAYCOPY(jlong);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
#undef TEST_ARRAYCOPY
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   224
#define TEST_FILL(type)                                                                      \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   225
  if (_##type##_fill != NULL) {                                                              \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   226
    union {                                                                                  \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   227
      double d;                                                                              \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   228
      type body[96];                                                                         \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   229
    } s;                                                                                     \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   230
                                                                                             \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   231
    int v = 32;                                                                              \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   232
    for (int offset = -2; offset <= 2; offset++) {                                           \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   233
      for (int i = 0; i < 96; i++) {                                                         \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   234
        s.body[i] = 1;                                                                       \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   235
      }                                                                                      \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   236
      type* start = s.body + 8 + offset;                                                     \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   237
      for (int aligned = 0; aligned < 2; aligned++) {                                        \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   238
        if (aligned) {                                                                       \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   239
          if (((intptr_t)start) % HeapWordSize == 0) {                                       \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   240
            ((void (*)(type*, int, int))StubRoutines::_arrayof_##type##_fill)(start, v, 80); \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   241
          } else {                                                                           \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   242
            continue;                                                                        \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   243
          }                                                                                  \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   244
        } else {                                                                             \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   245
          ((void (*)(type*, int, int))StubRoutines::_##type##_fill)(start, v, 80);           \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   246
        }                                                                                    \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   247
        for (int i = 0; i < 96; i++) {                                                       \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   248
          if (i < (8 + offset) || i >= (88 + offset)) {                                      \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   249
            assert(s.body[i] == 1, "what?");                                                 \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   250
          } else {                                                                           \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   251
            assert(s.body[i] == 32, "what?");                                                \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   252
          }                                                                                  \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   253
        }                                                                                    \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   254
      }                                                                                      \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   255
    }                                                                                        \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   256
  }                                                                                          \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   257
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   258
  TEST_FILL(jbyte);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   259
  TEST_FILL(jshort);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   260
  TEST_FILL(jint);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   261
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   262
#undef TEST_FILL
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   263
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   264
#define TEST_COPYRTN(type) \
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   265
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic),  sizeof(type)); \
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   266
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type)))
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   267
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   268
  // Make sure all the copy runtime routines properly handle zero count
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   269
  TEST_COPYRTN(jbyte);
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   270
  TEST_COPYRTN(jshort);
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   271
  TEST_COPYRTN(jint);
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   272
  TEST_COPYRTN(jlong);
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   273
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   274
#undef TEST_COPYRTN
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   275
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   276
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_words), sizeof(HeapWord));
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   277
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words), sizeof(HeapWord));
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   278
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words_atomic), sizeof(HeapWord));
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   279
  // Aligned to BytesPerLong
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   280
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_conjoint_words), sizeof(jlong));
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   281
  test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_disjoint_words), sizeof(jlong));
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   282
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
void stubRoutines_init1() { StubRoutines::initialize1(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
void stubRoutines_init2() { StubRoutines::initialize2(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
// Default versions of arraycopy functions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   294
static void gen_arraycopy_barrier_pre(oop* dest, size_t count, bool dest_uninitialized) {
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   295
    assert(count != 0, "count should be non-zero");
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   296
    assert(count <= (size_t)max_intx, "count too large");
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   297
    BarrierSet* bs = Universe::heap()->barrier_set();
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   298
    assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt");
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   299
    bs->write_ref_array_pre(dest, (int)count, dest_uninitialized);
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   300
}
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   301
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
static void gen_arraycopy_barrier(oop* dest, size_t count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    assert(count != 0, "count should be non-zero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
    BarrierSet* bs = Universe::heap()->barrier_set();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
    assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4645
diff changeset
   306
    bs->write_ref_array((HeapWord*)dest, count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
JRT_LEAF(void, StubRoutines::jbyte_copy(jbyte* src, jbyte* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
  SharedRuntime::_jbyte_array_copy_ctr++;      // Slow-path byte array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
#endif // !PRODUCT
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   313
  Copy::conjoint_jbytes_atomic(src, dest, count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
JRT_LEAF(void, StubRoutines::jshort_copy(jshort* src, jshort* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  SharedRuntime::_jshort_array_copy_ctr++;     // Slow-path short/char array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  Copy::conjoint_jshorts_atomic(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
JRT_LEAF(void, StubRoutines::jint_copy(jint* src, jint* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
  SharedRuntime::_jint_array_copy_ctr++;       // Slow-path int/float array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  Copy::conjoint_jints_atomic(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
JRT_LEAF(void, StubRoutines::jlong_copy(jlong* src, jlong* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  SharedRuntime::_jlong_array_copy_ctr++;      // Slow-path long/double array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  Copy::conjoint_jlongs_atomic(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
JRT_LEAF(void, StubRoutines::oop_copy(oop* src, oop* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  assert(count != 0, "count should be non-zero");
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   342
  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/false);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   343
  Copy::conjoint_oops_atomic(src, dest, count);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   344
  gen_arraycopy_barrier(dest, count);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   345
JRT_END
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   346
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   347
JRT_LEAF(void, StubRoutines::oop_copy_uninit(oop* src, oop* dest, size_t count))
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   348
#ifndef PRODUCT
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   349
  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   350
#endif // !PRODUCT
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   351
  assert(count != 0, "count should be non-zero");
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   352
  gen_arraycopy_barrier_pre(dest, count, /*dest_uninitialized*/true);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
  Copy::conjoint_oops_atomic(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  gen_arraycopy_barrier(dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
JRT_LEAF(void, StubRoutines::arrayof_jbyte_copy(HeapWord* src, HeapWord* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
  SharedRuntime::_jbyte_array_copy_ctr++;      // Slow-path byte array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
#endif // !PRODUCT
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5547
diff changeset
   361
  Copy::arrayof_conjoint_jbytes(src, dest, count);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
JRT_LEAF(void, StubRoutines::arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  SharedRuntime::_jshort_array_copy_ctr++;     // Slow-path short/char array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  Copy::arrayof_conjoint_jshorts(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
JRT_LEAF(void, StubRoutines::arrayof_jint_copy(HeapWord* src, HeapWord* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
  SharedRuntime::_jint_array_copy_ctr++;       // Slow-path int/float array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
  Copy::arrayof_conjoint_jints(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
JRT_LEAF(void, StubRoutines::arrayof_jlong_copy(HeapWord* src, HeapWord* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  SharedRuntime::_jlong_array_copy_ctr++;       // Slow-path int/float array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  Copy::arrayof_conjoint_jlongs(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
JRT_LEAF(void, StubRoutines::arrayof_oop_copy(HeapWord* src, HeapWord* dest, size_t count))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
#endif // !PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
  assert(count != 0, "count should be non-zero");
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   390
  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/false);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
  Copy::arrayof_conjoint_oops(src, dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
  gen_arraycopy_barrier((oop *) dest, count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   393
JRT_END
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   394
8498
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   395
JRT_LEAF(void, StubRoutines::arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count))
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   396
#ifndef PRODUCT
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   397
  SharedRuntime::_oop_array_copy_ctr++;        // Slow-path oop array copy
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   398
#endif // !PRODUCT
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   399
  assert(count != 0, "count should be non-zero");
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   400
  gen_arraycopy_barrier_pre((oop *) dest, count, /*dest_uninitialized*/true);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   401
  Copy::arrayof_conjoint_oops(src, dest, count);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   402
  gen_arraycopy_barrier((oop *) dest, count);
6398004126b9 6627983: G1: Bad oop deference during marking
iveresov
parents: 7397
diff changeset
   403
JRT_END
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   404
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   405
address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) {
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   406
#define RETURN_STUB(xxx_fill) { \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   407
  name = #xxx_fill; \
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   408
  return StubRoutines::xxx_fill(); }
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   409
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   410
  switch (t) {
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   411
  case T_BYTE:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   412
  case T_BOOLEAN:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   413
    if (!aligned) RETURN_STUB(jbyte_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   414
    RETURN_STUB(arrayof_jbyte_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   415
  case T_CHAR:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   416
  case T_SHORT:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   417
    if (!aligned) RETURN_STUB(jshort_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   418
    RETURN_STUB(arrayof_jshort_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   419
  case T_INT:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   420
  case T_FLOAT:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   421
    if (!aligned) RETURN_STUB(jint_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   422
    RETURN_STUB(arrayof_jint_fill);
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   423
  case T_DOUBLE:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   424
  case T_LONG:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   425
  case T_ARRAY:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   426
  case T_OBJECT:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   427
  case T_NARROWOOP:
13969
d2a189b83b87 7054512: Compress class pointers after perm gen removal
roland
parents: 13391
diff changeset
   428
  case T_NARROWKLASS:
6433
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   429
  case T_ADDRESS:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   430
    // Currently unsupported
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   431
    return NULL;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   432
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   433
  default:
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   434
    ShouldNotReachHere();
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   435
    return NULL;
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   436
  }
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   437
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   438
#undef RETURN_STUB
b0e4fafdc38b 4809552: Optimize Arrays.fill(...)
never
parents: 5883
diff changeset
   439
}
9102
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   440
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   441
// constants for computing the copy function
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   442
enum {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   443
  COPYFUNC_UNALIGNED = 0,
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   444
  COPYFUNC_ALIGNED = 1,                 // src, dest aligned to HeapWordSize
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   445
  COPYFUNC_CONJOINT = 0,
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   446
  COPYFUNC_DISJOINT = 2                 // src != dest, or transfer can descend
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   447
};
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   448
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   449
// Note:  The condition "disjoint" applies also for overlapping copies
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   450
// where an descending copy is permitted (i.e., dest_offset <= src_offset).
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   451
address
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   452
StubRoutines::select_arraycopy_function(BasicType t, bool aligned, bool disjoint, const char* &name, bool dest_uninitialized) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   453
  int selector =
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   454
    (aligned  ? COPYFUNC_ALIGNED  : COPYFUNC_UNALIGNED) +
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   455
    (disjoint ? COPYFUNC_DISJOINT : COPYFUNC_CONJOINT);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   456
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   457
#define RETURN_STUB(xxx_arraycopy) { \
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   458
  name = #xxx_arraycopy; \
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   459
  return StubRoutines::xxx_arraycopy(); }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   460
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   461
#define RETURN_STUB_PARM(xxx_arraycopy, parm) {           \
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   462
  name = #xxx_arraycopy; \
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   463
  return StubRoutines::xxx_arraycopy(parm); }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   464
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   465
  switch (t) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   466
  case T_BYTE:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   467
  case T_BOOLEAN:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   468
    switch (selector) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   469
    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jbyte_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   470
    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jbyte_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   471
    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jbyte_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   472
    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jbyte_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   473
    }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   474
  case T_CHAR:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   475
  case T_SHORT:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   476
    switch (selector) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   477
    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jshort_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   478
    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jshort_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   479
    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jshort_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   480
    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jshort_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   481
    }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   482
  case T_INT:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   483
  case T_FLOAT:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   484
    switch (selector) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   485
    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   486
    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   487
    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jint_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   488
    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jint_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   489
    }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   490
  case T_DOUBLE:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   491
  case T_LONG:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   492
    switch (selector) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   493
    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jlong_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   494
    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jlong_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   495
    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB(jlong_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   496
    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB(arrayof_jlong_disjoint_arraycopy);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   497
    }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   498
  case T_ARRAY:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   499
  case T_OBJECT:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   500
    switch (selector) {
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   501
    case COPYFUNC_CONJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB_PARM(oop_arraycopy, dest_uninitialized);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   502
    case COPYFUNC_CONJOINT | COPYFUNC_ALIGNED:    RETURN_STUB_PARM(arrayof_oop_arraycopy, dest_uninitialized);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   503
    case COPYFUNC_DISJOINT | COPYFUNC_UNALIGNED:  RETURN_STUB_PARM(oop_disjoint_arraycopy, dest_uninitialized);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   504
    case COPYFUNC_DISJOINT | COPYFUNC_ALIGNED:    RETURN_STUB_PARM(arrayof_oop_disjoint_arraycopy, dest_uninitialized);
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   505
    }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   506
  default:
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   507
    ShouldNotReachHere();
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   508
    return NULL;
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   509
  }
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   510
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   511
#undef RETURN_STUB
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   512
#undef RETURN_STUB_PARM
4708a4aefb33 7033154: Improve C1 arraycopy performance
roland
parents: 8498
diff changeset
   513
}