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