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