diff options
author | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-28 12:54:53 +0000 |
---|---|---|
committer | j_mayer <j_mayer@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-10-28 12:54:53 +0000 |
commit | 603fcccece43303c623df2561f85ab2baba95e5f (patch) | |
tree | a0899a3380000364faffe79d80844542fd24a17c /target-ppc/op_helper.h | |
parent | b9ef45ffa8df1b63b8d126910f62541fa355155e (diff) | |
download | qemu-603fcccece43303c623df2561f85ab2baba95e5f.zip |
Make Alpha and PowerPC targets use shared helpers
for clz, clo, ctz, cto and ctpop.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3466 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-ppc/op_helper.h')
-rw-r--r-- | target-ppc/op_helper.h | 76 |
1 files changed, 4 insertions, 72 deletions
diff --git a/target-ppc/op_helper.h b/target-ppc/op_helper.h index 6597b3ca58..915b32a28e 100644 --- a/target-ppc/op_helper.h +++ b/target-ppc/op_helper.h @@ -75,6 +75,10 @@ void do_nego (void); void do_subfe (void); void do_subfmeo (void); void do_subfzeo (void); +void do_cntlzw (void); +#if defined(TARGET_PPC64) +void do_cntlzd (void); +#endif void do_sraw (void); #if defined(TARGET_PPC64) void do_adde_64 (void); @@ -285,78 +289,6 @@ void do_evfsctsiz (void); void do_evfsctuiz (void); #endif /* defined(TARGET_PPCEMB) */ -/* Inlined helpers: used in micro-operation as well as helpers */ -/* Generic fixed-point helpers */ -static always_inline int _do_cntlzw (uint32_t val) -{ - int cnt = 0; - if (!(val & 0xFFFF0000UL)) { - cnt += 16; - val <<= 16; - } - if (!(val & 0xFF000000UL)) { - cnt += 8; - val <<= 8; - } - if (!(val & 0xF0000000UL)) { - cnt += 4; - val <<= 4; - } - if (!(val & 0xC0000000UL)) { - cnt += 2; - val <<= 2; - } - if (!(val & 0x80000000UL)) { - cnt++; - val <<= 1; - } - if (!(val & 0x80000000UL)) { - cnt++; - } - return cnt; -} - -static always_inline int _do_cntlzd (uint64_t val) -{ - int cnt = 0; -#if HOST_LONG_BITS == 64 - if (!(val & 0xFFFFFFFF00000000ULL)) { - cnt += 32; - val <<= 32; - } - if (!(val & 0xFFFF000000000000ULL)) { - cnt += 16; - val <<= 16; - } - if (!(val & 0xFF00000000000000ULL)) { - cnt += 8; - val <<= 8; - } - if (!(val & 0xF000000000000000ULL)) { - cnt += 4; - val <<= 4; - } - if (!(val & 0xC000000000000000ULL)) { - cnt += 2; - val <<= 2; - } - if (!(val & 0x8000000000000000ULL)) { - cnt++; - val <<= 1; - } - if (!(val & 0x8000000000000000ULL)) { - cnt++; - } -#else - /* Make it easier on 32 bits host machines */ - if (!(val >> 32)) - cnt = _do_cntlzw(val) + 32; - else - cnt = _do_cntlzw(val >> 32); -#endif - return cnt; -} - #if defined(TARGET_PPCEMB) /* SPE extension */ /* Single precision floating-point helpers */ |