    -- |
    -- 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.Word
    import Data.Bits
    import Data.Memory.ExtendedWords

    -- | Split a 'Word64' into the highest and lowest 'Word32'
    w64to32 :: Word64 -> (Word32, Word32)
    w64to32 w = (fromIntegral (w `shiftR` 32), fromIntegral w)

    -- | Reconstruct a 'Word64' from two 'Word32'
    w32to64 :: (Word32, Word32) -> Word64
    w32to64 (x1, x2) = ((fromIntegral x1) `shiftL` 32) .|. (fromIntegral x2)