hw-simd-0.0.0.2: src/HaskellWorks/Data/Simd/Comparison/Stock.hs
module HaskellWorks.Data.Simd.Comparison.Stock
( cmpeq8s
) where
import Data.Monoid ((<>))
import Data.Word
import HaskellWorks.Data.AtIndex
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Simd.Internal.Bits
import qualified Data.Vector.Storable as DVS
cmpeq8s :: Word8 -> DVS.Vector Word64 -> DVS.Vector Word64
cmpeq8s w8 v = if disalignment == 0
then DVS.constructN (DVS.length v) go
else error $ "Unaligned byte string: " <> show disalignment <> ", vLen: " <> show vLen
where vLen = DVS.length v
disalignment = vLen - (vLen `div` 8) * 8
w64 = fromIntegral w8 * 0x0101010101010101 :: Word64
go :: DVS.Vector Word64 -> Word64
go u = comp w
where ui = fromIntegral $ DVS.length u
w0 = testWord8s ((u !!! (ui + 0)) .^. w64)
w1 = testWord8s ((u !!! (ui + 1)) .^. w64)
w2 = testWord8s ((u !!! (ui + 2)) .^. w64)
w3 = testWord8s ((u !!! (ui + 3)) .^. w64)
w4 = testWord8s ((u !!! (ui + 4)) .^. w64)
w5 = testWord8s ((u !!! (ui + 5)) .^. w64)
w6 = testWord8s ((u !!! (ui + 6)) .^. w64)
w7 = testWord8s ((u !!! (ui + 7)) .^. w64)
w = (w7 .<. 56) .|.
(w6 .<. 48) .|.
(w5 .<. 40) .|.
(w4 .<. 32) .|.
(w3 .<. 24) .|.
(w2 .<. 16) .|.
(w1 .<. 8) .|.
w0
{-# INLINE cmpeq8s #-}