{-# OPTIONS_HADDOCK prune #-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnliftedNewtypes #-}
{-# LANGUAGE UnboxedTuples #-}
{-# LANGUAGE ViewPatterns #-}
module Data.Choice (
Choice
, decide
, true#
, false#
, to_word#
, from_full_mask#
, from_bit#
, from_word_nonzero#
, from_word_eq#
, from_word_le#
, from_word_lt#
, from_word_gt#
, or
, and
, xor
, not
, ne
, eq
, select_word#
, select_wide#
, select_wider#
, eq_word#
, eq_wide#
, eq_wider#
) where
import qualified Data.Bits as B
import GHC.Exts (Word#, Int(..), Word(..))
import qualified GHC.Exts as Exts
import Prelude hiding (and, not, or)
type Limb2 = (# Word#, Word# #)
type Limb4 = (# Word#, Word#, Word#, Word# #)
neg_w# :: Word# -> Word#
neg_w# :: Word# -> Word#
neg_w# Word#
w = Word# -> Word# -> Word#
Exts.plusWord# (Word# -> Word#
Exts.not# Word#
w) Word#
1##
{-# INLINE neg_w# #-}
hi# :: Word# -> Limb2
hi# :: Word# -> Limb2
hi# Word#
w = (# Word#
0##, Word#
w #)
{-# INLINE hi# #-}
lo# :: Word# -> Limb2
lo# :: Word# -> Limb2
lo# Word#
w = (# Word#
w, Word#
0## #)
{-# INLINE lo# #-}
or_w# :: Limb2 -> Limb2 -> Limb2
or_w# :: Limb2 -> Limb2 -> Limb2
or_w# (# Word#
a0, Word#
a1 #) (# Word#
b0, Word#
b1 #) = (# Word# -> Word# -> Word#
Exts.or# Word#
a0 Word#
b0, Word# -> Word# -> Word#
Exts.or# Word#
a1 Word#
b1 #)
{-# INLINE or_w# #-}
and_w# :: Limb2 -> Limb2 -> Limb2
and_w# :: Limb2 -> Limb2 -> Limb2
and_w# (# Word#
a0, Word#
a1 #) (# Word#
b0, Word#
b1 #) = (# Word# -> Word# -> Word#
Exts.and# Word#
a0 Word#
b0, Word# -> Word# -> Word#
Exts.and# Word#
a1 Word#
b1 #)
{-# INLINE and_w# #-}
xor_w# :: Limb2 -> Limb2 -> Limb2
xor_w# :: Limb2 -> Limb2 -> Limb2
xor_w# (# Word#
a0, Word#
a1 #) (# Word#
b0, Word#
b1 #) = (# Word# -> Word# -> Word#
Exts.xor# Word#
a0 Word#
b0, Word# -> Word# -> Word#
Exts.xor# Word#
a1 Word#
b1 #)
{-# INLINE xor_w# #-}
newtype Choice = Choice Word#
false# :: () -> Choice
false# :: () -> Choice
false# ()
_ = Word# -> Choice
Choice Word#
0##
{-# INLINE false# #-}
true# :: () -> Choice
true# :: () -> Choice
true# ()
_ = case Word
forall a. Bounded a => a
maxBound :: Word of
W# Word#
w -> Word# -> Choice
Choice Word#
w
{-# INLINE true# #-}
decide :: Choice -> Bool
decide :: Choice -> Bool
decide (Choice Word#
c) = Int# -> Bool
Exts.isTrue# (Word# -> Word# -> Int#
Exts.neWord# Word#
c Word#
0##)
{-# INLINE decide #-}
to_word# :: Choice -> Word#
to_word# :: Choice -> Word#
to_word# (Choice Word#
c) = Word# -> Word# -> Word#
Exts.and# Word#
c Word#
1##
{-# INLINE to_word# #-}
from_full_mask# :: Word# -> Choice
from_full_mask# :: Word# -> Choice
from_full_mask# Word#
w = Word# -> Choice
Choice Word#
w
{-# INLINE from_full_mask# #-}
from_bit# :: Word# -> Choice
from_bit# :: Word# -> Choice
from_bit# Word#
w = Word# -> Choice
Choice (Word# -> Word#
neg_w# Word#
w)
{-# INLINE from_bit# #-}
from_word_nonzero# :: Word# -> Choice
from_word_nonzero# :: Word# -> Choice
from_word_nonzero# Word#
w =
let !n :: Word#
n = Word# -> Word#
neg_w# Word#
w
!s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!v :: Word#
v = Word# -> Int# -> Word#
Exts.uncheckedShiftRL# (Word# -> Word# -> Word#
Exts.or# Word#
w Word#
n) Int#
s
in Word# -> Choice
from_bit# Word#
v
{-# INLINE from_word_nonzero# #-}
from_word_eq# :: Word# -> Word# -> Choice
from_word_eq# :: Word# -> Word# -> Choice
from_word_eq# Word#
x Word#
y = case Word# -> Choice
from_word_nonzero# (Word# -> Word# -> Word#
Exts.xor# Word#
x Word#
y) of
Choice Word#
w -> Word# -> Choice
Choice (Word# -> Word#
Exts.not# Word#
w)
{-# INLINE from_word_eq# #-}
from_word_le# :: Word# -> Word# -> Choice
from_word_le# :: Word# -> Word# -> Choice
from_word_le# Word#
x Word#
y =
let !s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!bit :: Word#
bit =
Word# -> Int# -> Word#
Exts.uncheckedShiftRL#
(Word# -> Word# -> Word#
Exts.and#
(Word# -> Word# -> Word#
Exts.or# (Word# -> Word#
Exts.not# Word#
x) Word#
y)
(Word# -> Word# -> Word#
Exts.or# (Word# -> Word# -> Word#
Exts.xor# Word#
x Word#
y) (Word# -> Word#
Exts.not# (Word# -> Word# -> Word#
Exts.minusWord# Word#
y Word#
x))))
Int#
s
in Word# -> Choice
from_bit# Word#
bit
{-# INLINE from_word_le# #-}
from_word_lt# :: Word# -> Word# -> Choice
from_word_lt# :: Word# -> Word# -> Choice
from_word_lt# Word#
x Word#
y =
let !s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!bit :: Word#
bit =
Word# -> Int# -> Word#
Exts.uncheckedShiftRL#
(Word# -> Word# -> Word#
Exts.or#
(Word# -> Word# -> Word#
Exts.and# (Word# -> Word#
Exts.not# Word#
x) Word#
y)
(Word# -> Word# -> Word#
Exts.and# (Word# -> Word# -> Word#
Exts.or# (Word# -> Word#
Exts.not# Word#
x) Word#
y) (Word# -> Word# -> Word#
Exts.minusWord# Word#
x Word#
y)))
Int#
s
in Word# -> Choice
from_bit# Word#
bit
{-# INLINE from_word_lt# #-}
from_word_gt# :: Word# -> Word# -> Choice
from_word_gt# :: Word# -> Word# -> Choice
from_word_gt# Word#
x Word#
y = Word# -> Word# -> Choice
from_word_lt# Word#
y Word#
x
{-# INLINE from_word_gt# #-}
not :: Choice -> Choice
not :: Choice -> Choice
not (Choice Word#
w) = Word# -> Choice
Choice (Word# -> Word#
Exts.not# Word#
w)
{-# INLINE not #-}
or :: Choice -> Choice -> Choice
or :: Choice -> Choice -> Choice
or (Choice Word#
w0) (Choice Word#
w1) = Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.or# Word#
w0 Word#
w1)
{-# INLINE or #-}
and :: Choice -> Choice -> Choice
and :: Choice -> Choice -> Choice
and (Choice Word#
w0) (Choice Word#
w1) = Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.and# Word#
w0 Word#
w1)
{-# INLINE and #-}
xor :: Choice -> Choice -> Choice
xor :: Choice -> Choice -> Choice
xor (Choice Word#
w0) (Choice Word#
w1) = Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.xor# Word#
w0 Word#
w1)
{-# INLINE xor #-}
ne :: Choice -> Choice -> Choice
ne :: Choice -> Choice -> Choice
ne Choice
c0 Choice
c1 = Choice -> Choice -> Choice
xor Choice
c0 Choice
c1
{-# INLINE ne #-}
eq :: Choice -> Choice -> Choice
eq :: Choice -> Choice -> Choice
eq Choice
c0 Choice
c1 = Choice -> Choice
not (Choice -> Choice -> Choice
ne Choice
c0 Choice
c1)
{-# INLINE eq #-}
select_word# :: Word# -> Word# -> Choice -> Word#
select_word# :: Word# -> Word# -> Choice -> Word#
select_word# Word#
a Word#
b (Choice Word#
c) = Word# -> Word# -> Word#
Exts.xor# Word#
a (Word# -> Word# -> Word#
Exts.and# Word#
c (Word# -> Word# -> Word#
Exts.xor# Word#
a Word#
b))
{-# INLINE select_word# #-}
select_wide#
:: Limb2
-> Limb2
-> Choice
-> Limb2
select_wide# :: Limb2 -> Limb2 -> Choice -> Limb2
select_wide# Limb2
a Limb2
b (Choice Word#
w) =
let !mask :: Limb2
mask = Limb2 -> Limb2 -> Limb2
or_w# (Word# -> Limb2
hi# Word#
w) (Word# -> Limb2
lo# Word#
w)
in Limb2 -> Limb2 -> Limb2
xor_w# Limb2
a (Limb2 -> Limb2 -> Limb2
and_w# Limb2
mask (Limb2 -> Limb2 -> Limb2
xor_w# Limb2
a Limb2
b))
{-# INLINE select_wide# #-}
select_wider#
:: Limb4
-> Limb4
-> Choice
-> Limb4
select_wider# :: Limb4 -> Limb4 -> Choice -> Limb4
select_wider# (# Word#
a0, Word#
a1, Word#
a2, Word#
a3 #) (# Word#
b0, Word#
b1, Word#
b2, Word#
b3 #) (Choice Word#
w) =
let !w0 :: Word#
w0 = Word# -> Word# -> Word#
Exts.xor# Word#
a0 (Word# -> Word# -> Word#
Exts.and# Word#
w (Word# -> Word# -> Word#
Exts.xor# Word#
a0 Word#
b0))
!w1 :: Word#
w1 = Word# -> Word# -> Word#
Exts.xor# Word#
a1 (Word# -> Word# -> Word#
Exts.and# Word#
w (Word# -> Word# -> Word#
Exts.xor# Word#
a1 Word#
b1))
!w2 :: Word#
w2 = Word# -> Word# -> Word#
Exts.xor# Word#
a2 (Word# -> Word# -> Word#
Exts.and# Word#
w (Word# -> Word# -> Word#
Exts.xor# Word#
a2 Word#
b2))
!w3 :: Word#
w3 = Word# -> Word# -> Word#
Exts.xor# Word#
a3 (Word# -> Word# -> Word#
Exts.and# Word#
w (Word# -> Word# -> Word#
Exts.xor# Word#
a3 Word#
b3))
in (# Word#
w0, Word#
w1, Word#
w2, Word#
w3 #)
{-# INLINE select_wider# #-}
eq_word# :: Word# -> Word# -> Choice
eq_word# :: Word# -> Word# -> Choice
eq_word# Word#
a Word#
b =
let !s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!x :: Word#
x = Word# -> Word# -> Word#
Exts.xor# Word#
a Word#
b
!y :: Word#
y = Word# -> Int# -> Word#
Exts.uncheckedShiftRL# (Word# -> Word# -> Word#
Exts.or# Word#
x (Word# -> Word#
neg_w# Word#
x)) Int#
s
in Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.xor# Word#
y Word#
1##)
{-# INLINE eq_word# #-}
eq_wide#
:: Limb2
-> Limb2
-> Choice
eq_wide# :: Limb2 -> Limb2 -> Choice
eq_wide# (# Word#
a0, Word#
a1 #) (# Word#
b0, Word#
b1 #) =
let !s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!x :: Word#
x = Word# -> Word# -> Word#
Exts.or# (Word# -> Word# -> Word#
Exts.xor# Word#
a0 Word#
b0) (Word# -> Word# -> Word#
Exts.xor# Word#
a1 Word#
b1)
!y :: Word#
y = Word# -> Int# -> Word#
Exts.uncheckedShiftRL# (Word# -> Word# -> Word#
Exts.or# Word#
x (Word# -> Word#
neg_w# Word#
x)) Int#
s
in Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.xor# Word#
y Word#
1##)
{-# INLINE eq_wide# #-}
eq_wider#
:: Limb4
-> Limb4
-> Choice
eq_wider# :: Limb4 -> Limb4 -> Choice
eq_wider# (# Word#
a0, Word#
a1, Word#
a2, Word#
a3 #) (# Word#
b0, Word#
b1, Word#
b2, Word#
b3 #) =
let !s :: Int#
s = case Word -> Int
forall b. FiniteBits b => b -> Int
B.finiteBitSize (Word
0 :: Word) of I# Int#
m -> Int#
m Int# -> Int# -> Int#
Exts.-# Int#
1#
!x :: Word#
x = Word# -> Word# -> Word#
Exts.or# (Word# -> Word# -> Word#
Exts.or# (Word# -> Word# -> Word#
Exts.xor# Word#
a0 Word#
b0) (Word# -> Word# -> Word#
Exts.xor# Word#
a1 Word#
b1))
(Word# -> Word# -> Word#
Exts.or# (Word# -> Word# -> Word#
Exts.xor# Word#
a2 Word#
b2) (Word# -> Word# -> Word#
Exts.xor# Word#
a3 Word#
b3))
!y :: Word#
y = Word# -> Int# -> Word#
Exts.uncheckedShiftRL# (Word# -> Word# -> Word#
Exts.or# Word#
x (Word# -> Word#
neg_w# Word#
x)) Int#
s
in Word# -> Choice
Choice (Word# -> Word# -> Word#
Exts.xor# Word#
y Word#
1##)
{-# INLINE eq_wider# #-}