module HaskellWorks.Data.Simd.Internal.Broadword where import Data.Bits.Pdep import Data.Word import HaskellWorks.Data.Bits.BitWise class FillWord64 a where fillWord64 :: a -> Word64 instance FillWord64 Word8 where fillWord64 :: Word8 -> Word64 fillWord64 Word8 w = Word64 0x0101010101010101 Word64 -> Word64 -> Word64 forall a. Num a => a -> a -> a * Word8 -> Word64 forall a b. (Integral a, Num b) => a -> b fromIntegral Word8 w {-# INLINE fillWord64 #-} toggle64 :: Word64 -> Word64 -> Word64 toggle64 :: Word64 -> Word64 -> Word64 toggle64 Word64 carry Word64 w = let c :: Word64 c = Word64 carry Word64 -> Word64 -> Word64 forall a. BitWise a => a -> a -> a .&. Word64 0x1 in let addend :: Word64 addend = Word64 -> Word64 -> Word64 forall a. Pdep a => a -> a -> a pdep (Word64 0x5555555555555555 Word64 -> Word64 -> Word64 forall a. Shift a => a -> Word64 -> a .<. Word64 c) Word64 w in ((Word64 addend Word64 -> Word64 -> Word64 forall a. Shift a => a -> Word64 -> a .<. Word64 1) Word64 -> Word64 -> Word64 forall a. BitWise a => a -> a -> a .|. Word64 c) Word64 -> Word64 -> Word64 forall a. Num a => a -> a -> a + Word64 -> Word64 forall a. BitWise a => a -> a comp Word64 w {-# INLINE toggle64 #-}