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 #-}