module Data.FastDigits.Internal
( selectPower
, selectPower'
) where
import GHC.Exts
#include "MachDeps.h"
selectPower :: Word# -> (# Word#, Word# #)
#if WORD_SIZE_IN_BITS == 31
selectPower 2## = (# 31##, 2147483648## #)
#elif WORD_SIZE_IN_BITS == 32
selectPower 2## = (# 31##, 2147483648## #)
#else
selectPower 2## = (# 63##, 9223372036854775808## #)
#endif
selectPower base = go base
where
go pw = case timesWord2# pw pw of
(# 0##, pw2 #)
-> let (# n, pw2n #) = go pw2 in
case timesWord2# pw pw2n of
(# 0##, pw2n1 #) -> (#n `timesWord#` 2## `plusWord#` 1##, pw2n1 #)
_ -> (# n `timesWord#` 2##, pw2n #)
_ -> (# 1##, pw #)
selectPower' :: Word -> (Word, Word)
selectPower' (W# base) = (W# power, W# poweredBase)
where
(# power, poweredBase #) = selectPower base