/* -*-c-*-
*
- * $Id: bits.h,v 1.1 1999/06/01 09:46:19 mdw Exp $
+ * $Id: bits.h,v 1.2 1999/06/17 00:12:46 mdw Exp $
*
* Portable bit-level manipulation macros
*
/*----- Revision history --------------------------------------------------*
*
* $Log: bits.h,v $
+ * 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.
*
/* --- Safe shifting macros --- */
-#define LSL8(v, s) (U8(v) << ((s) & 7u))
-#define LSR8(v, s) (U8(v) >> ((s) & 7u))
-#define LSL16(v, s) (U16(v) << ((s) & 15u))
-#define LSR16(v, s) (U16(v) >> ((s) & 15u))
-#define LSL32(v, s) (U32(v) << ((s) & 31u))
-#define LSR32(v, s) (U32(v) >> ((s) & 31u))
+#define LSL8(v, s) U8(U8(v) << ((s) & 7u))
+#define LSR8(v, s) U8(U8(v) >> ((s) & 7u))
+#define LSL16(v, s) U16(U16(v) << ((s) & 15u))
+#define LSR16(v, s) U16(U16(v) >> ((s) & 15u))
+#define LSL32(v, s) U32(U32(v) << ((s) & 31u))
+#define LSR32(v, s) U32(U32(v) >> ((s) & 31u))
/* --- Rotation macros --- */
-#define ROL8(v, s) (LSL8((v), (s)) | (LSR8((v), 8 - (s))))
-#define ROR8(v, s) (LSR8((v), (s)) | (LSL8((v), 8 - (s))))
-#define ROL16(v, s) (LSL16((v), (s)) | (LSR16((v), 16 - (s))))
-#define ROR16(v, s) (LSR16((v), (s)) | (LSL16((v), 16 - (s))))
-#define ROL32(v, s) (LSL32((v), (s)) | (LSR32((v), 32 - (s))))
-#define ROR32(v, s) (LSR32((v), (s)) | (LSL32((v), 32 - (s))))
+#define ROL8(v, s) (LSL8((v), (s)) | (LSR8((v), 8u - (s))))
+#define ROR8(v, s) (LSR8((v), (s)) | (LSL8((v), 8u - (s))))
+#define ROL16(v, s) (LSL16((v), (s)) | (LSR16((v), 16u - (s))))
+#define ROR16(v, s) (LSR16((v), (s)) | (LSL16((v), 16u - (s))))
+#define ROL32(v, s) (LSL32((v), (s)) | (LSR32((v), 32u - (s))))
+#define ROR32(v, s) (LSR32((v), (s)) | (LSL32((v), 32u - (s))))
/* --- Storage and retrieval --- */