MASKED*(VALUE, FIRST, LAST): Masks out all but bits [FIRST
.. LAST].
+ LSMASKED*(VALUE, FIRST, LAST): Like MASKED - LS bit is zero.
+
EXTRACTED*(VALUE, FIRST, LAST): Masks out bits [FIRST .. LAST] but
also right shifts the masked value so that bit LAST becomes the
least significant (right most).
+ LSEXTRACTED*(VALUE, FIRST, LAST): Same as extracted - LS bit is
+ zero.
+
SHUFFLED**(VALUE, OLD, NEW): Mask then move a single bit from OLD
new NEW.
#define _MAKE_SHIFT(WIDTH, pos) ((WIDTH) - 1 - (pos))
+#if (WITH_TARGET_WORD_MSB == 0)
+#define _LSB_POS(WIDTH, SHIFT) (WIDTH - 1 - SHIFT)
+#else
+#define _LSB_POS(WIDTH, SHIFT) (SHIFT)
+#endif
+
+
/* MakeBit */
#define _BITn(WIDTH, pos) (((natural##WIDTH)(1)) \
<< _MAKE_SHIFT(WIDTH, pos))
#define MASK32(START, STOP) _MASKn(32, START, STOP)
#define MASK64(START, STOP) _MASKn(64, START, STOP)
+/* Multi-bit mask on least significant bits */
+
+#define _LSMASKn(WIDTH, FIRST, LAST) _MASKn (WIDTH, \
+ _LSB_POS (WIDTH, FIRST), \
+ _LSB_POS (WIDTH, LAST))
+
+#define LSMASK64(FIRST, LAST) _LSMASKn (64, (FIRST), (LAST))
+
#if (WITH_TARGET_WORD_BITSIZE == 64)
#define MASK(START, STOP) \
(((START) <= (STOP)) \
unsigned start,
unsigned stop);
+INLINE_BITS\
+(unsigned64) LSMASKED64
+(unsigned64 word,
+ int first,
+ int last);
+
/* extract the required bits aligning them with the lsb */
#define _EXTRACTEDn(WIDTH, WORD, START, STOP) \
unsigned start,
unsigned stop);
+INLINE_BITS\
+(unsigned64) LSEXTRACTED64
+(unsigned64 val,
+ int start,
+ int stop);
/* move a single bit around */
/* NB: the wierdness (N>O?N-O:0) is to stop a warning from GCC */