{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP, MagicHash, UnboxedTuples, NoImplicitPrelude #-}
{-# OPTIONS_GHC -O2 #-}
{-# OPTIONS_HADDOCK not-home #-}
#include "MachDeps.h"
module GHC.Internal.Float.ConversionUtils ( elimZerosInteger, elimZerosInt# ) where
import GHC.Internal.Base
import GHC.Internal.Bignum.Integer
default ()
#if WORD_SIZE_IN_BITS < 64
#define TO64 integerToInt64#
elim64# :: Int64# -> Int# -> (# Integer, Int# #)
elim64# n e =
case zeroCount (int64ToInt# n) of
t | isTrue# (e <=# t) -> (# integerFromInt64# (uncheckedIShiftRA64# n e), 0# #)
| isTrue# (t <# 8#) -> (# integerFromInt64# (uncheckedIShiftRA64# n t), e -# t #)
| otherwise -> elim64# (uncheckedIShiftRA64# n 8#) (e -# 8#)
#else
#define TO64 integerToInt#
elim64# :: Int# -> Int# -> (# Integer, Int# #)
elim64# :: Int# -> Int# -> (# Integer, Int# #)
elim64# = Int# -> Int# -> (# Integer, Int# #)
elimZerosInt#
#endif
{-# INLINE elimZerosInteger #-}
elimZerosInteger :: Integer -> Int# -> (# Integer, Int# #)
elimZerosInteger :: Integer -> Int# -> (# Integer, Int# #)
elimZerosInteger Integer
m Int#
e = Int# -> Int# -> (# Integer, Int# #)
elim64# (TO64 m) e
elimZerosInt# :: Int# -> Int# -> (# Integer, Int# #)
elimZerosInt# :: Int# -> Int# -> (# Integer, Int# #)
elimZerosInt# Int#
n Int#
e =
case Int# -> Int#
zeroCount Int#
n of
Int#
t | Int# -> Bool
isTrue# (Int#
e Int# -> Int# -> Int#
<=# Int#
t) -> (# Int# -> Integer
IS (Int# -> Int# -> Int#
uncheckedIShiftRA# Int#
n Int#
e), Int#
0# #)
| Int# -> Bool
isTrue# (Int#
t Int# -> Int# -> Int#
<# Int#
8#) -> (# Int# -> Integer
IS (Int# -> Int# -> Int#
uncheckedIShiftRA# Int#
n Int#
t), Int#
e Int# -> Int# -> Int#
-# Int#
t #)
| Bool
otherwise -> Int# -> Int# -> (# Integer, Int# #)
elimZerosInt# (Int# -> Int# -> Int#
uncheckedIShiftRA# Int#
n Int#
8#) (Int#
e Int# -> Int# -> Int#
-# Int#
8#)
zeroCount :: Int# -> Int#
zeroCount :: Int# -> Int#
zeroCount Int#
i = Int8# -> Int#
int8ToInt# (Addr# -> Int# -> Int8#
indexInt8OffAddr# Addr#
arr (Word# -> Int#
word2Int# (Word# -> Word#
narrow8Word# (Int# -> Word#
int2Word# Int#
i))))
where
arr :: Addr#
arr = Addr#
"\8\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\5\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\6\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\5\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\7\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\5\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\6\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\5\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0\4\0\1\0\2\0\1\0\3\0\1\0\2\0\1\0"#