11ba4a712SPawel Jakub Dawidek /*
21ba4a712SPawel Jakub Dawidek * CDDL HEADER START
31ba4a712SPawel Jakub Dawidek *
41ba4a712SPawel Jakub Dawidek * The contents of this file are subject to the terms of the
51ba4a712SPawel Jakub Dawidek * Common Development and Distribution License (the "License").
61ba4a712SPawel Jakub Dawidek * You may not use this file except in compliance with the License.
71ba4a712SPawel Jakub Dawidek *
81ba4a712SPawel Jakub Dawidek * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
91ba4a712SPawel Jakub Dawidek * or http://www.opensolaris.org/os/licensing.
101ba4a712SPawel Jakub Dawidek * See the License for the specific language governing permissions
111ba4a712SPawel Jakub Dawidek * and limitations under the License.
121ba4a712SPawel Jakub Dawidek *
131ba4a712SPawel Jakub Dawidek * When distributing Covered Code, include this CDDL HEADER in each
141ba4a712SPawel Jakub Dawidek * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
151ba4a712SPawel Jakub Dawidek * If applicable, add the following below this CDDL HEADER, with the
161ba4a712SPawel Jakub Dawidek * fields enclosed by brackets "[]" replaced with your own identifying
171ba4a712SPawel Jakub Dawidek * information: Portions Copyright [yyyy] [name of copyright owner]
181ba4a712SPawel Jakub Dawidek *
191ba4a712SPawel Jakub Dawidek * CDDL HEADER END
201ba4a712SPawel Jakub Dawidek */
211ba4a712SPawel Jakub Dawidek /*
221ba4a712SPawel Jakub Dawidek * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
231ba4a712SPawel Jakub Dawidek * Use is subject to license terms.
241ba4a712SPawel Jakub Dawidek */
251ba4a712SPawel Jakub Dawidek
261ba4a712SPawel Jakub Dawidek static void
fletcher_2_native(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)27*2c55d090SToomas Soome fletcher_2_native(const void *buf, uint64_t size,
28*2c55d090SToomas Soome const void *ctx_template __unused, zio_cksum_t *zcp)
291ba4a712SPawel Jakub Dawidek {
301ba4a712SPawel Jakub Dawidek const uint64_t *ip = buf;
311ba4a712SPawel Jakub Dawidek const uint64_t *ipend = ip + (size / sizeof (uint64_t));
321ba4a712SPawel Jakub Dawidek uint64_t a0, b0, a1, b1;
331ba4a712SPawel Jakub Dawidek
341ba4a712SPawel Jakub Dawidek for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
351ba4a712SPawel Jakub Dawidek a0 += ip[0];
361ba4a712SPawel Jakub Dawidek a1 += ip[1];
371ba4a712SPawel Jakub Dawidek b0 += a0;
381ba4a712SPawel Jakub Dawidek b1 += a1;
391ba4a712SPawel Jakub Dawidek }
401ba4a712SPawel Jakub Dawidek
411ba4a712SPawel Jakub Dawidek ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
421ba4a712SPawel Jakub Dawidek }
431ba4a712SPawel Jakub Dawidek
441ba4a712SPawel Jakub Dawidek static void
fletcher_2_byteswap(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)45*2c55d090SToomas Soome fletcher_2_byteswap(const void *buf, uint64_t size,
46*2c55d090SToomas Soome const void *ctx_template __unused, zio_cksum_t *zcp)
4710b9d77bSPawel Jakub Dawidek {
4810b9d77bSPawel Jakub Dawidek const uint64_t *ip = buf;
4910b9d77bSPawel Jakub Dawidek const uint64_t *ipend = ip + (size / sizeof (uint64_t));
5010b9d77bSPawel Jakub Dawidek uint64_t a0, b0, a1, b1;
5110b9d77bSPawel Jakub Dawidek
5210b9d77bSPawel Jakub Dawidek for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
5310b9d77bSPawel Jakub Dawidek a0 += BSWAP_64(ip[0]);
5410b9d77bSPawel Jakub Dawidek a1 += BSWAP_64(ip[1]);
5510b9d77bSPawel Jakub Dawidek b0 += a0;
5610b9d77bSPawel Jakub Dawidek b1 += a1;
5710b9d77bSPawel Jakub Dawidek }
5810b9d77bSPawel Jakub Dawidek
5910b9d77bSPawel Jakub Dawidek ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
6010b9d77bSPawel Jakub Dawidek }
6110b9d77bSPawel Jakub Dawidek
6210b9d77bSPawel Jakub Dawidek static void
fletcher_4_native(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)63*2c55d090SToomas Soome fletcher_4_native(const void *buf, uint64_t size,
64*2c55d090SToomas Soome const void *ctx_template __unused, zio_cksum_t *zcp)
651ba4a712SPawel Jakub Dawidek {
661ba4a712SPawel Jakub Dawidek const uint32_t *ip = buf;
671ba4a712SPawel Jakub Dawidek const uint32_t *ipend = ip + (size / sizeof (uint32_t));
681ba4a712SPawel Jakub Dawidek uint64_t a, b, c, d;
691ba4a712SPawel Jakub Dawidek
701ba4a712SPawel Jakub Dawidek for (a = b = c = d = 0; ip < ipend; ip++) {
711ba4a712SPawel Jakub Dawidek a += ip[0];
721ba4a712SPawel Jakub Dawidek b += a;
731ba4a712SPawel Jakub Dawidek c += b;
741ba4a712SPawel Jakub Dawidek d += c;
751ba4a712SPawel Jakub Dawidek }
761ba4a712SPawel Jakub Dawidek
771ba4a712SPawel Jakub Dawidek ZIO_SET_CHECKSUM(zcp, a, b, c, d);
781ba4a712SPawel Jakub Dawidek }
7910b9d77bSPawel Jakub Dawidek
8010b9d77bSPawel Jakub Dawidek static void
fletcher_4_byteswap(const void * buf,uint64_t size,const void * ctx_template __unused,zio_cksum_t * zcp)81*2c55d090SToomas Soome fletcher_4_byteswap(const void *buf, uint64_t size,
82*2c55d090SToomas Soome const void *ctx_template __unused, zio_cksum_t *zcp)
8310b9d77bSPawel Jakub Dawidek {
8410b9d77bSPawel Jakub Dawidek const uint32_t *ip = buf;
8510b9d77bSPawel Jakub Dawidek const uint32_t *ipend = ip + (size / sizeof (uint32_t));
8610b9d77bSPawel Jakub Dawidek uint64_t a, b, c, d;
8710b9d77bSPawel Jakub Dawidek
8810b9d77bSPawel Jakub Dawidek for (a = b = c = d = 0; ip < ipend; ip++) {
8910b9d77bSPawel Jakub Dawidek a += BSWAP_32(ip[0]);
9010b9d77bSPawel Jakub Dawidek b += a;
9110b9d77bSPawel Jakub Dawidek c += b;
9210b9d77bSPawel Jakub Dawidek d += c;
9310b9d77bSPawel Jakub Dawidek }
9410b9d77bSPawel Jakub Dawidek
9510b9d77bSPawel Jakub Dawidek ZIO_SET_CHECKSUM(zcp, a, b, c, d);
9610b9d77bSPawel Jakub Dawidek }
97