diff options
Diffstat (limited to '3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h')
-rw-r--r-- | 3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h b/3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h new file mode 100644 index 0000000..67f71a6 --- /dev/null +++ b/3rdparty/openpgm-svn-r1135/pgm/include/impl/checksum.h @@ -0,0 +1,75 @@ +/* vim:ts=8:sts=4:sw=4:noai:noexpandtab + * + * PGM checksum routines + * + * Copyright (c) 2006-2008 Miru Limited. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#if !defined (__PGM_IMPL_FRAMEWORK_H_INSIDE__) && !defined (PGM_COMPILATION) +# error "Only <framework.h> can be included directly." +#endif + +#ifndef __PGM_IMPL_CHECKSUM_H__ +#define __PGM_IMPL_CHECKSUM_H__ + +#include <pgm/types.h> + +PGM_BEGIN_DECLS + +uint16_t pgm_inet_checksum (const void*, uint16_t, uint16_t); +uint16_t pgm_csum_fold (uint32_t) PGM_GNUC_CONST; +uint32_t pgm_csum_block_add (uint32_t, uint32_t, const uint16_t) PGM_GNUC_CONST; +uint32_t pgm_compat_csum_partial (const void*, uint16_t, uint32_t); +uint32_t pgm_compat_csum_partial_copy (const void*restrict, void*restrict, uint16_t, uint32_t); + +static inline uint32_t add32_with_carry (uint32_t, uint32_t) PGM_GNUC_CONST; + +#if defined(__x86_64__) || defined(__i386__) || defined(__i386) || defined(__amd64) +static inline uint32_t add32_with_carry (uint32_t a, uint32_t b) +{ + asm("addl %2, %0 \n\t" + "adcl $0, %0" + : "=r" (a) /* output operands */ + : "0" (a), "r" (b)); /* input operands */ + return a; +} +#elif defined(__sparc__) || defined(__sparc) || defined(__sparcv9) +static inline uint32_t add32_with_carry (uint32_t a, uint32_t b) +{ + asm("addcc %2, %0, %0 \n\t" + "addx %0, %%g0, %0" + : "=r" (a) /* output operands */ + : "0" (a), "r" (b) /* input operands */ + : "cc"); /* list of clobbered registers */ + return a; +} +#else +static inline uint32_t add32_with_carry (uint32_t a, uint32_t b) +{ + a += b; + a = (a >> 16) + (a & 0xffff); + return a; +} +#endif + +# define pgm_csum_partial pgm_compat_csum_partial +# define pgm_csum_partial_copy pgm_compat_csum_partial_copy + +PGM_END_DECLS + +#endif /* __PGM_IMPL_CHECKSUM_H__ */ + |