Changeset View
Changeset View
Standalone View
Standalone View
sys/cddl/boot/zfs/fletcher.c
Show All 17 Lines | |||||
* | * | ||||
* CDDL HEADER END | * CDDL HEADER END | ||||
*/ | */ | ||||
/* | /* | ||||
* Copyright 2006 Sun Microsystems, Inc. All rights reserved. | * Copyright 2006 Sun Microsystems, Inc. All rights reserved. | ||||
* Use is subject to license terms. | * Use is subject to license terms. | ||||
*/ | */ | ||||
/*#pragma ident "%Z%%M% %I% %E% SMI"*/ | |||||
static void | static void | ||||
fletcher_2_native(const void *buf, uint64_t size, zio_cksum_t *zcp) | fletcher_2_native(const void *buf, uint64_t size, | ||||
const void *ctx_template __unused, zio_cksum_t *zcp) | |||||
{ | { | ||||
const uint64_t *ip = buf; | const uint64_t *ip = buf; | ||||
const uint64_t *ipend = ip + (size / sizeof (uint64_t)); | const uint64_t *ipend = ip + (size / sizeof (uint64_t)); | ||||
uint64_t a0, b0, a1, b1; | uint64_t a0, b0, a1, b1; | ||||
for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { | for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { | ||||
a0 += ip[0]; | a0 += ip[0]; | ||||
a1 += ip[1]; | a1 += ip[1]; | ||||
b0 += a0; | b0 += a0; | ||||
b1 += a1; | b1 += a1; | ||||
} | } | ||||
ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); | ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); | ||||
} | } | ||||
static void | static void | ||||
fletcher_2_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp) | fletcher_2_byteswap(const void *buf, uint64_t size, | ||||
const void *ctx_template __unused, zio_cksum_t *zcp) | |||||
{ | { | ||||
const uint64_t *ip = buf; | const uint64_t *ip = buf; | ||||
const uint64_t *ipend = ip + (size / sizeof (uint64_t)); | const uint64_t *ipend = ip + (size / sizeof (uint64_t)); | ||||
uint64_t a0, b0, a1, b1; | uint64_t a0, b0, a1, b1; | ||||
for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { | for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) { | ||||
a0 += BSWAP_64(ip[0]); | a0 += BSWAP_64(ip[0]); | ||||
a1 += BSWAP_64(ip[1]); | a1 += BSWAP_64(ip[1]); | ||||
b0 += a0; | b0 += a0; | ||||
b1 += a1; | b1 += a1; | ||||
} | } | ||||
ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); | ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1); | ||||
} | } | ||||
static void | static void | ||||
fletcher_4_native(const void *buf, uint64_t size, zio_cksum_t *zcp) | fletcher_4_native(const void *buf, uint64_t size, | ||||
const void *ctx_template __unused, zio_cksum_t *zcp) | |||||
{ | { | ||||
const uint32_t *ip = buf; | const uint32_t *ip = buf; | ||||
const uint32_t *ipend = ip + (size / sizeof (uint32_t)); | const uint32_t *ipend = ip + (size / sizeof (uint32_t)); | ||||
uint64_t a, b, c, d; | uint64_t a, b, c, d; | ||||
for (a = b = c = d = 0; ip < ipend; ip++) { | for (a = b = c = d = 0; ip < ipend; ip++) { | ||||
a += ip[0]; | a += ip[0]; | ||||
b += a; | b += a; | ||||
c += b; | c += b; | ||||
d += c; | d += c; | ||||
} | } | ||||
ZIO_SET_CHECKSUM(zcp, a, b, c, d); | ZIO_SET_CHECKSUM(zcp, a, b, c, d); | ||||
} | } | ||||
static void | static void | ||||
fletcher_4_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp) | fletcher_4_byteswap(const void *buf, uint64_t size, | ||||
const void *ctx_template __unused, zio_cksum_t *zcp) | |||||
{ | { | ||||
const uint32_t *ip = buf; | const uint32_t *ip = buf; | ||||
const uint32_t *ipend = ip + (size / sizeof (uint32_t)); | const uint32_t *ipend = ip + (size / sizeof (uint32_t)); | ||||
uint64_t a, b, c, d; | uint64_t a, b, c, d; | ||||
for (a = b = c = d = 0; ip < ipend; ip++) { | for (a = b = c = d = 0; ip < ipend; ip++) { | ||||
a += BSWAP_32(ip[0]); | a += BSWAP_32(ip[0]); | ||||
b += a; | b += a; | ||||
c += b; | c += b; | ||||
d += c; | d += c; | ||||
} | } | ||||
ZIO_SET_CHECKSUM(zcp, a, b, c, d); | ZIO_SET_CHECKSUM(zcp, a, b, c, d); | ||||
} | } |