    {-# LANGUAGE CPP #-}

    -- castFloatToWord32 is buggy on GHC <= 8.8 && 64-bit systems.
    -- See https://gitlab.haskell.org/ghc/ghc/issues/16617

    #include "MachDeps.h"

    #if MIN_VERSION_base(4,14,0) || WORD_SIZE_IN_BITS == 32

    module GHC.Float.Compat (module GHC.Float) where
    import GHC.Float

    #else

    module GHC.Float.Compat (module GHC.Float, castFloatToWord32) where
    import           GHC.Float hiding (castFloatToWord32)
    import qualified GHC.Float as F
    import           Data.Bits ((.&.))
    import           Data.Word (Word32)

    -- Let's hope the compiler is not smart enough to eliminate the bit-and...
    -- Or @fromIntegral (fromIntegral x :: Int) :: Word32@ might be better?
    castFloatToWord32 :: Float -> Word32
    castFloatToWord32 x = F.castFloatToWord32 x .&. 0xFFFFFFFF

    #endif