|
|
|
@ -45,10 +45,15 @@ |
|
|
|
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. |
|
|
|
|
|
|
|
@ -77,6 +82,13 @@ |
|
|
|
#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)) |
|
|
|
@ -104,6 +116,14 @@ |
|
|
|
#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)) \ |
|
|
|
@ -149,6 +169,12 @@ INLINE_BITS\ |
|
|
|
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) \ |
|
|
|
@ -165,6 +191,11 @@ INLINE_BITS\ |
|
|
|
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 */ |
|
|
|
|