{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
{-# OPTIONS_GHC -Wno-missing-signatures #-}
module Data.Chimera.WheelMapping (
fromWheel2,
toWheel2,
fromWheel6,
toWheel6,
fromWheel30,
toWheel30,
fromWheel210,
toWheel210,
) where
import Data.Bits
import Data.Chimera.Compat
import GHC.Exts hiding (timesWord2#)
bits :: Int
bits :: Int
bits = Word -> Int
forall b. FiniteBits b => b -> Int
finiteBitSize (Word
0 :: Word)
toWheel2 :: Word -> Word
toWheel2 :: Word -> Word
toWheel2 Word
i = Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1
{-# INLINE toWheel2 #-}
fromWheel2 :: Word -> Word
fromWheel2 :: Word -> Word
fromWheel2 Word
i = Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1
{-# INLINE fromWheel2 #-}
toWheel6 :: Word -> Word
toWheel6 :: Word -> Word
toWheel6 i :: Word
i@(W# Word#
i#) = case Int
bits of
Int
64 -> Word# -> Word
W# Word#
z1# Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1
Int
_ -> Word
i Word -> Word -> Word
forall a. Integral a => a -> a -> a
`quot` Word
3
where
m# :: Word#
m# = Word#
12297829382473034411##
!(# Word#
z1#, Word#
_ #) = Word# -> Word# -> (# Word#, Word# #)
timesWord2# Word#
m# Word#
i#
{-# INLINE toWheel6 #-}
fromWheel6 :: Word -> Word
fromWheel6 :: Word -> Word
fromWheel6 Word
i = Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
+ (Word
i Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
1) Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
1
{-# INLINE fromWheel6 #-}
toWheel30 :: Word -> Word
toWheel30 :: Word -> Word
toWheel30 i :: Word
i@(W# Word#
i#) = Word
q Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
3 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ (Word
r Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
r Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
4) Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
2
where
(Word
q, Word
r) = case Int
bits of
Int
64 -> (Word
q64, Word
r64)
Int
_ -> Word
i Word -> Word -> (Word, Word)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word
30
m# :: Word#
m# = Word#
9838263505978427529##
!(# Word#
z1#, Word#
_ #) = Word# -> Word# -> (# Word#, Word# #)
timesWord2# Word#
m# Word#
i#
q64 :: Word
q64 = Word# -> Word
W# Word#
z1# Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
4
r64 :: Word
r64 = Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
q64 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
q64 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1
{-# INLINE toWheel30 #-}
fromWheel30 :: Word -> Word
fromWheel30 :: Word -> Word
fromWheel30 Word
i =
((Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
2 Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
2) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.|. Word
1)
Word -> Word -> Word
forall a. Num a => a -> a -> a
+ ((Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
1 Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
i Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
1) Word -> Word -> Word
forall a. Bits a => a -> a -> a
.&. Word
2)
{-# INLINE fromWheel30 #-}
toWheel210 :: Word -> Word
toWheel210 :: Word -> Word
toWheel210 i :: Word
i@(W# Word#
i#) = Word
q Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word
q Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
4 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word# -> Word
W# Word#
tableEl#
where
!(Word
q, W# Word#
r#) = case Int
bits of
Int
64 -> (Word
q64, Word
r64)
Int
_ -> Word
i Word -> Word -> (Word, Word)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word
210
m# :: Word#
m# = Word#
5621864860559101445##
!(# Word#
z1#, Word#
_ #) = Word# -> Word# -> (# Word#, Word# #)
timesWord2# Word#
m# Word#
i#
q64 :: Word
q64 = Word# -> Word
W# Word#
z1# Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
6
r64 :: Word
r64 = Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
q64 Word -> Word -> Word
forall a. Num a => a -> a -> a
* Word
210
tableEl# :: Word#
tableEl# = Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
table# (Word# -> Int#
word2Int# Word#
r#))
table# :: Addr#
table# :: Addr#
table# = Addr#
"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\SOH\SOH\STX\STX\STX\STX\ETX\ETX\EOT\EOT\EOT\EOT\ENQ\ENQ\ENQ\ENQ\ENQ\ENQ\ACK\ACK\a\a\a\a\a\a\b\b\b\b\t\t\n\n\n\n\v\v\v\v\v\v\f\f\f\f\f\f\r\r\SO\SO\SO\SO\SO\SO\SI\SI\SI\SI\DLE\DLE\DC1\DC1\DC1\DC1\DC1\DC1\DC2\DC2\DC2\DC2\DC3\DC3\DC3\DC3\DC3\DC3\DC4\DC4\DC4\DC4\DC4\DC4\DC4\DC4\NAK\NAK\NAK\NAK\SYN\SYN\ETB\ETB\ETB\ETB\CAN\CAN\EM\EM\EM\EM\SUB\SUB\SUB\SUB\SUB\SUB\SUB\SUB\ESC\ESC\ESC\ESC\ESC\ESC\FS\FS\FS\FS\GS\GS\GS\GS\GS\GS\RS\RS\US\US\US\US !!\"\"\"\"\"\"######$$$$%%&&&&''''''(())))))****++,,,,--........../"#
{-# INLINE toWheel210 #-}
fromWheel210 :: Word -> Word
fromWheel210 :: Word -> Word
fromWheel210 i :: Word
i@(W# Word#
i#) = Word
q Word -> Word -> Word
forall a. Num a => a -> a -> a
* Word
210 Word -> Word -> Word
forall a. Num a => a -> a -> a
+ Word# -> Word
W# Word#
tableEl#
where
!(Word
q, W# Word#
r#) = case Int
bits of
Int
64 -> (Word
q64, Word
r64)
Int
_ -> Word
i Word -> Word -> (Word, Word)
forall a. Integral a => a -> a -> (a, a)
`quotRem` Word
48
m# :: Word#
m# = Word#
12297829382473034411##
!(# Word#
z1#, Word#
_ #) = Word# -> Word# -> (# Word#, Word# #)
timesWord2# Word#
m# Word#
i#
q64 :: Word
q64 = Word# -> Word
W# Word#
z1# Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftR` Int
5
r64 :: Word
r64 = Word
i Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
q64 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
5 Word -> Word -> Word
forall a. Num a => a -> a -> a
- Word
q64 Word -> Int -> Word
forall a. Bits a => a -> Int -> a
`shiftL` Int
4
tableEl# :: Word#
tableEl# = Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
table# (Word# -> Int#
word2Int# Word#
r#))
table# :: Addr#
table# :: Addr#
table# = Addr#
"\SOH\v\r\DC1\DC3\ETB\GS\US%)+/5;=CGIOSYaegkmqy\DEL\131\137\139\143\149\151\157\163\167\169\173\179\181\187\191\193\197\199\209"#
{-# INLINE fromWheel210 #-}
#if !MIN_VERSION_base(4,16,0)
word8ToWord# :: Word# -> Word#
word8ToWord# x = x
#endif