{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
module Agda.Utils.Word
(
uncheckedBitWord#
, uncheckedClearBitWord#
, uncheckedSetBitWord#
, uncheckedTestBitWord#
, highestBitWord#
, lowestBitWord#
, disjointWord#
, andNot#
, uncheckedWordOnes#
, wordFoldrBits#
, wordFoldlBits#
, wordFoldrBitsOffset#
, wordFoldlBitsOffset#
, wordFoldrBitsStrict#
, wordFoldlBitsStrict#
, wordFoldrBitsOffsetStrict#
, wordFoldlBitsOffsetStrict#
) where
#include "MachDeps.h"
import GHC.Base
uncheckedBitWord# :: Int# -> Word#
uncheckedBitWord# :: Int# -> Word#
uncheckedBitWord# Int#
i = Word#
1## Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
i
{-# INLINE uncheckedBitWord# #-}
uncheckedClearBitWord# :: Word# -> Int# -> Word#
uncheckedClearBitWord# :: Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i =
Word#
w Word# -> Word# -> Word#
`and#` (Word# -> Word#
not# (Word#
1## Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
i))
{-# INLINE uncheckedClearBitWord# #-}
uncheckedSetBitWord# :: Word# -> Int# -> Word#
uncheckedSetBitWord# :: Word# -> Int# -> Word#
uncheckedSetBitWord# Word#
w Int#
i =
Word#
w Word# -> Word# -> Word#
`or#` (Word#
1## Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
i)
{-# INLINE uncheckedSetBitWord# #-}
uncheckedTestBitWord# :: Word# -> Int# -> Int#
uncheckedTestBitWord# :: Word# -> Int# -> Int#
uncheckedTestBitWord# Word#
w Int#
i =
(Word#
w Word# -> Word# -> Word#
`and#` (Word#
1## Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
i)) Word# -> Word# -> Int#
`neWord#` Word#
0##
{-# INLINE uncheckedTestBitWord# #-}
highestBitWord# :: Word# -> Word#
highestBitWord# :: Word# -> Word#
highestBitWord# Word#
w =
Word# -> Word#
clz# Word#
w Word# -> Word# -> Word#
`xor#` (WORD_SIZE_IN_BITS## `minusWord#` 1##)
{-# INLINE highestBitWord# #-}
lowestBitWord# :: Word# -> Word#
lowestBitWord# :: Word# -> Word#
lowestBitWord# Word#
w = Word# -> Word#
ctz# Word#
w
{-# INLINE lowestBitWord# #-}
andNot# :: Word# -> Word# -> Word#
andNot# :: Word# -> Word# -> Word#
andNot# Word#
w1 Word#
w2 =
Word#
w1 Word# -> Word# -> Word#
`and#` Word# -> Word#
not# Word#
w2
{-# INLINE andNot# #-}
disjointWord# :: Word# -> Word# -> Int#
disjointWord# :: Word# -> Word# -> Int#
disjointWord# Word#
w1 Word#
w2 = ((Word#
w1 Word# -> Word# -> Word#
`and#` Word#
w2) Word# -> Word# -> Int#
`eqWord#` Word#
0##)
{-# INLINE disjointWord# #-}
uncheckedWordOnes# :: Int# -> Word#
uncheckedWordOnes# :: Int# -> Word#
uncheckedWordOnes# Int#
n = Word# -> Word#
not# Word#
0## Word# -> Int# -> Word#
`uncheckedShiftRL#` (WORD_SIZE_IN_BITS# -# n)
{-# INLINE uncheckedWordOnes# #-}
wordFoldrBits# :: (Int -> a -> a) -> a -> Word# -> a
wordFoldrBits# :: forall a. (Int -> a -> a) -> a -> Word# -> a
wordFoldrBits# Int -> a -> a
f a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
lowestBitWord# Word#
w)
in Int -> a -> a
f (Int# -> Int
I# Int#
i) ((Int -> a -> a) -> a -> Word# -> a
forall a. (Int -> a -> a) -> a -> Word# -> a
wordFoldrBits# Int -> a -> a
f a
a (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i))
wordFoldrBitsOffset# :: Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffset# :: forall a. Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffset# Int#
offset Int -> a -> a
f a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
lowestBitWord# Word#
w)
in Int -> a -> a
f (Int# -> Int
I# (Int#
i Int# -> Int# -> Int#
+# Int#
offset)) (Int# -> (Int -> a -> a) -> a -> Word# -> a
forall a. Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffset# Int#
offset Int -> a -> a
f a
a (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i))
wordFoldlBits# :: (a -> Int -> a) -> a -> Word# -> a
wordFoldlBits# :: forall a. (a -> Int -> a) -> a -> Word# -> a
wordFoldlBits# a -> Int -> a
f a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
highestBitWord# Word#
w)
in a -> Int -> a
f ((a -> Int -> a) -> a -> Word# -> a
forall a. (a -> Int -> a) -> a -> Word# -> a
wordFoldlBits# a -> Int -> a
f a
a (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)) (Int# -> Int
I# Int#
i)
wordFoldlBitsOffset# :: Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffset# :: forall a. Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffset# Int#
offset a -> Int -> a
f a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
highestBitWord# Word#
w)
in a -> Int -> a
f (Int# -> (a -> Int -> a) -> a -> Word# -> a
forall a. Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffset# Int#
offset a -> Int -> a
f a
a (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)) (Int# -> Int
I# (Int#
i Int# -> Int# -> Int#
+# Int#
offset))
wordFoldrBitsStrict# :: (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsStrict# :: forall a. (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsStrict# Int -> a -> a
f !a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
highestBitWord# Word#
w)
in (Int -> a -> a) -> a -> Word# -> a
forall a. (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsStrict# Int -> a -> a
f (Int -> a -> a
f (Int# -> Int
I# Int#
i) a
a) (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)
wordFoldrBitsOffsetStrict# :: Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffsetStrict# :: forall a. Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffsetStrict# Int#
offset Int -> a -> a
f !a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
highestBitWord# Word#
w)
in Int# -> (Int -> a -> a) -> a -> Word# -> a
forall a. Int# -> (Int -> a -> a) -> a -> Word# -> a
wordFoldrBitsOffsetStrict# Int#
offset Int -> a -> a
f (Int -> a -> a
f (Int# -> Int
I# (Int#
i Int# -> Int# -> Int#
+# Int#
offset)) a
a) (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)
wordFoldlBitsStrict# :: (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsStrict# :: forall a. (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsStrict# a -> Int -> a
f !a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
lowestBitWord# Word#
w)
in (a -> Int -> a) -> a -> Word# -> a
forall a. (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsStrict# a -> Int -> a
f (a -> Int -> a
f a
a (Int# -> Int
I# Int#
i)) (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)
wordFoldlBitsOffsetStrict# :: Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffsetStrict# :: forall a. Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffsetStrict# Int#
offset a -> Int -> a
f !a
a Word#
w
| Int# -> Bool
isTrue# (Word#
w Word# -> Word# -> Int#
`eqWord#` Word#
0##) = a
a
| Bool
otherwise =
let i :: Int#
i = Word# -> Int#
word2Int# (Word# -> Word#
lowestBitWord# Word#
w)
in Int# -> (a -> Int -> a) -> a -> Word# -> a
forall a. Int# -> (a -> Int -> a) -> a -> Word# -> a
wordFoldlBitsOffsetStrict# Int#
offset a -> Int -> a
f (a -> Int -> a
f a
a (Int# -> Int
I# (Int#
i Int# -> Int# -> Int#
+# Int#
offset))) (Word# -> Int# -> Word#
uncheckedClearBitWord# Word#
w Int#
i)