diff options
author | Richard Henderson <rth@twiddle.net> | 2013-01-23 18:09:43 -0800 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2013-02-18 15:52:32 -0800 |
commit | 0592f74a75ab695efd48a151219667adc0fa7cc4 (patch) | |
tree | d6997522a82b9277e269005cd4fa1f97fbe65b35 /target-i386/int_helper.c | |
parent | 5f1f4b177152286102475f9bffc359002a14d9c9 (diff) |
target-i386: Implement PDEP, PEXT
Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'target-i386/int_helper.c')
-rw-r--r-- | target-i386/int_helper.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/target-i386/int_helper.c b/target-i386/int_helper.c index 4ec8cb78d2..527af40281 100644 --- a/target-i386/int_helper.c +++ b/target-i386/int_helper.c @@ -488,6 +488,38 @@ target_ulong helper_bsr(target_ulong t0) return helper_lzcnt(t0, 0); } +#if TARGET_LONG_BITS == 32 +# define ctztl ctz32 +#else +# define ctztl ctz64 +#endif + +target_ulong helper_pdep(target_ulong src, target_ulong mask) +{ + target_ulong dest = 0; + int i, o; + + for (i = 0; mask != 0; i++) { + o = ctztl(mask); + mask &= mask - 1; + dest |= ((src >> i) & 1) << o; + } + return dest; +} + +target_ulong helper_pext(target_ulong src, target_ulong mask) +{ + target_ulong dest = 0; + int i, o; + + for (o = 0; mask != 0; o++) { + i = ctztl(mask); + mask &= mask - 1; + dest |= ((src >> i) & 1) << o; + } + return dest; +} + #define SHIFT 0 #include "shift_helper_template.h" #undef SHIFT |