hw-simd-0.1.0.0: test/HaskellWorks/Data/Simd/LogicalSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module HaskellWorks.Data.Simd.LogicalSpec (spec) where
import Control.Monad
import HaskellWorks.Data.Simd.Capabilities
import HaskellWorks.Hspec.Hedgehog
import Hedgehog
import Test.Hspec
import qualified HaskellWorks.Data.Simd.Logical.Avx2 as AVX
import qualified HaskellWorks.Data.Simd.Logical.Stock as STK
import qualified HaskellWorks.Hedgehog.Gen as G
import qualified Hedgehog.Gen as G
import qualified Hedgehog.Range as R
{-# ANN module ("HLint: ignore Redundant do" :: String) #-}
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}
{-# ANN module ("HLint: redundant bracket" :: String) #-}
spec :: Spec
spec = describe "HaskellWorks.Data.Simd.LogicalSpec" $ do
when avx2Enabled $ do
describe "xorBits" $ do
it "AVX2" $ requireProperty $ do
w <- forAll $ G.word8 R.constantBounded
(us, vs) <- forAll $ do
listLength <- G.int (R.linear 0 5)
blockCount <- G.int (R.linear 0 4)
blockSize <- G.int (R.singleton 8)
G.tuple2
$ G.list (R.singleton listLength)
$ G.storableVector (R.singleton (blockCount * blockSize))
$ G.word8x8 (G.choice [pure w, G.word8 R.constantBounded])
AVX.xorBits us vs === STK.xorBits us vs
describe "orBits" $ do
it "AVX2" $ requireProperty $ do
w <- forAll $ G.word8 R.constantBounded
(us, vs) <- forAll $ do
listLength <- G.int (R.linear 0 5)
blockCount <- G.int (R.linear 0 4)
blockSize <- G.int (R.singleton 8)
G.tuple2
$ G.list (R.singleton listLength)
$ G.storableVector (R.singleton (blockCount * blockSize))
$ G.word8x8 (G.choice [pure w, G.word8 R.constantBounded])
AVX.orBits us vs === STK.orBits us vs
describe "andBits" $ do
it "AVX2" $ requireProperty $ do
w <- forAll $ G.word8 R.constantBounded
(us, vs) <- forAll $ do
listLength <- G.int (R.linear 0 5)
blockCount <- G.int (R.linear 0 4)
blockSize <- G.int (R.singleton 8)
G.tuple2
$ G.list (R.singleton listLength)
$ G.storableVector (R.singleton (blockCount * blockSize))
$ G.word8x8 (G.choice [pure w, G.word8 R.constantBounded])
AVX.andBits us vs === STK.andBits us vs
describe "andNotBits" $ do
it "AVX2" $ requireProperty $ do
w <- forAll $ G.word8 R.constantBounded
(us, vs) <- forAll $ do
listLength <- G.int (R.linear 0 5)
blockCount <- G.int (R.linear 0 4)
blockSize <- G.int (R.singleton 8)
G.tuple2
$ G.list (R.singleton listLength)
$ G.storableVector (R.singleton (blockCount * blockSize))
$ G.word8x8 (G.choice [pure w, G.word8 R.constantBounded])
AVX.andNotBits us vs === STK.andNotBits us vs
describe "notBits" $ do
it "AVX2" $ requireProperty $ do
w <- forAll $ G.word8 R.constantBounded
vs <- forAll $ do
listLength <- G.int (R.linear 0 5)
blockCount <- G.int (R.linear 0 4)
blockSize <- G.int (R.singleton 8)
G.list (R.singleton listLength)
$ G.storableVector (R.singleton (blockCount * blockSize))
$ G.word8x8 (G.choice [pure w, G.word8 R.constantBounded])
AVX.notBits vs === STK.notBits vs