aboutsummaryrefslogtreecommitdiff
path: root/target-i386/int_helper.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2013-01-23 18:09:43 -0800
committerRichard Henderson <rth@twiddle.net>2013-02-18 15:52:32 -0800
commit0592f74a75ab695efd48a151219667adc0fa7cc4 (patch)
treed6997522a82b9277e269005cd4fa1f97fbe65b35 /target-i386/int_helper.c
parent5f1f4b177152286102475f9bffc359002a14d9c9 (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.c32
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