dph-lifted-copy-0.6.0.1: Data/Array/Parallel/Prelude/Bool.hs
{-# OPTIONS_GHC -fvectorise #-}
module Data.Array.Parallel.Prelude.Bool
( Bool(..)
, otherwise, (&&), (||), not, andP, orP
, fromBool, toBool
)
where
import Data.Array.Parallel.Prim () -- dependency required by the vectoriser
import Data.Array.Parallel.Prelude.Base
import Data.Array.Parallel.Lifted.Closure
import Data.Array.Parallel.PArray.PReprInstances
import Data.Array.Parallel.Lifted.Scalar
import qualified Data.Array.Parallel.Unlifted as U
import Data.Bits
-- We re-export 'Prelude.otherwise' as is as it is special-cased in the Desugarer
{-# VECTORISE (&&) = (&&*) #-}
(&&*) :: Bool :-> Bool :-> Bool
{-# INLINE (&&*) #-}
(&&*) = closure2 (&&) and_l
{-# NOVECTORISE (&&*) #-}
and_l :: PArray Bool -> PArray Bool -> PArray Bool
{-# INLINE and_l #-}
and_l (PArray n# bs) (PArray _ cs)
= PArray n# $
case bs of { PBool sel1 ->
case cs of { PBool sel2 ->
PBool $ U.tagsToSel2 (U.zipWith (.&.) (U.tagsSel2 sel1) (U.tagsSel2 sel2)) }}
{-# NOVECTORISE and_l #-}
{-# VECTORISE (||) = (||*) #-}
(||*) :: Bool :-> Bool :-> Bool
{-# INLINE (||*) #-}
(||*) = closure2 (||) or_l
{-# NOVECTORISE (||*) #-}
or_l :: PArray Bool -> PArray Bool -> PArray Bool
{-# INLINE or_l #-}
or_l (PArray n# bs) (PArray _ cs)
= PArray n# $
case bs of { PBool sel1 ->
case cs of { PBool sel2 ->
PBool $ U.tagsToSel2 (U.zipWith (.|.) (U.tagsSel2 sel1) (U.tagsSel2 sel2)) }}
{-# NOVECTORISE or_l #-}
{-# VECTORISE not = not_v #-}
not_v :: Bool :-> Bool
{-# INLINE not_v #-}
not_v = closure1 not not_l
{-# NOVECTORISE not_v #-}
not_l :: PArray Bool -> PArray Bool
{-# INLINE not_l #-}
not_l (PArray n# bs)
= PArray n# $
case bs of { PBool sel ->
PBool $ U.tagsToSel2 (U.map complement (U.tagsSel2 sel)) }
{-# NOVECTORISE not_l #-}
andP:: PArr Bool -> Bool
{-# NOINLINE andP #-}
andP _ = True
{-# VECTORISE andP = andP_v #-}
andP_v :: PArray Bool :-> Bool
{-# INLINE andP_v #-}
andP_v = closure1 (scalar_fold (&&) True) (scalar_folds (&&) True)
{-# NOVECTORISE andP_v #-}
orP:: PArr Bool -> Bool
{-# NOINLINE orP #-}
orP _ = True
{-# VECTORISE orP = orP_v #-}
orP_v :: PArray Bool :-> Bool
{-# INLINE orP_v #-}
orP_v = closure1 (scalar_fold (||) False) (scalar_folds (||) False)
{-# NOVECTORISE orP_v #-}
fromBool :: Bool -> Int
fromBool False = 0
fromBool True = 1
{-# VECTORISE SCALAR fromBool #-}
toBool :: Int -> Bool
toBool 0 = False
toBool _ = True
{-# VECTORISE SCALAR toBool #-}