diff options
author | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-28 12:52:38 +0000 |
---|---|---|
committer | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-28 12:52:38 +0000 |
commit | b9ef45ffa8df1b63b8d126910f62541fa355155e (patch) | |
tree | fe933936ed90a7e1a685f583635115de5e5b2d06 /host-utils.h | |
parent | 941db528719cda9ec54e3c5be901e175241141b2 (diff) |
Add shared ctz32, cto32, ctz64, cto64,
ctpop8, ctpop16, ctpop32 and ctpop64 helpers.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3465 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'host-utils.h')
-rw-r--r-- | host-utils.h | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/host-utils.h b/host-utils.h index d1e89c2f3a..fe306f6e48 100644 --- a/host-utils.h +++ b/host-utils.h @@ -102,3 +102,100 @@ static always_inline int clo64(uint64_t val) { return clz64(~val); } + +static always_inline int ctz32 (uint32_t val) +{ + int cnt; + + cnt = 0; + if (!(val & 0x0000FFFFUL)) { + cnt += 16; + val >>= 16; + } + if (!(val & 0x000000FFUL)) { + cnt += 8; + val >>= 8; + } + if (!(val & 0x0000000FUL)) { + cnt += 4; + val >>= 4; + } + if (!(val & 0x00000003UL)) { + cnt += 2; + val >>= 2; + } + if (!(val & 0x00000001UL)) { + cnt++; + val >>= 1; + } + if (!(val & 0x00000001UL)) { + cnt++; + } + + return cnt; + } + +static always_inline int cto32 (uint32_t val) + { + return ctz32(~val); +} + +static always_inline int ctz64 (uint64_t val) +{ + int cnt; + + cnt = 0; + if (!((uint32_t)val)) { + cnt += 32; + val >>= 32; + } + + return cnt + ctz32(val); +} + +static always_inline int cto64 (uint64_t val) +{ + return ctz64(~val); +} + +static always_inline int ctpop8 (uint8_t val) +{ + val = (val & 0x55) + ((val >> 1) & 0x55); + val = (val & 0x33) + ((val >> 2) & 0x33); + val = (val & 0x0f) + ((val >> 4) & 0x0f); + + return val; +} + +static always_inline int ctpop16 (uint16_t val) +{ + val = (val & 0x5555) + ((val >> 1) & 0x5555); + val = (val & 0x3333) + ((val >> 2) & 0x3333); + val = (val & 0x0f0f) + ((val >> 4) & 0x0f0f); + val = (val & 0x00ff) + ((val >> 8) & 0x00ff); + + return val; +} + +static always_inline int ctpop32 (uint32_t val) +{ + val = (val & 0x55555555) + ((val >> 1) & 0x55555555); + val = (val & 0x33333333) + ((val >> 2) & 0x33333333); + val = (val & 0x0f0f0f0f) + ((val >> 4) & 0x0f0f0f0f); + val = (val & 0x00ff00ff) + ((val >> 8) & 0x00ff00ff); + val = (val & 0x0000ffff) + ((val >> 16) & 0x0000ffff); + + return val; +} + +static always_inline int ctpop64 (uint64_t val) +{ + val = (val & 0x5555555555555555ULL) + ((val >> 1) & 0x5555555555555555ULL); + val = (val & 0x3333333333333333ULL) + ((val >> 2) & 0x3333333333333333ULL); + val = (val & 0x0f0f0f0f0f0f0f0fULL) + ((val >> 4) & 0x0f0f0f0f0f0f0f0fULL); + val = (val & 0x00ff00ff00ff00ffULL) + ((val >> 8) & 0x00ff00ff00ff00ffULL); + val = (val & 0x0000ffff0000ffffULL) + ((val >> 16) & 0x0000ffff0000ffffULL); + val = (val & 0x00000000ffffffffULL) + ((val >> 32) & 0x00000000ffffffffULL); + + return val; + } |