< prev index next >

src/java.base/share/classes/jdk/internal/util/ArraysSupport.java

Print this page
M ArraysSupport.java


 146                 int bv = U.getIntUnaligned(b, bOffset + bi);
 147                 if (av != bv) {
 148                     int x = av ^ bv;
 149                     int o = BIG_ENDIAN
 150                             ? Integer.numberOfLeadingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale)
 151                             : Integer.numberOfTrailingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale);
 152                     return (wi << log2ValuesPerWidth) + o;
 153                 }
 154                 tail -= wordTail;
 155             }
 156             return ~tail;
 157         }
 158         else {
 159             return ~tail;
 160         }
 161     }
 162 
 163     /**
 164      * Mismatch over long lengths.
 165      */
 166     public static long vectorizedMismatchLarge(Object a, long aOffset,
 167                                                Object b, long bOffset,
 168                                                long length,
 169                                                int log2ArrayIndexScale) {
 170         long off = 0;
 171         long remaining = length;
 172         int i ;
 173         while (remaining > 7) {
 174             int size = (int) Math.min(Integer.MAX_VALUE, remaining);






 175             i = vectorizedMismatch(
 176                     a, aOffset + off,
 177                     b, bOffset + off,
 178                     size, log2ArrayIndexScale);
 179             if (i >= 0)
 180                 return off + i;
 181 
 182             i = size - ~i;
 183             off += i;
 184             remaining -= i;
 185         }
 186         return ~off;
 187     }
 188 
 189     // Booleans
 190     // Each boolean element takes up one byte
 191 
 192     public static int mismatch(boolean[] a,
 193                                boolean[] b,
 194                                int length) {
 195         int i = 0;
 196         if (length > 7) {
 197             if (a[0] != b[0])
 198                 return 0;
 199             i = vectorizedMismatch(
 200                     a, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
 201                     b, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
 202                     length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
 203             if (i >= 0)
 204                 return i;
 205             i = length - ~i;
 206         }




 146                 int bv = U.getIntUnaligned(b, bOffset + bi);
 147                 if (av != bv) {
 148                     int x = av ^ bv;
 149                     int o = BIG_ENDIAN
 150                             ? Integer.numberOfLeadingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale)
 151                             : Integer.numberOfTrailingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale);
 152                     return (wi << log2ValuesPerWidth) + o;
 153                 }
 154                 tail -= wordTail;
 155             }
 156             return ~tail;
 157         }
 158         else {
 159             return ~tail;
 160         }
 161     }
 162 
 163     /**
 164      * Mismatch over long lengths.
 165      */
 166         public static long vectorizedMismatchLargeForBytes(Object a, long aOffset,
 167                                                            Object b, long bOffset,
 168                                                            long length) {

 169             long off = 0;
 170             long remaining = length;
 171             int i, size;
 172             boolean lastSubRange = false;
 173             while (remaining > 7 && !lastSubRange) {
 174                 if (remaining > Integer.MAX_VALUE) {
 175                     size = Integer.MAX_VALUE;
 176                 } else {
 177                     size = (int) remaining;
 178                     lastSubRange = true;
 179                 }
 180                 i = vectorizedMismatch(
 181                         a, aOffset + off,
 182                         b, bOffset + off,
 183                         size, LOG2_ARRAY_BYTE_INDEX_SCALE);
 184                 if (i >= 0)
 185                     return off + i;
 186 
 187                 i = size - ~i;
 188                 off += i;
 189                 remaining -= i;
 190             }
 191             return ~remaining;
 192         }
 193 
 194     // Booleans
 195     // Each boolean element takes up one byte
 196 
 197     public static int mismatch(boolean[] a,
 198                                boolean[] b,
 199                                int length) {
 200         int i = 0;
 201         if (length > 7) {
 202             if (a[0] != b[0])
 203                 return 0;
 204             i = vectorizedMismatch(
 205                     a, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
 206                     b, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
 207                     length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
 208             if (i >= 0)
 209                 return i;
 210             i = length - ~i;
 211         }


< prev index next >