private final static int _findLongMatchLength(final byte[] in, int ptr1, int ptr2, final int maxPtr1) { final int base = ptr1 - 9; // and then just loop with longs if we get that far final int longEnd = maxPtr1-8; while (ptr1 <= longEnd) { long l1 = unsafe.getLong(in, BYTE_ARRAY_OFFSET + ptr1); long l2 = unsafe.getLong(in, BYTE_ARRAY_OFFSET + ptr2); if (l1 != l2) { return ptr1 - base + _leadingBytes(l1, l2); } ptr1 += 8; ptr2 += 8; } // or, if running out of runway, handle last bytes with loop-de-loop... while (ptr1 < maxPtr1 && in[ptr1] == in[ptr2]) { ++ptr1; ++ptr2; } return ptr1 - base; // i.e. }
private final static int _findLongMatchLength(final byte[] in, int ptr1, int ptr2, final int maxPtr1) { final int base = ptr1 - 9; // and then just loop with longs if we get that far final int longEnd = maxPtr1-8; while (ptr1 <= longEnd) { long l1 = unsafe.getLong(in, BYTE_ARRAY_OFFSET + ptr1); long l2 = unsafe.getLong(in, BYTE_ARRAY_OFFSET + ptr2); if (l1 != l2) { return ptr1 - base + _leadingBytes(l1, l2); } ptr1 += 8; ptr2 += 8; } // or, if running out of runway, handle last bytes with loop-de-loop... while (ptr1 < maxPtr1 && in[ptr1] == in[ptr2]) { ++ptr1; ++ptr2; } return ptr1 - base; // i.e. }
private final static int _findMatchLength(final byte[] in, int ptr1, int ptr2, final int maxPtr1) { // Expect at least 8 bytes to check for fast case; offline others if ((ptr1 + 8) >= maxPtr1) { // rare case, offline return _findTailMatchLength(in, ptr1, ptr2, maxPtr1); } // short matches common, so start with specialized comparison // NOTE: we know that we have 4 bytes of slack before end, so this is safe: int i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); int i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 1 + _leadingBytes(i1, i2); } ptr1 += 4; ptr2 += 4; i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 5 + _leadingBytes(i1, i2); } return _findLongMatchLength(in, ptr1+4, ptr2+4, maxPtr1); }
private final static int _findMatchLength(final byte[] in, int ptr1, int ptr2, final int maxPtr1) { // Expect at least 8 bytes to check for fast case; offline others if ((ptr1 + 8) >= maxPtr1) { // rare case, offline return _findTailMatchLength(in, ptr1, ptr2, maxPtr1); } // short matches common, so start with specialized comparison // NOTE: we know that we have 4 bytes of slack before end, so this is safe: int i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); int i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 1 + _leadingBytes(i1, i2); } ptr1 += 4; ptr2 += 4; i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 5 + _leadingBytes(i1, i2); } return _findLongMatchLength(in, ptr1+4, ptr2+4, maxPtr1); }
private final static int _findMatchLength(final byte[] in, int ptr1, int ptr2, final int maxPtr1) { // Expect at least 8 bytes to check for fast case; offline others if ((ptr1 + 8) >= maxPtr1) { // rare case, offline return _findTailMatchLength(in, ptr1, ptr2, maxPtr1); } // short matches common, so start with specialized comparison // NOTE: we know that we have 4 bytes of slack before end, so this is safe: int i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); int i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 1 + _leadingBytes(i1, i2); } ptr1 += 4; ptr2 += 4; i1 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr1); i2 = unsafe.getInt(in, BYTE_ARRAY_OFFSET + ptr2); if (i1 != i2) { return 5 + _leadingBytes(i1, i2); } return _findLongMatchLength(in, ptr1+4, ptr2+4, maxPtr1); }