--- old/src/java.base/share/classes/java/util/zip/CRC32C.java 2017-11-28 18:12:42.098661073 +0300 +++ new/src/java.base/share/classes/java/util/zip/CRC32C.java 2017-11-28 18:12:41.770654486 +0300 @@ -222,51 +222,58 @@ if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) { crc = Integer.reverseBytes(crc); - } - // slicing-by-8 - for (; off < (end - Long.BYTES); off += Long.BYTES) { - int firstHalf; - int secondHalf; - if (Unsafe.ADDRESS_SIZE == 4) { - // On 32 bit platforms read two ints instead of a single 64bit long - firstHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); - secondHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off - + Integer.BYTES); - } else { - long value = UNSAFE.getLong(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); - if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) { - firstHalf = (int) value; - secondHalf = (int) (value >>> 32); - } else { // ByteOrder.BIG_ENDIAN + // slicing-by-8 + for (; off < (end - Long.BYTES); off += Long.BYTES) { + int firstHalf; + int secondHalf; + if (Unsafe.ADDRESS_SIZE == 4) { + // On 32 bit platforms read two ints instead of a single 64bit long + firstHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); + secondHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off + + Integer.BYTES); + } else { + long value = UNSAFE.getLong(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); firstHalf = (int) (value >>> 32); secondHalf = (int) value; } + crc ^= firstHalf; + crc = (byteTable0[secondHalf & 0xFF] + ^ byteTable1[(secondHalf >>> 8) & 0xFF]) + ^ (byteTable2[(secondHalf >>> 16) & 0xFF] + ^ byteTable3[secondHalf >>> 24]) + ^ (byteTable4[crc & 0xFF] + ^ byteTable5[(crc >>> 8) & 0xFF]) + ^ (byteTable6[(crc >>> 16) & 0xFF] + ^ byteTable7[crc >>> 24]); } - crc ^= firstHalf; - if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) { - crc = byteTable7[crc & 0xFF] - ^ byteTable6[(crc >>> 8) & 0xFF] - ^ byteTable5[(crc >>> 16) & 0xFF] - ^ byteTable4[crc >>> 24] - ^ byteTable3[secondHalf & 0xFF] - ^ byteTable2[(secondHalf >>> 8) & 0xFF] - ^ byteTable1[(secondHalf >>> 16) & 0xFF] - ^ byteTable0[secondHalf >>> 24]; - } else { // ByteOrder.BIG_ENDIAN - crc = byteTable0[secondHalf & 0xFF] - ^ byteTable1[(secondHalf >>> 8) & 0xFF] - ^ byteTable2[(secondHalf >>> 16) & 0xFF] - ^ byteTable3[secondHalf >>> 24] - ^ byteTable4[crc & 0xFF] - ^ byteTable5[(crc >>> 8) & 0xFF] - ^ byteTable6[(crc >>> 16) & 0xFF] - ^ byteTable7[crc >>> 24]; - } - } - if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) { crc = Integer.reverseBytes(crc); + } else { // ByteOrder.LITTLE_ENDIAN + // slicing-by-8 + for (; off < (end - Long.BYTES); off += Long.BYTES) { + int firstHalf; + int secondHalf; + if (Unsafe.ADDRESS_SIZE == 4) { + // On 32 bit platforms read two ints instead of a single 64bit long + firstHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); + secondHalf = UNSAFE.getInt(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off + + Integer.BYTES); + } else { + long value = UNSAFE.getLong(b, (long)Unsafe.ARRAY_BYTE_BASE_OFFSET + off); + firstHalf = (int) value; + secondHalf = (int) (value >>> 32); + } + crc ^= firstHalf; + crc = (byteTable7[crc & 0xFF] + ^ byteTable6[(crc >>> 8) & 0xFF]) + ^ (byteTable5[(crc >>> 16) & 0xFF] + ^ byteTable4[crc >>> 24]) + ^ (byteTable3[secondHalf & 0xFF] + ^ byteTable2[(secondHalf >>> 8) & 0xFF]) + ^ (byteTable1[(secondHalf >>> 16) & 0xFF] + ^ byteTable0[secondHalf >>> 24]); + } } } @@ -297,39 +304,43 @@ if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) { crc = Integer.reverseBytes(crc); - } - // slicing-by-8 - for (; off <= (end - Long.BYTES); off += Long.BYTES) { - // Always reading two ints as reading a long followed by - // shifting and casting was slower. - int firstHalf = UNSAFE.getInt(address + off); - int secondHalf = UNSAFE.getInt(address + off + Integer.BYTES); - crc ^= firstHalf; - if (ByteOrder.nativeOrder() == ByteOrder.LITTLE_ENDIAN) { - crc = byteTable7[crc & 0xFF] - ^ byteTable6[(crc >>> 8) & 0xFF] - ^ byteTable5[(crc >>> 16) & 0xFF] - ^ byteTable4[crc >>> 24] - ^ byteTable3[secondHalf & 0xFF] - ^ byteTable2[(secondHalf >>> 8) & 0xFF] - ^ byteTable1[(secondHalf >>> 16) & 0xFF] - ^ byteTable0[secondHalf >>> 24]; - } else { // ByteOrder.BIG_ENDIAN - crc = byteTable0[secondHalf & 0xFF] - ^ byteTable1[(secondHalf >>> 8) & 0xFF] - ^ byteTable2[(secondHalf >>> 16) & 0xFF] - ^ byteTable3[secondHalf >>> 24] - ^ byteTable4[crc & 0xFF] - ^ byteTable5[(crc >>> 8) & 0xFF] - ^ byteTable6[(crc >>> 16) & 0xFF] - ^ byteTable7[crc >>> 24]; + // slicing-by-8 + for (; off <= (end - Long.BYTES); off += Long.BYTES) { + // Always reading two ints as reading a long followed by + // shifting and casting was slower. + int firstHalf = UNSAFE.getInt(address + off); + int secondHalf = UNSAFE.getInt(address + off + Integer.BYTES); + crc ^= firstHalf; + crc = (byteTable0[secondHalf & 0xFF] + ^ byteTable1[(secondHalf >>> 8) & 0xFF]) + ^ (byteTable2[(secondHalf >>> 16) & 0xFF] + ^ byteTable3[secondHalf >>> 24]) + ^ (byteTable4[crc & 0xFF] + ^ byteTable5[(crc >>> 8) & 0xFF]) + ^ (byteTable6[(crc >>> 16) & 0xFF] + ^ byteTable7[crc >>> 24]); } - } - - if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) { crc = Integer.reverseBytes(crc); + } else { // ByteOrder.LITTLE_ENDIAN + // slicing-by-8 + for (; off <= (end - Long.BYTES); off += Long.BYTES) { + // Always reading two ints as reading a long followed by + // shifting and casting was slower. + int firstHalf = UNSAFE.getInt(address + off); + int secondHalf = UNSAFE.getInt(address + off + Integer.BYTES); + crc ^= firstHalf; + crc = (byteTable7[crc & 0xFF] + ^ byteTable6[(crc >>> 8) & 0xFF]) + ^ (byteTable5[(crc >>> 16) & 0xFF] + ^ byteTable4[crc >>> 24]) + ^ (byteTable3[secondHalf & 0xFF] + ^ byteTable2[(secondHalf >>> 8) & 0xFF]) + ^ (byteTable1[(secondHalf >>> 16) & 0xFF] + ^ byteTable0[secondHalf >>> 24]); + } } + } // Tail