    {-# LANGUAGE CPP, MagicHash #-}

    #ifdef USE_MONO_PAT_BINDS
    {-# LANGUAGE MonoPatBinds #-}
    #endif

    -- |
    -- Module      : Blaze.ByteString.Builder.Internal.UncheckedShifts
    -- Copyright   : (c) 2010 Simon Meier
    --
    --               Original serialization code from 'Data.Binary.Builder':
    --               (c) Lennart Kolmodin, Ross Patterson
    --
    -- License     : BSD3-style (see LICENSE)
    --
    -- Maintainer  : Simon Meier <iridcode@gmail.com>
    -- Stability   : experimental
    -- Portability : tested on GHC only
    --
    -- Utilty module defining unchecked shifts.
    --
    #if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
    #include "MachDeps.h"
    #endif

    module Blaze.ByteString.Builder.Internal.UncheckedShifts (
        shiftr_w16
      , shiftr_w32
      , shiftr_w64
      ) where

    -- TODO: Check validity of this implementation

    #if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
    import GHC.Base
    import GHC.Word (Word32(..),Word16(..),Word64(..))

    #if WORD_SIZE_IN_BITS < 64 && __GLASGOW_HASKELL__ >= 608
    import GHC.Word (uncheckedShiftRL64#)
    #endif
    #else
    import Data.Word
    #endif

    ------------------------------------------------------------------------
    -- Unchecked shifts

    {-# INLINE shiftr_w16 #-}
    shiftr_w16 :: Word16 -> Int -> Word16
    {-# INLINE shiftr_w32 #-}
    shiftr_w32 :: Word32 -> Int -> Word32
    {-# INLINE shiftr_w64 #-}
    shiftr_w64 :: Word64 -> Int -> Word64

    #if defined(__GLASGOW_HASKELL__) && !defined(__HADDOCK__)
    shiftr_w16 (W16# w) (I# i) = W16# (w `uncheckedShiftRL#`   i)
    shiftr_w32 (W32# w) (I# i) = W32# (w `uncheckedShiftRL#`   i)

    #if WORD_SIZE_IN_BITS < 64
    shiftr_w64 (W64# w) (I# i) = W64# (w `uncheckedShiftRL64#` i)

    #if __GLASGOW_HASKELL__ <= 606
    -- Exported by GHC.Word in GHC 6.8 and higher
    foreign import ccall unsafe "stg_uncheckedShiftRL64"
        uncheckedShiftRL64#     :: Word64# -> Int# -> Word64#
    #endif

    #else
    shiftr_w64 (W64# w) (I# i) = W64# (w `uncheckedShiftRL#` i)
    #endif

    #else
    shiftr_w16 = shiftR
    shiftr_w32 = shiftR
    shiftr_w64 = shiftR
    #endif