< 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 >