Mercurial > hg > truffle
comparison src/share/vm/runtime/stubRoutines.hpp @ 2324:0ac769a57c64
6627983: G1: Bad oop deference during marking
Summary: Bulk zeroing reduction didn't work with G1, because arraycopy would call pre-barriers on uninitialized oops. The solution is to have version of arraycopy stubs that don't have pre-barriers. Also refactored arraycopy stubs generation on SPARC to be more readable and reduced the number of stubs necessary in some cases.
Reviewed-by: jrose, kvn, never
author | iveresov |
---|---|
date | Tue, 01 Mar 2011 14:56:48 -0800 |
parents | b92c45f2bc75 |
children | 13bc79b5c9c8 |
comparison
equal
deleted
inserted
replaced
2323:bc6b27fb3568 | 2324:0ac769a57c64 |
---|---|
1 /* | 1 /* |
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. | 2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. |
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | 4 * |
5 * This code is free software; you can redistribute it and/or modify it | 5 * This code is free software; you can redistribute it and/or modify it |
6 * under the terms of the GNU General Public License version 2 only, as | 6 * under the terms of the GNU General Public License version 2 only, as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
162 // arraycopy operands aligned on element type boundary | 162 // arraycopy operands aligned on element type boundary |
163 static address _jbyte_arraycopy; | 163 static address _jbyte_arraycopy; |
164 static address _jshort_arraycopy; | 164 static address _jshort_arraycopy; |
165 static address _jint_arraycopy; | 165 static address _jint_arraycopy; |
166 static address _jlong_arraycopy; | 166 static address _jlong_arraycopy; |
167 static address _oop_arraycopy; | 167 static address _oop_arraycopy, _oop_arraycopy_uninit; |
168 static address _jbyte_disjoint_arraycopy; | 168 static address _jbyte_disjoint_arraycopy; |
169 static address _jshort_disjoint_arraycopy; | 169 static address _jshort_disjoint_arraycopy; |
170 static address _jint_disjoint_arraycopy; | 170 static address _jint_disjoint_arraycopy; |
171 static address _jlong_disjoint_arraycopy; | 171 static address _jlong_disjoint_arraycopy; |
172 static address _oop_disjoint_arraycopy; | 172 static address _oop_disjoint_arraycopy, _oop_disjoint_arraycopy_uninit; |
173 | 173 |
174 // arraycopy operands aligned on zero'th element boundary | 174 // arraycopy operands aligned on zero'th element boundary |
175 // These are identical to the ones aligned aligned on an | 175 // These are identical to the ones aligned aligned on an |
176 // element type boundary, except that they assume that both | 176 // element type boundary, except that they assume that both |
177 // source and destination are HeapWord aligned. | 177 // source and destination are HeapWord aligned. |
178 static address _arrayof_jbyte_arraycopy; | 178 static address _arrayof_jbyte_arraycopy; |
179 static address _arrayof_jshort_arraycopy; | 179 static address _arrayof_jshort_arraycopy; |
180 static address _arrayof_jint_arraycopy; | 180 static address _arrayof_jint_arraycopy; |
181 static address _arrayof_jlong_arraycopy; | 181 static address _arrayof_jlong_arraycopy; |
182 static address _arrayof_oop_arraycopy; | 182 static address _arrayof_oop_arraycopy, _arrayof_oop_arraycopy_uninit; |
183 static address _arrayof_jbyte_disjoint_arraycopy; | 183 static address _arrayof_jbyte_disjoint_arraycopy; |
184 static address _arrayof_jshort_disjoint_arraycopy; | 184 static address _arrayof_jshort_disjoint_arraycopy; |
185 static address _arrayof_jint_disjoint_arraycopy; | 185 static address _arrayof_jint_disjoint_arraycopy; |
186 static address _arrayof_jlong_disjoint_arraycopy; | 186 static address _arrayof_jlong_disjoint_arraycopy; |
187 static address _arrayof_oop_disjoint_arraycopy; | 187 static address _arrayof_oop_disjoint_arraycopy, _arrayof_oop_disjoint_arraycopy_uninit; |
188 | 188 |
189 // these are recommended but optional: | 189 // these are recommended but optional: |
190 static address _checkcast_arraycopy; | 190 static address _checkcast_arraycopy, _checkcast_arraycopy_uninit; |
191 static address _unsafe_arraycopy; | 191 static address _unsafe_arraycopy; |
192 static address _generic_arraycopy; | 192 static address _generic_arraycopy; |
193 | 193 |
194 static address _jbyte_fill; | 194 static address _jbyte_fill; |
195 static address _jshort_fill; | 195 static address _jshort_fill; |
284 | 284 |
285 static address jbyte_arraycopy() { return _jbyte_arraycopy; } | 285 static address jbyte_arraycopy() { return _jbyte_arraycopy; } |
286 static address jshort_arraycopy() { return _jshort_arraycopy; } | 286 static address jshort_arraycopy() { return _jshort_arraycopy; } |
287 static address jint_arraycopy() { return _jint_arraycopy; } | 287 static address jint_arraycopy() { return _jint_arraycopy; } |
288 static address jlong_arraycopy() { return _jlong_arraycopy; } | 288 static address jlong_arraycopy() { return _jlong_arraycopy; } |
289 static address oop_arraycopy() { return _oop_arraycopy; } | 289 static address oop_arraycopy(bool dest_uninitialized = false) { |
290 return dest_uninitialized ? _oop_arraycopy_uninit : _oop_arraycopy; | |
291 } | |
290 static address jbyte_disjoint_arraycopy() { return _jbyte_disjoint_arraycopy; } | 292 static address jbyte_disjoint_arraycopy() { return _jbyte_disjoint_arraycopy; } |
291 static address jshort_disjoint_arraycopy() { return _jshort_disjoint_arraycopy; } | 293 static address jshort_disjoint_arraycopy() { return _jshort_disjoint_arraycopy; } |
292 static address jint_disjoint_arraycopy() { return _jint_disjoint_arraycopy; } | 294 static address jint_disjoint_arraycopy() { return _jint_disjoint_arraycopy; } |
293 static address jlong_disjoint_arraycopy() { return _jlong_disjoint_arraycopy; } | 295 static address jlong_disjoint_arraycopy() { return _jlong_disjoint_arraycopy; } |
294 static address oop_disjoint_arraycopy() { return _oop_disjoint_arraycopy; } | 296 static address oop_disjoint_arraycopy(bool dest_uninitialized = false) { |
297 return dest_uninitialized ? _oop_disjoint_arraycopy_uninit : _oop_disjoint_arraycopy; | |
298 } | |
295 | 299 |
296 static address arrayof_jbyte_arraycopy() { return _arrayof_jbyte_arraycopy; } | 300 static address arrayof_jbyte_arraycopy() { return _arrayof_jbyte_arraycopy; } |
297 static address arrayof_jshort_arraycopy() { return _arrayof_jshort_arraycopy; } | 301 static address arrayof_jshort_arraycopy() { return _arrayof_jshort_arraycopy; } |
298 static address arrayof_jint_arraycopy() { return _arrayof_jint_arraycopy; } | 302 static address arrayof_jint_arraycopy() { return _arrayof_jint_arraycopy; } |
299 static address arrayof_jlong_arraycopy() { return _arrayof_jlong_arraycopy; } | 303 static address arrayof_jlong_arraycopy() { return _arrayof_jlong_arraycopy; } |
300 static address arrayof_oop_arraycopy() { return _arrayof_oop_arraycopy; } | 304 static address arrayof_oop_arraycopy(bool dest_uninitialized = false) { |
305 return dest_uninitialized ? _arrayof_oop_arraycopy_uninit : _arrayof_oop_arraycopy; | |
306 } | |
301 | 307 |
302 static address arrayof_jbyte_disjoint_arraycopy() { return _arrayof_jbyte_disjoint_arraycopy; } | 308 static address arrayof_jbyte_disjoint_arraycopy() { return _arrayof_jbyte_disjoint_arraycopy; } |
303 static address arrayof_jshort_disjoint_arraycopy() { return _arrayof_jshort_disjoint_arraycopy; } | 309 static address arrayof_jshort_disjoint_arraycopy() { return _arrayof_jshort_disjoint_arraycopy; } |
304 static address arrayof_jint_disjoint_arraycopy() { return _arrayof_jint_disjoint_arraycopy; } | 310 static address arrayof_jint_disjoint_arraycopy() { return _arrayof_jint_disjoint_arraycopy; } |
305 static address arrayof_jlong_disjoint_arraycopy() { return _arrayof_jlong_disjoint_arraycopy; } | 311 static address arrayof_jlong_disjoint_arraycopy() { return _arrayof_jlong_disjoint_arraycopy; } |
306 static address arrayof_oop_disjoint_arraycopy() { return _arrayof_oop_disjoint_arraycopy; } | 312 static address arrayof_oop_disjoint_arraycopy(bool dest_uninitialized = false) { |
307 | 313 return dest_uninitialized ? _arrayof_oop_disjoint_arraycopy_uninit : _arrayof_oop_disjoint_arraycopy; |
308 static address checkcast_arraycopy() { return _checkcast_arraycopy; } | 314 } |
315 | |
316 static address checkcast_arraycopy(bool dest_uninitialized = false) { | |
317 return dest_uninitialized ? _checkcast_arraycopy_uninit : _checkcast_arraycopy; | |
318 } | |
309 static address unsafe_arraycopy() { return _unsafe_arraycopy; } | 319 static address unsafe_arraycopy() { return _unsafe_arraycopy; } |
310 static address generic_arraycopy() { return _generic_arraycopy; } | 320 static address generic_arraycopy() { return _generic_arraycopy; } |
311 | 321 |
312 static address jbyte_fill() { return _jbyte_fill; } | 322 static address jbyte_fill() { return _jbyte_fill; } |
313 static address jshort_fill() { return _jshort_fill; } | 323 static address jshort_fill() { return _jshort_fill; } |
350 | 360 |
351 // | 361 // |
352 // Default versions of the above arraycopy functions for platforms which do | 362 // Default versions of the above arraycopy functions for platforms which do |
353 // not have specialized versions | 363 // not have specialized versions |
354 // | 364 // |
355 static void jbyte_copy (jbyte* src, jbyte* dest, size_t count); | 365 static void jbyte_copy (jbyte* src, jbyte* dest, size_t count); |
356 static void jshort_copy(jshort* src, jshort* dest, size_t count); | 366 static void jshort_copy (jshort* src, jshort* dest, size_t count); |
357 static void jint_copy (jint* src, jint* dest, size_t count); | 367 static void jint_copy (jint* src, jint* dest, size_t count); |
358 static void jlong_copy (jlong* src, jlong* dest, size_t count); | 368 static void jlong_copy (jlong* src, jlong* dest, size_t count); |
359 static void oop_copy (oop* src, oop* dest, size_t count); | 369 static void oop_copy (oop* src, oop* dest, size_t count); |
360 | 370 static void oop_copy_uninit(oop* src, oop* dest, size_t count); |
361 static void arrayof_jbyte_copy (HeapWord* src, HeapWord* dest, size_t count); | 371 |
362 static void arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count); | 372 static void arrayof_jbyte_copy (HeapWord* src, HeapWord* dest, size_t count); |
363 static void arrayof_jint_copy (HeapWord* src, HeapWord* dest, size_t count); | 373 static void arrayof_jshort_copy (HeapWord* src, HeapWord* dest, size_t count); |
364 static void arrayof_jlong_copy (HeapWord* src, HeapWord* dest, size_t count); | 374 static void arrayof_jint_copy (HeapWord* src, HeapWord* dest, size_t count); |
365 static void arrayof_oop_copy (HeapWord* src, HeapWord* dest, size_t count); | 375 static void arrayof_jlong_copy (HeapWord* src, HeapWord* dest, size_t count); |
376 static void arrayof_oop_copy (HeapWord* src, HeapWord* dest, size_t count); | |
377 static void arrayof_oop_copy_uninit(HeapWord* src, HeapWord* dest, size_t count); | |
366 }; | 378 }; |
367 | 379 |
368 #endif // SHARE_VM_RUNTIME_STUBROUTINES_HPP | 380 #endif // SHARE_VM_RUNTIME_STUBROUTINES_HPP |