oorDoubleInteger :: Double -> Integer
floorDoubleInteger (D# x) =
    case decodeDoubleInteger x of
      (# m, e #)
        | isTrue# (e <# 0#) ->
          case negateInt# e of
            s | isTrue# (s ># 52#) -> if m < 0 then (-1) else 0
              | otherwise          ->
                case integerToInt m of
                  n -> smallInteger (n `uncheckedIShiftRA64#` s)
        | otherwise -> shiftLInteger m e

{-
floorDoubleInteger :: Double -> Integer
floorDoubleInteger (D# x) =
    case decodeDoubleInteger x of
      (# m, e #)
        | isTrue# (e <# 0#) ->
          case negateInt# e of
            s | isTrue# (s ># 52#) -> if m < 0 then (-1) else 0
              | otherwise          ->
                case integerToInt m of
                  n -> smallInteger (n `uncheckedIShiftRA64#` s)
        | otherwise -> shiftLInteger m e


floorDoubleInteger (D# x) =
    case decodeDoubleInteger x of
      (# m, e #)
        | isTrue# (e <# 0#) ->
          case negateInt# e of
            s | isTrue# (s ># 52#) -> if m < 0 then (-1) else 0
              | otherwise          ->
                case integerToInt m of
                  n -> smallInteger (n `uncheckedIShiftRA64#` s)
        | otherwise -> shiftLInteger m e

