X-Git-Url: https://git.distorted.org.uk/~mdw/mLib/blobdiff_plain/1f175471c5d648e14460270ee3fc74cb86c9897e..17119f584e90f494da54aa9e2d1d10227213d96b:/bits.h diff --git a/bits.h b/bits.h index 3a7343c..4618589 100644 --- a/bits.h +++ b/bits.h @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: bits.h,v 1.8 2000/10/08 11:06:30 mdw Exp $ + * $Id$ * * Portable bit-level manipulation macros * @@ -27,35 +27,6 @@ * MA 02111-1307, USA. */ -/*----- Revision history --------------------------------------------------* - * - * $Log: bits.h,v $ - * Revision 1.8 2000/10/08 11:06:30 mdw - * Shut later versions of GCC up about use of @long long@. - * - * Revision 1.7 2000/07/22 09:48:26 mdw - * Added macros for reading 64-bit values. - * - * Revision 1.6 2000/07/16 12:28:28 mdw - * Add 64-bit support, with faked arithmetic on 32-bit hosts. - * - * Revision 1.5 2000/06/17 10:36:06 mdw - * Support for 24-bit types. - * - * Revision 1.4 1999/12/10 23:42:04 mdw - * Change header file guard names. - * - * Revision 1.3 1999/06/20 23:31:52 mdw - * More portability enhancements. - * - * Revision 1.2 1999/06/17 00:12:46 mdw - * Improve portability for shift and rotate macros. - * - * Revision 1.1 1999/06/01 09:46:19 mdw - * New addition: bit manipulation macros. - * - */ - #ifndef MLIB_BITS_H #define MLIB_BITS_H @@ -246,12 +217,15 @@ typedef unsigned char octet; unsigned _s = (s) & 63u; \ uint32 _l = (v).lo, _h = (v).hi; \ kludge64 *_d = &(d); \ - if (_s >= 32) { \ + if (_s > 32) { \ _d->hi = LSL32(_l, _s - 32u) | LSR32(_h, 64u - _s); \ _d->lo = LSL32(_h, _s - 32u) | LSR32(_l, 64u - _s); \ } else if (!_s) { \ _d->lo = _l; \ _d->hi = _h; \ + } else if (_s == 32) { \ + _d->lo = _h; \ + _d->hi = _l; \ } else { \ _d->hi = LSL32(_h, _s) | LSR32(_l, 32u - _s); \ _d->lo = LSL32(_l, _s) | LSR32(_h, 32u - _s); \ @@ -261,12 +235,15 @@ typedef unsigned char octet; unsigned _s = (s) & 63u; \ uint32 _l = (v).lo, _h = (v).hi; \ kludge64 *_d = &(d); \ - if (_s >= 32) { \ + if (_s > 32) { \ _d->hi = LSR32(_l, _s - 32u) | LSL32(_h, 64u - _s); \ _d->lo = LSR32(_h, _s - 32u) | LSL32(_l, 64u - _s); \ } else if (!_s) { \ _d->lo = _l; \ _d->hi = _h; \ + } else if (_s == 32) { \ + _d->lo = _h; \ + _d->hi = _l; \ } else { \ _d->hi = LSR32(_h, _s) | LSL32(_l, 32u - _s); \ _d->lo = LSR32(_l, _s) | LSL32(_h, 32u - _s); \ @@ -456,6 +433,14 @@ typedef unsigned char octet; # define ZERO64(x) ((x).lo == 0 && (x).hi == 0) #endif +/* --- Storing integers in tables --- */ + +#ifdef HAVE_UINT64 +# define X64(x, y) { 0x##x##y } +#else +# define X64(x, y) { 0x##x, 0x##y } +#endif + /*----- That's all, folks -------------------------------------------------*/ #ifdef __cplusplus