< prev index next >

src/java.base/share/classes/java/util/zip/CRC32C.java

Print this page

        

*** 220,230 **** crc = (crc >>> 8) ^ byteTable[(crc ^ b[off]) & 0xFF]; } 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; --- 220,229 ----
*** 233,274 **** 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 firstHalf = (int) (value >>> 32); secondHalf = (int) value; } - } 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); } } // Tail for (; off < end; off++) { --- 232,281 ---- 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 = 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]); + } } } // Tail for (; off < end; off++) {
*** 295,339 **** ^ byteTable[(crc ^ UNSAFE.getByte(address + off)) & 0xFF]; } 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]; } - } - - if (ByteOrder.nativeOrder() == ByteOrder.BIG_ENDIAN) { crc = Integer.reverseBytes(crc); } } // Tail for (; off < end; off++) { crc = (crc >>> 8) ^ byteTable[(crc ^ UNSAFE.getByte(address + off)) & 0xFF]; } --- 302,350 ---- ^ byteTable[(crc ^ UNSAFE.getByte(address + off)) & 0xFF]; } 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; ! 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 = 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 for (; off < end; off++) { crc = (crc >>> 8) ^ byteTable[(crc ^ UNSAFE.getByte(address + off)) & 0xFF]; }
< prev index next >