X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=cfg%2Fmacros.h;h=45f0a1edfa91ba8b644d2ce34b7eb826ad6a4b33;hb=5f3952176a4e9a00ca8dd5ec4a6b994958f89e0a;hp=17ee7887759914cca7814d090cfff253e2998fbd;hpb=bcf38f772b397e7a8ba781a69aacb9380e54b32a;p=bertos.git diff --git a/cfg/macros.h b/cfg/macros.h old mode 100755 new mode 100644 index 17ee7887..45f0a1ed --- a/cfg/macros.h +++ b/cfg/macros.h @@ -14,6 +14,12 @@ /*#* *#* $Log$ + *#* Revision 1.11 2007/02/06 15:22:12 asterix + *#* Add ROTL and ROTR macros for bit rotating. + *#* + *#* Revision 1.10 2006/09/13 18:31:37 bernie + *#* BV8(), BV16(), BV32(): New macros for CPUs with small word size; SWAP_T(): New macro to support old compilers. + *#* *#* Revision 1.9 2006/07/19 12:56:25 bernie *#* Convert to new Doxygen style. *#* @@ -158,11 +164,38 @@ #endif /* COMPILER_TYPEOF */ +/** + * Macro to swap \a a with \a b, with explicit type \a T for dumb C89 compilers. + * + * \note Arguments are evaluated multiple times. + */ +#define SWAP_T(a, b, T) \ + do { \ + T tmp; \ + ASSERT_TYPE_IS(a, T); \ + ASSERT_TYPE_IS(b, T); \ + tmp = (a); \ + (a) = (b); \ + (b) = tmp; \ + } while (0) + + #ifndef BV /** Convert a bit value to a binary flag. */ #define BV(x) (1<<(x)) #endif +/** Same as BV() but with 32 bit result */ +#define BV32(x) ((uint32_t)1<<(x)) + +/** Same as BV() but with 16 bit result */ +#define BV16(x) ((uint16_t)1<<(x)) + +/** Same as BV() but with 8 bit result */ +#define BV8(x) ((uint8_t)1<<(x)) + + + /** Round up \a x to an even multiple of the 2's power \a pad. */ #define ROUND_UP2(x, pad) (((x) + ((pad) - 1)) & ~((pad) - 1)) @@ -309,5 +342,13 @@ #endif /* COMPILER_VARIADIC_MACROS */ +/** + * Macro for rotating bit left or right. + * \{ + */ +#define ROTR(var, rot) (((var) >> (rot)) | ((var) << ((sizeof(var) * 8) - (rot)))) +#define ROTL(var, rot) (((var) << (rot)) | ((var) >> ((sizeof(var) * 8) - (rot)))) +/*\}*/ + #endif /* MACROS_H */