    -- |
    -- Module      : Crypto.Internal.Words
    -- License     : BSD-style
    -- Maintainer  : Vincent Hanquez <vincent@snarc.org>
    -- Stability   : experimental
    -- Portability : unknown
    --
    -- Extra Word size
    module Crypto.Internal.Words (
        Word128 (..),
        w64to32,
        w32to64,
    ) where

    import Data.Bits
    import Data.Memory.ExtendedWords
    import Data.Word

    -- | Split a 'Word64' into the highest and lowest 'Word32'
    w64to32 :: Word64 -> (Word32, Word32)
    w64to32 :: Word64 -> (Word32, Word32)
    w64to32 Word64
    w = (Word64 -> Word32
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral (Word64
    w Word64 -> Int -> Word64
    forall a. Bits a => a -> Int -> a
    `shiftR` Int
    32), Word64 -> Word32
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Word64
    w)

    -- | Reconstruct a 'Word64' from two 'Word32'
    w32to64 :: (Word32, Word32) -> Word64
    w32to64 :: (Word32, Word32) -> Word64
    w32to64 (Word32
    x1, Word32
    x2) = ((Word32 -> Word64
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Word32
    x1) Word64 -> Int -> Word64
    forall a. Bits a => a -> Int -> a
    `shiftL` Int
    32) Word64 -> Word64 -> Word64
    forall a. Bits a => a -> a -> a
    .|. (Word32 -> Word64
    forall a b. (Integral a, Num b) => a -> b
    fromIntegral Word32
    x2)