summaryrefslogtreecommitdiff
path: root/target-i386/int_helper.c
diff options
context:
space:
mode:
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