{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE MultiWayIf #-} module HaskellWorks.Data.Simd.Comparison ( CmpEqWord8s(..) ) where import Data.Word import HaskellWorks.Data.Simd.Capabilities import qualified Data.Vector.Storable as DVS import qualified HaskellWorks.Data.Simd.Comparison.Avx2 as AVX2 import qualified HaskellWorks.Data.Simd.Comparison.Stock as STOCK class CmpEqWord8s a where cmpEqWord8s :: Word8 -> a -> a instance CmpEqWord8s (DVS.Vector Word64) where cmpEqWord8s :: Word8 -> Vector Word64 -> Vector Word64 cmpEqWord8s Word8 w Vector Word64 bs = if | Bool avx2Enabled -> Word8 -> Vector Word64 -> Target (Vector Word64) forall a. CmpEqWord8s a => Word8 -> a -> Target a AVX2.cmpEqWord8s Word8 w Vector Word64 bs | Bool True -> Word8 -> Vector Word64 -> Vector Word64 forall a. CmpEqWord8s a => Word8 -> a -> a STOCK.cmpEqWord8s Word8 w Vector Word64 bs {-# INLINE cmpEqWord8s #-} instance CmpEqWord8s (DVS.Vector Word8) where cmpEqWord8s :: Word8 -> Vector Word8 -> Vector Word8 cmpEqWord8s Word8 w Vector Word8 bs = if | Bool avx2Enabled -> Word8 -> Vector Word8 -> Target (Vector Word8) forall a. CmpEqWord8s a => Word8 -> a -> Target a AVX2.cmpEqWord8s Word8 w Vector Word8 bs | Bool True -> Word8 -> Vector Word8 -> Vector Word8 forall a. CmpEqWord8s a => Word8 -> a -> a STOCK.cmpEqWord8s Word8 w Vector Word8 bs {-# INLINE cmpEqWord8s #-} instance CmpEqWord8s [DVS.Vector Word64] where cmpEqWord8s :: Word8 -> [Vector Word64] -> [Vector Word64] cmpEqWord8s Word8 w [Vector Word64] bs = if | Bool avx2Enabled -> Word8 -> [Vector Word64] -> Target [Vector Word64] forall a. CmpEqWord8s a => Word8 -> a -> Target a AVX2.cmpEqWord8s Word8 w [Vector Word64] bs | Bool True -> Word8 -> [Vector Word64] -> [Vector Word64] forall a. CmpEqWord8s a => Word8 -> a -> a STOCK.cmpEqWord8s Word8 w [Vector Word64] bs {-# INLINE cmpEqWord8s #-} instance CmpEqWord8s [DVS.Vector Word8] where cmpEqWord8s :: Word8 -> [Vector Word8] -> [Vector Word8] cmpEqWord8s Word8 w [Vector Word8] bs = if | Bool avx2Enabled -> Word8 -> [Vector Word8] -> Target [Vector Word8] forall a. CmpEqWord8s a => Word8 -> a -> Target a AVX2.cmpEqWord8s Word8 w [Vector Word8] bs | Bool True -> Word8 -> [Vector Word8] -> [Vector Word8] forall a. CmpEqWord8s a => Word8 -> a -> a STOCK.cmpEqWord8s Word8 w [Vector Word8] bs {-# INLINE cmpEqWord8s #-}