149 : Integer.numberOfTrailingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale);
150 return (wi << log2ValuesPerWidth) + o;
151 }
152 tail -= wordTail;
153 }
154 return ~tail;
155 }
156 else {
157 return ~tail;
158 }
159 }
160
161 // Booleans
162 // Each boolean element takes up one byte
163
164 public static int mismatch(boolean[] a,
165 boolean[] b,
166 int length) {
167 int i = 0;
168 if (length > 7) {
169 i = vectorizedMismatch(
170 a, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
171 b, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
172 length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
173 if (i >= 0)
174 return i;
175 i = length - ~i;
176 }
177 for (; i < length; i++) {
178 if (a[i] != b[i])
179 return i;
180 }
181 return -1;
182 }
183
184 public static int mismatch(boolean[] a, int aFromIndex,
185 boolean[] b, int bFromIndex,
186 int length) {
187 int i = 0;
188 if (length > 7) {
189 int aOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET + aFromIndex;
190 int bOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET + bFromIndex;
191 i = vectorizedMismatch(
192 a, aOffset,
193 b, bOffset,
194 length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
195 if (i >= 0)
196 return i;
197 i = length - ~i;
198 }
199 for (; i < length; i++) {
200 if (a[aFromIndex + i] != b[bFromIndex + i])
201 return i;
202 }
203 return -1;
204 }
205
206
207 // Bytes
208
211 *
212 * <p>This method does not perform bounds checks. It is the responsibility
213 * of the caller to perform such bounds checks before calling this method.
214 *
215 * @param a the first array to be tested for a mismatch
216 * @param b the second array to be tested for a mismatch
217 * @param length the number of bytes from each array to check
218 * @return the index of a mismatch between the two arrays, otherwise -1 if
219 * no mismatch. The index will be within the range of (inclusive) 0 to
220 * (exclusive) the smaller of the two array lengths.
221 */
222 public static int mismatch(byte[] a,
223 byte[] b,
224 int length) {
225 // ISSUE: defer to index receiving methods if performance is good
226 // assert length <= a.length
227 // assert length <= b.length
228
229 int i = 0;
230 if (length > 7) {
231 i = vectorizedMismatch(
232 a, Unsafe.ARRAY_BYTE_BASE_OFFSET,
233 b, Unsafe.ARRAY_BYTE_BASE_OFFSET,
234 length, LOG2_ARRAY_BYTE_INDEX_SCALE);
235 if (i >= 0)
236 return i;
237 // Align to tail
238 i = length - ~i;
239 // assert i >= 0 && i <= 7;
240 }
241 // Tail < 8 bytes
242 for (; i < length; i++) {
243 if (a[i] != b[i])
244 return i;
245 }
246 return -1;
247 }
248
249 /**
250 * Find the relative index of a mismatch between two arrays starting from
258 * array to be compared
259 * @param b the second array to be tested for a mismatch
260 * @param bFromIndex the index of the first element (inclusive) in the
261 * second array to be compared
262 * @param length the number of bytes from each array to check
263 * @return the relative index of a mismatch between the two arrays,
264 * otherwise -1 if no mismatch. The index will be within the range of
265 * (inclusive) 0 to (exclusive) the smaller of the two array bounds.
266 */
267 public static int mismatch(byte[] a, int aFromIndex,
268 byte[] b, int bFromIndex,
269 int length) {
270 // assert 0 <= aFromIndex < a.length
271 // assert 0 <= aFromIndex + length <= a.length
272 // assert 0 <= bFromIndex < b.length
273 // assert 0 <= bFromIndex + length <= b.length
274 // assert length >= 0
275
276 int i = 0;
277 if (length > 7) {
278 int aOffset = Unsafe.ARRAY_BYTE_BASE_OFFSET + aFromIndex;
279 int bOffset = Unsafe.ARRAY_BYTE_BASE_OFFSET + bFromIndex;
280 i = vectorizedMismatch(
281 a, aOffset,
282 b, bOffset,
283 length, LOG2_ARRAY_BYTE_INDEX_SCALE);
284 if (i >= 0)
285 return i;
286 i = length - ~i;
287 }
288 for (; i < length; i++) {
289 if (a[aFromIndex + i] != b[bFromIndex + i])
290 return i;
291 }
292 return -1;
293 }
294
295
296 // Chars
297
298 public static int mismatch(char[] a,
299 char[] b,
300 int length) {
301 int i = 0;
302 if (length > 3) {
303 i = vectorizedMismatch(
304 a, Unsafe.ARRAY_CHAR_BASE_OFFSET,
305 b, Unsafe.ARRAY_CHAR_BASE_OFFSET,
306 length, LOG2_ARRAY_CHAR_INDEX_SCALE);
307 if (i >= 0)
308 return i;
309 i = length - ~i;
310 }
311 for (; i < length; i++) {
312 if (a[i] != b[i])
313 return i;
314 }
315 return -1;
316 }
317
318 public static int mismatch(char[] a, int aFromIndex,
319 char[] b, int bFromIndex,
320 int length) {
321 int i = 0;
322 if (length > 3) {
323 int aOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_CHAR_INDEX_SCALE);
324 int bOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_CHAR_INDEX_SCALE);
325 i = vectorizedMismatch(
326 a, aOffset,
327 b, bOffset,
328 length, LOG2_ARRAY_CHAR_INDEX_SCALE);
329 if (i >= 0)
330 return i;
331 i = length - ~i;
332 }
333 for (; i < length; i++) {
334 if (a[aFromIndex + i] != b[bFromIndex + i])
335 return i;
336 }
337 return -1;
338 }
339
340
341 // Shorts
342
343 public static int mismatch(short[] a,
344 short[] b,
345 int length) {
346 int i = 0;
347 if (length > 3) {
348 i = vectorizedMismatch(
349 a, Unsafe.ARRAY_SHORT_BASE_OFFSET,
350 b, Unsafe.ARRAY_SHORT_BASE_OFFSET,
351 length, LOG2_ARRAY_SHORT_INDEX_SCALE);
352 if (i >= 0)
353 return i;
354 i = length - ~i;
355 }
356 for (; i < length; i++) {
357 if (a[i] != b[i])
358 return i;
359 }
360 return -1;
361 }
362
363 public static int mismatch(short[] a, int aFromIndex,
364 short[] b, int bFromIndex,
365 int length) {
366 int i = 0;
367 if (length > 3) {
368 int aOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_SHORT_INDEX_SCALE);
369 int bOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_SHORT_INDEX_SCALE);
370 i = vectorizedMismatch(
371 a, aOffset,
372 b, bOffset,
373 length, LOG2_ARRAY_SHORT_INDEX_SCALE);
374 if (i >= 0)
375 return i;
376 i = length - ~i;
377 }
378 for (; i < length; i++) {
379 if (a[aFromIndex + i] != b[bFromIndex + i])
380 return i;
381 }
382 return -1;
383 }
384
385
386 // Ints
387
388 public static int mismatch(int[] a,
389 int[] b,
390 int length) {
391 int i = 0;
392 if (length > 1) {
393 i = vectorizedMismatch(
394 a, Unsafe.ARRAY_INT_BASE_OFFSET,
395 b, Unsafe.ARRAY_INT_BASE_OFFSET,
396 length, LOG2_ARRAY_INT_INDEX_SCALE);
397 if (i >= 0)
398 return i;
399 i = length - ~i;
400 }
401 for (; i < length; i++) {
402 if (a[i] != b[i])
403 return i;
404 }
405 return -1;
406 }
407
408 public static int mismatch(int[] a, int aFromIndex,
409 int[] b, int bFromIndex,
410 int length) {
411 int i = 0;
412 if (length > 1) {
413 int aOffset = Unsafe.ARRAY_INT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_INT_INDEX_SCALE);
414 int bOffset = Unsafe.ARRAY_INT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_INT_INDEX_SCALE);
415 i = vectorizedMismatch(
416 a, aOffset,
417 b, bOffset,
418 length, LOG2_ARRAY_INT_INDEX_SCALE);
419 if (i >= 0)
420 return i;
421 i = length - ~i;
422 }
423 for (; i < length; i++) {
424 if (a[aFromIndex + i] != b[bFromIndex + i])
425 return i;
426 }
427 return -1;
428 }
429
430
431 // Floats
432
433 public static int mismatch(float[] a,
434 float[] b,
435 int length) {
436 return mismatch(a, 0, b, 0, length);
437 }
438
439 public static int mismatch(float[] a, int aFromIndex,
440 float[] b, int bFromIndex,
441 int length) {
442 int i = 0;
443 if (length > 1) {
444 int aOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_FLOAT_INDEX_SCALE);
445 int bOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_FLOAT_INDEX_SCALE);
446 i = vectorizedMismatch(
447 a, aOffset,
448 b, bOffset,
449 length, LOG2_ARRAY_FLOAT_INDEX_SCALE);
450 // Mismatched
451 if (i >= 0) {
452 // Check if mismatch is not associated with two NaN values
453 if (!Float.isNaN(a[aFromIndex + i]) || !Float.isNaN(b[bFromIndex + i]))
454 return i;
455
456 // Mismatch on two different NaN values that are normalized to match
457 // Fall back to slow mechanism
458 // ISSUE: Consider looping over vectorizedMismatch adjusting ranges
459 // However, requires that returned value be relative to input ranges
460 i++;
461 }
462 // Matched
463 else {
464 i = length - ~i;
465 }
466 }
467 for (; i < length; i++) {
468 if (Float.floatToIntBits(a[aFromIndex + i]) != Float.floatToIntBits(b[bFromIndex + i]))
469 return i;
470 }
471 return -1;
472 }
473
474 // 64 bit sizes
475
476 // Long
477
478 public static int mismatch(long[] a,
479 long[] b,
480 int length) {
481 if (length == 0) {
482 return -1;
483 }
484 int i = vectorizedMismatch(
485 a, Unsafe.ARRAY_LONG_BASE_OFFSET,
486 b, Unsafe.ARRAY_LONG_BASE_OFFSET,
487 length, LOG2_ARRAY_LONG_INDEX_SCALE);
488 return i >= 0 ? i : -1;
489 }
490
491 public static int mismatch(long[] a, int aFromIndex,
492 long[] b, int bFromIndex,
493 int length) {
494 if (length == 0) {
495 return -1;
496 }
497 int aOffset = Unsafe.ARRAY_LONG_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_LONG_INDEX_SCALE);
498 int bOffset = Unsafe.ARRAY_LONG_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_LONG_INDEX_SCALE);
499 int i = vectorizedMismatch(
500 a, aOffset,
501 b, bOffset,
502 length, LOG2_ARRAY_LONG_INDEX_SCALE);
503 return i >= 0 ? i : -1;
504 }
505
506
507 // Double
508
509 public static int mismatch(double[] a,
510 double[] b,
511 int length) {
512 return mismatch(a, 0, b, 0, length);
513 }
514
515 public static int mismatch(double[] a, int aFromIndex,
516 double[] b, int bFromIndex,
517 int length) {
518 if (length == 0) {
519 return -1;
520 }
521 int aOffset = Unsafe.ARRAY_DOUBLE_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_DOUBLE_INDEX_SCALE);
522 int bOffset = Unsafe.ARRAY_DOUBLE_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_DOUBLE_INDEX_SCALE);
523 int i = vectorizedMismatch(
524 a, aOffset,
525 b, bOffset,
526 length, LOG2_ARRAY_DOUBLE_INDEX_SCALE);
527 if (i >= 0) {
528 // Check if mismatch is not associated with two NaN values
529 if (!Double.isNaN(a[aFromIndex + i]) || !Double.isNaN(b[bFromIndex + i]))
530 return i;
531
532 // Mismatch on two different NaN values that are normalized to match
533 // Fall back to slow mechanism
534 // ISSUE: Consider looping over vectorizedMismatch adjusting ranges
535 // However, requires that returned value be relative to input ranges
536 i++;
537 for (; i < length; i++) {
538 if (Double.doubleToLongBits(a[aFromIndex + i]) != Double.doubleToLongBits(b[bFromIndex + i]))
539 return i;
540 }
541 }
542
543 return -1;
544 }
545 }
|
149 : Integer.numberOfTrailingZeros(x) >> (LOG2_BYTE_BIT_SIZE + log2ArrayIndexScale);
150 return (wi << log2ValuesPerWidth) + o;
151 }
152 tail -= wordTail;
153 }
154 return ~tail;
155 }
156 else {
157 return ~tail;
158 }
159 }
160
161 // Booleans
162 // Each boolean element takes up one byte
163
164 public static int mismatch(boolean[] a,
165 boolean[] b,
166 int length) {
167 int i = 0;
168 if (length > 7) {
169 if (a[0] != b[0])
170 return 0;
171 i = vectorizedMismatch(
172 a, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
173 b, Unsafe.ARRAY_BOOLEAN_BASE_OFFSET,
174 length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
175 if (i >= 0)
176 return i;
177 i = length - ~i;
178 }
179 for (; i < length; i++) {
180 if (a[i] != b[i])
181 return i;
182 }
183 return -1;
184 }
185
186 public static int mismatch(boolean[] a, int aFromIndex,
187 boolean[] b, int bFromIndex,
188 int length) {
189 int i = 0;
190 if (length > 7) {
191 if (a[aFromIndex] != b[bFromIndex])
192 return 0;
193 int aOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET + aFromIndex;
194 int bOffset = Unsafe.ARRAY_BOOLEAN_BASE_OFFSET + bFromIndex;
195 i = vectorizedMismatch(
196 a, aOffset,
197 b, bOffset,
198 length, LOG2_ARRAY_BOOLEAN_INDEX_SCALE);
199 if (i >= 0)
200 return i;
201 i = length - ~i;
202 }
203 for (; i < length; i++) {
204 if (a[aFromIndex + i] != b[bFromIndex + i])
205 return i;
206 }
207 return -1;
208 }
209
210
211 // Bytes
212
215 *
216 * <p>This method does not perform bounds checks. It is the responsibility
217 * of the caller to perform such bounds checks before calling this method.
218 *
219 * @param a the first array to be tested for a mismatch
220 * @param b the second array to be tested for a mismatch
221 * @param length the number of bytes from each array to check
222 * @return the index of a mismatch between the two arrays, otherwise -1 if
223 * no mismatch. The index will be within the range of (inclusive) 0 to
224 * (exclusive) the smaller of the two array lengths.
225 */
226 public static int mismatch(byte[] a,
227 byte[] b,
228 int length) {
229 // ISSUE: defer to index receiving methods if performance is good
230 // assert length <= a.length
231 // assert length <= b.length
232
233 int i = 0;
234 if (length > 7) {
235 if (a[0] != b[0])
236 return 0;
237 i = vectorizedMismatch(
238 a, Unsafe.ARRAY_BYTE_BASE_OFFSET,
239 b, Unsafe.ARRAY_BYTE_BASE_OFFSET,
240 length, LOG2_ARRAY_BYTE_INDEX_SCALE);
241 if (i >= 0)
242 return i;
243 // Align to tail
244 i = length - ~i;
245 // assert i >= 0 && i <= 7;
246 }
247 // Tail < 8 bytes
248 for (; i < length; i++) {
249 if (a[i] != b[i])
250 return i;
251 }
252 return -1;
253 }
254
255 /**
256 * Find the relative index of a mismatch between two arrays starting from
264 * array to be compared
265 * @param b the second array to be tested for a mismatch
266 * @param bFromIndex the index of the first element (inclusive) in the
267 * second array to be compared
268 * @param length the number of bytes from each array to check
269 * @return the relative index of a mismatch between the two arrays,
270 * otherwise -1 if no mismatch. The index will be within the range of
271 * (inclusive) 0 to (exclusive) the smaller of the two array bounds.
272 */
273 public static int mismatch(byte[] a, int aFromIndex,
274 byte[] b, int bFromIndex,
275 int length) {
276 // assert 0 <= aFromIndex < a.length
277 // assert 0 <= aFromIndex + length <= a.length
278 // assert 0 <= bFromIndex < b.length
279 // assert 0 <= bFromIndex + length <= b.length
280 // assert length >= 0
281
282 int i = 0;
283 if (length > 7) {
284 if (a[aFromIndex] != b[bFromIndex])
285 return 0;
286 int aOffset = Unsafe.ARRAY_BYTE_BASE_OFFSET + aFromIndex;
287 int bOffset = Unsafe.ARRAY_BYTE_BASE_OFFSET + bFromIndex;
288 i = vectorizedMismatch(
289 a, aOffset,
290 b, bOffset,
291 length, LOG2_ARRAY_BYTE_INDEX_SCALE);
292 if (i >= 0)
293 return i;
294 i = length - ~i;
295 }
296 for (; i < length; i++) {
297 if (a[aFromIndex + i] != b[bFromIndex + i])
298 return i;
299 }
300 return -1;
301 }
302
303
304 // Chars
305
306 public static int mismatch(char[] a,
307 char[] b,
308 int length) {
309 int i = 0;
310 if (length > 3) {
311 if (a[0] != b[0])
312 return 0;
313 i = vectorizedMismatch(
314 a, Unsafe.ARRAY_CHAR_BASE_OFFSET,
315 b, Unsafe.ARRAY_CHAR_BASE_OFFSET,
316 length, LOG2_ARRAY_CHAR_INDEX_SCALE);
317 if (i >= 0)
318 return i;
319 i = length - ~i;
320 }
321 for (; i < length; i++) {
322 if (a[i] != b[i])
323 return i;
324 }
325 return -1;
326 }
327
328 public static int mismatch(char[] a, int aFromIndex,
329 char[] b, int bFromIndex,
330 int length) {
331 int i = 0;
332 if (length > 3) {
333 if (a[aFromIndex] != b[bFromIndex])
334 return 0;
335 int aOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_CHAR_INDEX_SCALE);
336 int bOffset = Unsafe.ARRAY_CHAR_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_CHAR_INDEX_SCALE);
337 i = vectorizedMismatch(
338 a, aOffset,
339 b, bOffset,
340 length, LOG2_ARRAY_CHAR_INDEX_SCALE);
341 if (i >= 0)
342 return i;
343 i = length - ~i;
344 }
345 for (; i < length; i++) {
346 if (a[aFromIndex + i] != b[bFromIndex + i])
347 return i;
348 }
349 return -1;
350 }
351
352
353 // Shorts
354
355 public static int mismatch(short[] a,
356 short[] b,
357 int length) {
358 int i = 0;
359 if (length > 3) {
360 if (a[0] != b[0])
361 return 0;
362 i = vectorizedMismatch(
363 a, Unsafe.ARRAY_SHORT_BASE_OFFSET,
364 b, Unsafe.ARRAY_SHORT_BASE_OFFSET,
365 length, LOG2_ARRAY_SHORT_INDEX_SCALE);
366 if (i >= 0)
367 return i;
368 i = length - ~i;
369 }
370 for (; i < length; i++) {
371 if (a[i] != b[i])
372 return i;
373 }
374 return -1;
375 }
376
377 public static int mismatch(short[] a, int aFromIndex,
378 short[] b, int bFromIndex,
379 int length) {
380 int i = 0;
381 if (length > 3) {
382 if (a[aFromIndex] != b[bFromIndex])
383 return 0;
384 int aOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_SHORT_INDEX_SCALE);
385 int bOffset = Unsafe.ARRAY_SHORT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_SHORT_INDEX_SCALE);
386 i = vectorizedMismatch(
387 a, aOffset,
388 b, bOffset,
389 length, LOG2_ARRAY_SHORT_INDEX_SCALE);
390 if (i >= 0)
391 return i;
392 i = length - ~i;
393 }
394 for (; i < length; i++) {
395 if (a[aFromIndex + i] != b[bFromIndex + i])
396 return i;
397 }
398 return -1;
399 }
400
401
402 // Ints
403
404 public static int mismatch(int[] a,
405 int[] b,
406 int length) {
407 int i = 0;
408 if (length > 1) {
409 if (a[0] != b[0])
410 return 0;
411 i = vectorizedMismatch(
412 a, Unsafe.ARRAY_INT_BASE_OFFSET,
413 b, Unsafe.ARRAY_INT_BASE_OFFSET,
414 length, LOG2_ARRAY_INT_INDEX_SCALE);
415 if (i >= 0)
416 return i;
417 i = length - ~i;
418 }
419 for (; i < length; i++) {
420 if (a[i] != b[i])
421 return i;
422 }
423 return -1;
424 }
425
426 public static int mismatch(int[] a, int aFromIndex,
427 int[] b, int bFromIndex,
428 int length) {
429 int i = 0;
430 if (length > 1) {
431 if (a[aFromIndex] != b[bFromIndex])
432 return 0;
433 int aOffset = Unsafe.ARRAY_INT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_INT_INDEX_SCALE);
434 int bOffset = Unsafe.ARRAY_INT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_INT_INDEX_SCALE);
435 i = vectorizedMismatch(
436 a, aOffset,
437 b, bOffset,
438 length, LOG2_ARRAY_INT_INDEX_SCALE);
439 if (i >= 0)
440 return i;
441 i = length - ~i;
442 }
443 for (; i < length; i++) {
444 if (a[aFromIndex + i] != b[bFromIndex + i])
445 return i;
446 }
447 return -1;
448 }
449
450
451 // Floats
452
453 public static int mismatch(float[] a,
454 float[] b,
455 int length) {
456 return mismatch(a, 0, b, 0, length);
457 }
458
459 public static int mismatch(float[] a, int aFromIndex,
460 float[] b, int bFromIndex,
461 int length) {
462 int i = 0;
463 if (length > 1) {
464 if (a[aFromIndex] != b[bFromIndex]) {
465 i = 0;
466 } else {
467 int aOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_FLOAT_INDEX_SCALE);
468 int bOffset = Unsafe.ARRAY_FLOAT_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_FLOAT_INDEX_SCALE);
469 i = vectorizedMismatch(
470 a, aOffset,
471 b, bOffset,
472 length, LOG2_ARRAY_FLOAT_INDEX_SCALE);
473 }
474 // Mismatched
475 if (i >= 0) {
476 // Check if mismatch is not associated with two NaN values
477 if (!Float.isNaN(a[aFromIndex + i]) || !Float.isNaN(b[bFromIndex + i]))
478 return i;
479
480 // Mismatch on two different NaN values that are normalized to match
481 // Fall back to slow mechanism
482 // ISSUE: Consider looping over vectorizedMismatch adjusting ranges
483 // However, requires that returned value be relative to input ranges
484 i++;
485 }
486 // Matched
487 else {
488 i = length - ~i;
489 }
490 }
491 for (; i < length; i++) {
492 if (Float.floatToIntBits(a[aFromIndex + i]) != Float.floatToIntBits(b[bFromIndex + i]))
493 return i;
494 }
495 return -1;
496 }
497
498 // 64 bit sizes
499
500 // Long
501
502 public static int mismatch(long[] a,
503 long[] b,
504 int length) {
505 if (length == 0) {
506 return -1;
507 }
508 if (a[0] != b[0])
509 return 0;
510 int i = vectorizedMismatch(
511 a, Unsafe.ARRAY_LONG_BASE_OFFSET,
512 b, Unsafe.ARRAY_LONG_BASE_OFFSET,
513 length, LOG2_ARRAY_LONG_INDEX_SCALE);
514 return i >= 0 ? i : -1;
515 }
516
517 public static int mismatch(long[] a, int aFromIndex,
518 long[] b, int bFromIndex,
519 int length) {
520 if (length == 0) {
521 return -1;
522 }
523 if (a[aFromIndex] != b[bFromIndex])
524 return 0;
525 int aOffset = Unsafe.ARRAY_LONG_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_LONG_INDEX_SCALE);
526 int bOffset = Unsafe.ARRAY_LONG_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_LONG_INDEX_SCALE);
527 int i = vectorizedMismatch(
528 a, aOffset,
529 b, bOffset,
530 length, LOG2_ARRAY_LONG_INDEX_SCALE);
531 return i >= 0 ? i : -1;
532 }
533
534
535 // Double
536
537 public static int mismatch(double[] a,
538 double[] b,
539 int length) {
540 return mismatch(a, 0, b, 0, length);
541 }
542
543 public static int mismatch(double[] a, int aFromIndex,
544 double[] b, int bFromIndex,
545 int length) {
546 if (length == 0) {
547 return -1;
548 }
549 int i = 0;
550 if (a[aFromIndex] != b[bFromIndex]) {
551 i = 0;
552 } else {
553 int aOffset = Unsafe.ARRAY_DOUBLE_BASE_OFFSET + (aFromIndex << LOG2_ARRAY_DOUBLE_INDEX_SCALE);
554 int bOffset = Unsafe.ARRAY_DOUBLE_BASE_OFFSET + (bFromIndex << LOG2_ARRAY_DOUBLE_INDEX_SCALE);
555 i = vectorizedMismatch(
556 a, aOffset,
557 b, bOffset,
558 length, LOG2_ARRAY_DOUBLE_INDEX_SCALE);
559 }
560 if (i >= 0) {
561 // Check if mismatch is not associated with two NaN values
562 if (!Double.isNaN(a[aFromIndex + i]) || !Double.isNaN(b[bFromIndex + i]))
563 return i;
564
565 // Mismatch on two different NaN values that are normalized to match
566 // Fall back to slow mechanism
567 // ISSUE: Consider looping over vectorizedMismatch adjusting ranges
568 // However, requires that returned value be relative to input ranges
569 i++;
570 for (; i < length; i++) {
571 if (Double.doubleToLongBits(a[aFromIndex + i]) != Double.doubleToLongBits(b[bFromIndex + i]))
572 return i;
573 }
574 }
575
576 return -1;
577 }
578 }
|