Mercurial > hg > graal-compiler
comparison graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/replacements/UnsafeArrayCopySnippets.java @ 11816:8db5e8c4f542
Provide object read/write methods similar to Pointer.readXxxx/writeXxx that do not require casts to Word first, and use them in relevant places
author | Christian Wimmer <christian.wimmer@oracle.com> |
---|---|
date | Thu, 26 Sep 2013 15:53:21 -0700 |
parents | 03c781923573 |
children | 88fb9cba8751 |
comparison
equal
deleted
inserted
replaced
11815:43bc62c78f77 | 11816:8db5e8c4f542 |
---|---|
190 Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); | 190 Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); |
191 UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); | 191 UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); |
192 } | 192 } |
193 } else { | 193 } else { |
194 for (long i = 0; i < byteLength; i += VECTOR_SIZE) { | 194 for (long i = 0; i < byteLength; i += VECTOR_SIZE) { |
195 /* | |
196 * TODO atomicity problem on 32-bit architectures: The JVM spec requires double | |
197 * values to be copied atomically, but not long values. For example, on Intel 32-bit | |
198 * this code is not atomic as long as the vector kind remains Kind.Long. | |
199 */ | |
195 Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); | 200 Long a = UnsafeLoadNode.load(src, arrayBaseOffset, i + srcOffset, VECTOR_KIND); |
196 UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); | 201 UnsafeStoreNode.store(dest, arrayBaseOffset, i + destOffset, a.longValue(), VECTOR_KIND); |
197 } | 202 } |
198 } | 203 } |
199 } | 204 } |
223 @Snippet | 228 @Snippet |
224 public static void arraycopyPrimitive(Object src, int srcPos, Object dest, int destPos, int length, int layoutHelper) { | 229 public static void arraycopyPrimitive(Object src, int srcPos, Object dest, int destPos, int length, int layoutHelper) { |
225 int log2ElementSize = (layoutHelper >> layoutHelperLog2ElementSizeShift()) & layoutHelperLog2ElementSizeMask(); | 230 int log2ElementSize = (layoutHelper >> layoutHelperLog2ElementSizeShift()) & layoutHelperLog2ElementSizeMask(); |
226 int headerSize = (layoutHelper >> layoutHelperHeaderSizeShift()) & layoutHelperHeaderSizeMask(); | 231 int headerSize = (layoutHelper >> layoutHelperHeaderSizeShift()) & layoutHelperHeaderSizeMask(); |
227 | 232 |
228 Word srcOffset = (Word) Word.fromObject(src).add(headerSize).add(srcPos << log2ElementSize); | 233 Unsigned srcOffset = Word.unsigned(srcPos).shiftLeft(log2ElementSize).add(headerSize); |
229 Word destOffset = (Word) Word.fromObject(dest).add(headerSize).add(destPos << log2ElementSize); | 234 Unsigned destOffset = Word.unsigned(destPos).shiftLeft(log2ElementSize).add(headerSize); |
230 Word destStart = destOffset; | 235 Unsigned destStart = destOffset; |
231 long sizeInBytes = ((long) length) << log2ElementSize; | 236 Unsigned sizeInBytes = Word.unsigned(length).shiftLeft(log2ElementSize); |
232 Word destEnd = destOffset.add(Word.unsigned(length).shiftLeft(log2ElementSize)); | 237 Unsigned destEnd = destOffset.add(Word.unsigned(length).shiftLeft(log2ElementSize)); |
233 | 238 |
234 int nonVectorBytes = (int) (sizeInBytes % VECTOR_SIZE); | 239 Unsigned nonVectorBytes = sizeInBytes.unsignedRemainder(Word.unsigned(VECTOR_SIZE)); |
235 Word destNonVectorEnd = destStart.add(nonVectorBytes); | 240 Unsigned destNonVectorEnd = destStart.add(nonVectorBytes); |
236 | 241 |
237 while (destOffset.belowThan(destNonVectorEnd)) { | 242 while (destOffset.belowThan(destNonVectorEnd)) { |
238 destOffset.writeByte(0, srcOffset.readByte(0, ANY_LOCATION), ANY_LOCATION); | 243 ObjectAccess.writeByte(dest, destOffset, ObjectAccess.readByte(src, srcOffset, ANY_LOCATION), ANY_LOCATION); |
239 destOffset = destOffset.add(1); | 244 destOffset = destOffset.add(1); |
240 srcOffset = srcOffset.add(1); | 245 srcOffset = srcOffset.add(1); |
241 } | 246 } |
242 while (destOffset.belowThan(destEnd)) { | 247 while (destOffset.belowThan(destEnd)) { |
243 destOffset.writeWord(0, srcOffset.readWord(0, ANY_LOCATION), ANY_LOCATION); | 248 ObjectAccess.writeWord(dest, destOffset, ObjectAccess.readWord(src, srcOffset, ANY_LOCATION), ANY_LOCATION); |
244 destOffset = destOffset.add(wordSize()); | 249 destOffset = destOffset.add(wordSize()); |
245 srcOffset = srcOffset.add(wordSize()); | 250 srcOffset = srcOffset.add(wordSize()); |
246 } | 251 } |
247 } | 252 } |
248 | 253 |