RFR 8136924 Vectorized support for array equals/compare/mismatch using Unsafe

Paul Sandoz paul.sandoz at oracle.com
Wed Dec 2 09:10:37 UTC 2015


> On 2 Dec 2015, at 02:55, Vladimir Kozlov <vladimir.kozlov at oracle.com> wrote:
> 
> I reviewed 8143355 today and my main question is where are range checks?
> 

In this case the range checks are performed by the methods in Arrays, which call non-checking type-specific methods in ArraysSupport that in turn call vectorizedMismatch e.g:

http://cr.openjdk.java.net/~psandoz/jdk9/JDK-8136924-arrays-mismatch-vectorized-unsafe/webrev/src/java.base/share/classes/java/util/Arrays.java.sdiff.html

2861     @HotSpotIntrinsicCandidate
2862     public static boolean equals(byte[] a, byte[] a2) {
2863         if (a==a2)
2864             return true;
2865         if (a==null || a2==null)
2866             return false;
2867
2868         int length = a.length;
2869         if (a2.length != length)
2870             return false;
2871
2872         return ArraysSupport.mismatch(a, a2, length) < 0;
2873     }


2907     public static boolean equals(byte[] a, int aFromIndex, int aToIndex,
2908                                  byte[] b, int bFromIndex, int bToIndex) {
2909         rangeCheck(a.length, aFromIndex, aToIndex);
2910         rangeCheck(b.length, bFromIndex, bToIndex);
2911
2912         int aLength = aToIndex - aFromIndex;
2913         int bLength = bToIndex - bFromIndex;
2914         if (aLength != bLength)
2915             return false;
2916
2917         return ArraysSupport.mismatch(a, aFromIndex,
2918                                       b, bFromIndex,
2919                                       aLength) < 0;
2920     }


5875     public static int compare(byte[] a, byte[] b) {
5876         if (a == b)
5877             return 0;
5878         if (a == null || b == null)
5879             return a == null ? -1 : 1;
5880
5881         int i = ArraysSupport.mismatch(a, b,
5882                                        Math.min(a.length, b.length));
5883         if (i >= 0) {
5884             return Byte.compare(a[i], b[i]);
5885         }
5886
5887         return a.length - b.length;
5888     }


5950     public static int compare(byte[] a, int aFromIndex, int aToIndex,
5951                               byte[] b, int bFromIndex, int bToIndex) {
5952         rangeCheck(a.length, aFromIndex, aToIndex);
5953         rangeCheck(b.length, bFromIndex, bToIndex);
5954
5955         int aLength = aToIndex - aFromIndex;
5956         int bLength = bToIndex - bFromIndex;
5957         int i = ArraysSupport.mismatch(a, aFromIndex,
5958                                        b, bFromIndex,
5959                                        Math.min(aLength, bLength));
5960         if (i >= 0) {
5961             return Byte.compare(a[aFromIndex + i], b[bFromIndex + i]);
5962         }
5963
5964         return aLength - bLength;
5965     }


There are existing tests in place verifying that exceptions are thrown for out of bounds conditions.

Paul.




More information about the core-libs-dev mailing list