diff options
Diffstat (limited to 'libraries/ghc-prim/cbits/pext.c')
-rw-r--r-- | libraries/ghc-prim/cbits/pext.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/libraries/ghc-prim/cbits/pext.c b/libraries/ghc-prim/cbits/pext.c new file mode 100644 index 0000000000..9cddedef1a --- /dev/null +++ b/libraries/ghc-prim/cbits/pext.c @@ -0,0 +1,39 @@ +#include "Rts.h" +#include "MachDeps.h" + +StgWord64 +hs_pext64(StgWord64 src, StgWord64 mask) +{ + uint64_t result = 0; + int offset = 0; + + for (int bit = 0; bit != sizeof(uint64_t) * 8; ++bit) { + const uint64_t src_bit = (src >> bit) & 1; + const uint64_t mask_bit = (mask >> bit) & 1; + + if (mask_bit) { + result |= (uint64_t)(src_bit) << offset; + ++offset; + } + } + + return result; +} + +StgWord +hs_pext32(StgWord src, StgWord mask) +{ + return hs_pext64(src, mask); +} + +StgWord +hs_pext16(StgWord src, StgWord mask) +{ + return hs_pext64(src, mask); +} + +StgWord +hs_pext8(StgWord src, StgWord mask) +{ + return hs_pext64(src, mask); +} |