hw-simd-0.1.1.0: src/HaskellWorks/Data/Simd/Comparison/Stock.hs
{-# LANGUAGE FlexibleInstances #-}
module HaskellWorks.Data.Simd.Comparison.Stock
( CmpEqWord8s(..)
) where
import Data.Word
import HaskellWorks.Data.AtIndex
import HaskellWorks.Data.Bits.BitWise
import HaskellWorks.Data.Simd.Internal.Bits
import HaskellWorks.Data.Simd.Internal.Broadword
import qualified Data.ByteString as BS
import qualified Data.Vector.Storable as DVS
import qualified HaskellWorks.Data.ByteString as BS
import qualified HaskellWorks.Data.Simd.ChunkString as CS
import qualified HaskellWorks.Data.Vector.AsVector8 as V
class CmpEqWord8s a where
cmpEqWord8s :: Word8 -> a -> a
instance CmpEqWord8s (DVS.Vector Word8) where
cmpEqWord8s w8 v = DVS.unsafeCast (cmpEqWord8s w8 (DVS.unsafeCast v :: DVS.Vector Word64))
instance CmpEqWord8s (DVS.Vector Word64) where
cmpEqWord8s w8 v = DVS.constructN ((DVS.length v + 7) `div` 8) go
where iw = fillWord64 w8
go :: DVS.Vector Word64 -> Word64
go u = let ui = end u in
if ui * 8 + 8 < end v
then let vi = ui * 8
w0 = testWord8s ((v !!! (vi + 0)) .^. iw)
w1 = testWord8s ((v !!! (vi + 1)) .^. iw)
w2 = testWord8s ((v !!! (vi + 2)) .^. iw)
w3 = testWord8s ((v !!! (vi + 3)) .^. iw)
w4 = testWord8s ((v !!! (vi + 4)) .^. iw)
w5 = testWord8s ((v !!! (vi + 5)) .^. iw)
w6 = testWord8s ((v !!! (vi + 6)) .^. iw)
w7 = testWord8s ((v !!! (vi + 7)) .^. iw)
w = (w7 .<. 56) .|.
(w6 .<. 48) .|.
(w5 .<. 40) .|.
(w4 .<. 32) .|.
(w3 .<. 24) .|.
(w2 .<. 16) .|.
(w1 .<. 8) .|.
w0
in comp w
else let vi = ui * 8
w0 = testWord8s (atIndexOr 0 v (vi + 0) .^. iw)
w1 = testWord8s (atIndexOr 0 v (vi + 1) .^. iw)
w2 = testWord8s (atIndexOr 0 v (vi + 2) .^. iw)
w3 = testWord8s (atIndexOr 0 v (vi + 3) .^. iw)
w4 = testWord8s (atIndexOr 0 v (vi + 4) .^. iw)
w5 = testWord8s (atIndexOr 0 v (vi + 5) .^. iw)
w6 = testWord8s (atIndexOr 0 v (vi + 6) .^. iw)
w7 = testWord8s (atIndexOr 0 v (vi + 7) .^. iw)
w = (w7 .<. 56) .|.
(w6 .<. 48) .|.
(w5 .<. 40) .|.
(w4 .<. 32) .|.
(w3 .<. 24) .|.
(w2 .<. 16) .|.
(w1 .<. 8) .|.
w0
in comp w
{-# INLINE cmpEqWord8s #-}
instance CmpEqWord8s [DVS.Vector Word64] where
cmpEqWord8s w8 vs = cmpEqWord8s w8 <$> vs
{-# INLINE cmpEqWord8s #-}
instance CmpEqWord8s [DVS.Vector Word8] where
cmpEqWord8s w8 vs = cmpEqWord8s w8 <$> vs
{-# INLINE cmpEqWord8s #-}
instance CmpEqWord8s [BS.ByteString] where
cmpEqWord8s w8 vs = BS.toByteString . cmpEqWord8s w8 . V.asVector8 <$> vs
{-# INLINE cmpEqWord8s #-}
instance CmpEqWord8s CS.ChunkString where
cmpEqWord8s w8 = CS.toChunkString . cmpEqWord8s w8 . BS.toByteStrings
{-# INLINE cmpEqWord8s #-}