static ut64 mask64(ut64 mb, ut64 me) { int i; ut64 mask = 0; if (mb > 63 || me > 63) { return mask; } if (mb < (me + 1)) { for (i = mb; i <= me; i++) { mask = mask | (ut64) (1LL << (63 - i)); } } else if (mb == (me + 1)) { mask = 0xffffffffffffffffull; } else if (mb > (me + 1)) { ut64 lo = mask64 (0, me); ut64 hi = mask64 (mb, 63); mask = lo | hi; } return mask; }
static const char* inv_mask64(const char *mb_c, const char *sh) { static char cmask[32]; ut64 mb = 0; ut64 me = 0; if (mb_c) mb = atol (mb_c); if (sh) { me = atol (sh); } snprintf (cmask, sizeof (cmask), "0x%"PFMT64x"", mask64 (mb, ~me)); return cmask; }
static const char* cmask64(const char *mb_c, const char *me_c) { static char cmask[32]; ut64 mb = 0; ut64 me = 0; if (mb_c) { mb = strtol (mb_c, NULL, 16); } if (me_c) { me = strtol (me_c, NULL, 16); } snprintf (cmask, sizeof (cmask), "0x%"PFMT64x"", mask64 (mb, me)); return cmask; }
// pick bits [hi,...,lo] from val static inline u_int64_t pick64(u_int64_t val, int hi = 31, int lo = 0) { return (val & mask64(hi, lo)); }