95 |
95 |
96 address StubRoutines::_checkcast_arraycopy = NULL; |
96 address StubRoutines::_checkcast_arraycopy = NULL; |
97 address StubRoutines::_unsafe_arraycopy = NULL; |
97 address StubRoutines::_unsafe_arraycopy = NULL; |
98 address StubRoutines::_generic_arraycopy = NULL; |
98 address StubRoutines::_generic_arraycopy = NULL; |
99 |
99 |
|
100 |
|
101 address StubRoutines::_jbyte_fill; |
|
102 address StubRoutines::_jshort_fill; |
|
103 address StubRoutines::_jint_fill; |
|
104 address StubRoutines::_arrayof_jbyte_fill; |
|
105 address StubRoutines::_arrayof_jshort_fill; |
|
106 address StubRoutines::_arrayof_jint_fill; |
|
107 |
|
108 |
100 double (* StubRoutines::_intrinsic_log )(double) = NULL; |
109 double (* StubRoutines::_intrinsic_log )(double) = NULL; |
101 double (* StubRoutines::_intrinsic_log10 )(double) = NULL; |
110 double (* StubRoutines::_intrinsic_log10 )(double) = NULL; |
102 double (* StubRoutines::_intrinsic_exp )(double) = NULL; |
111 double (* StubRoutines::_intrinsic_exp )(double) = NULL; |
103 double (* StubRoutines::_intrinsic_pow )(double, double) = NULL; |
112 double (* StubRoutines::_intrinsic_pow )(double, double) = NULL; |
104 double (* StubRoutines::_intrinsic_sin )(double) = NULL; |
113 double (* StubRoutines::_intrinsic_sin )(double) = NULL; |
193 TEST_ARRAYCOPY(jint); |
202 TEST_ARRAYCOPY(jint); |
194 TEST_ARRAYCOPY(jlong); |
203 TEST_ARRAYCOPY(jlong); |
195 |
204 |
196 #undef TEST_ARRAYCOPY |
205 #undef TEST_ARRAYCOPY |
197 |
206 |
|
207 #define TEST_FILL(type) \ |
|
208 if (_##type##_fill != NULL) { \ |
|
209 union { \ |
|
210 double d; \ |
|
211 type body[96]; \ |
|
212 } s; \ |
|
213 \ |
|
214 int v = 32; \ |
|
215 for (int offset = -2; offset <= 2; offset++) { \ |
|
216 for (int i = 0; i < 96; i++) { \ |
|
217 s.body[i] = 1; \ |
|
218 } \ |
|
219 type* start = s.body + 8 + offset; \ |
|
220 for (int aligned = 0; aligned < 2; aligned++) { \ |
|
221 if (aligned) { \ |
|
222 if (((intptr_t)start) % HeapWordSize == 0) { \ |
|
223 ((void (*)(type*, int, int))StubRoutines::_arrayof_##type##_fill)(start, v, 80); \ |
|
224 } else { \ |
|
225 continue; \ |
|
226 } \ |
|
227 } else { \ |
|
228 ((void (*)(type*, int, int))StubRoutines::_##type##_fill)(start, v, 80); \ |
|
229 } \ |
|
230 for (int i = 0; i < 96; i++) { \ |
|
231 if (i < (8 + offset) || i >= (88 + offset)) { \ |
|
232 assert(s.body[i] == 1, "what?"); \ |
|
233 } else { \ |
|
234 assert(s.body[i] == 32, "what?"); \ |
|
235 } \ |
|
236 } \ |
|
237 } \ |
|
238 } \ |
|
239 } \ |
|
240 |
|
241 TEST_FILL(jbyte); |
|
242 TEST_FILL(jshort); |
|
243 TEST_FILL(jint); |
|
244 |
|
245 #undef TEST_FILL |
|
246 |
198 #define TEST_COPYRTN(type) \ |
247 #define TEST_COPYRTN(type) \ |
199 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic), sizeof(type)); \ |
248 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic), sizeof(type)); \ |
200 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type))) |
249 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type))) |
201 |
250 |
202 // Make sure all the copy runtime routines properly handle zero count |
251 // Make sure all the copy runtime routines properly handle zero count |
313 assert(count != 0, "count should be non-zero"); |
362 assert(count != 0, "count should be non-zero"); |
314 gen_arraycopy_barrier_pre((oop *) dest, count); |
363 gen_arraycopy_barrier_pre((oop *) dest, count); |
315 Copy::arrayof_conjoint_oops(src, dest, count); |
364 Copy::arrayof_conjoint_oops(src, dest, count); |
316 gen_arraycopy_barrier((oop *) dest, count); |
365 gen_arraycopy_barrier((oop *) dest, count); |
317 JRT_END |
366 JRT_END |
|
367 |
|
368 |
|
369 address StubRoutines::select_fill_function(BasicType t, bool aligned, const char* &name) { |
|
370 #define RETURN_STUB(xxx_fill) { \ |
|
371 name = #xxx_fill; \ |
|
372 return StubRoutines::xxx_fill(); } |
|
373 |
|
374 switch (t) { |
|
375 case T_BYTE: |
|
376 case T_BOOLEAN: |
|
377 if (!aligned) RETURN_STUB(jbyte_fill); |
|
378 RETURN_STUB(arrayof_jbyte_fill); |
|
379 case T_CHAR: |
|
380 case T_SHORT: |
|
381 if (!aligned) RETURN_STUB(jshort_fill); |
|
382 RETURN_STUB(arrayof_jshort_fill); |
|
383 case T_INT: |
|
384 case T_FLOAT: |
|
385 if (!aligned) RETURN_STUB(jint_fill); |
|
386 RETURN_STUB(arrayof_jint_fill); |
|
387 case T_DOUBLE: |
|
388 case T_LONG: |
|
389 case T_ARRAY: |
|
390 case T_OBJECT: |
|
391 case T_NARROWOOP: |
|
392 case T_ADDRESS: |
|
393 // Currently unsupported |
|
394 return NULL; |
|
395 |
|
396 default: |
|
397 ShouldNotReachHere(); |
|
398 return NULL; |
|
399 } |
|
400 |
|
401 #undef RETURN_STUB |
|
402 } |