annotate src/share/vm/runtime/stubRoutines.cpp @ 3979:4dfb2df418f2

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