X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=GHC%2FWord.hs;h=9d3e1a6ae717ff90f8c0f15d5fdd27fdaba68fd7;hb=41e8fba828acbae1751628af50849f5352b27873;hp=079f49425d1b93e2bebf975c172454986c5faa96;hpb=42cce945381267dade7f876f493af89962a28f3b;p=ghc-base.git diff --git a/GHC/Word.hs b/GHC/Word.hs index 079f494..9d3e1a6 100644 --- a/GHC/Word.hs +++ b/GHC/Word.hs @@ -1,5 +1,6 @@ -{-# OPTIONS_GHC -XNoImplicitPrelude #-} +{-# LANGUAGE CPP, NoImplicitPrelude, BangPatterns, MagicHash #-} {-# OPTIONS_HADDOCK hide #-} + ----------------------------------------------------------------------------- -- | -- Module : GHC.Word @@ -42,6 +43,7 @@ import GHC.Read import GHC.Arr import GHC.Show import GHC.Err +import GHC.Float () -- for RealFrac methods ------------------------------------------------------------------------ -- Helper functions @@ -187,6 +189,10 @@ instance Bits Word where "fromIntegral/Word->Word" fromIntegral = id :: Word -> Word #-} +-- No RULES for RealFrac unfortunately. +-- Going through Int isn't possible because Word's range is not +-- included in Int's, going through Integer may or may not be slower. + ------------------------------------------------------------------------ -- type Word8 ------------------------------------------------------------------------ @@ -288,6 +294,36 @@ instance Bits Word8 where "fromIntegral/Word8->a" fromIntegral = \(W8# x#) -> fromIntegral (W# x#) #-} +{-# RULES +"properFraction/Float->(Word8,Float)" + forall x. properFraction (x :: Float) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word8) n, y) } +"truncate/Float->Word8" + forall x. truncate (x :: Float) = (fromIntegral :: Int -> Word8) (truncate x) +"floor/Float->Word8" + forall x. floor (x :: Float) = (fromIntegral :: Int -> Word8) (floor x) +"ceiling/Float->Word8" + forall x. ceiling (x :: Float) = (fromIntegral :: Int -> Word8) (ceiling x) +"round/Float->Word8" + forall x. round (x :: Float) = (fromIntegral :: Int -> Word8) (round x) + #-} + +{-# RULES +"properFraction/Double->(Word8,Double)" + forall x. properFraction (x :: Double) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word8) n, y) } +"truncate/Double->Word8" + forall x. truncate (x :: Double) = (fromIntegral :: Int -> Word8) (truncate x) +"floor/Double->Word8" + forall x. floor (x :: Double) = (fromIntegral :: Int -> Word8) (floor x) +"ceiling/Double->Word8" + forall x. ceiling (x :: Double) = (fromIntegral :: Int -> Word8) (ceiling x) +"round/Double->Word8" + forall x. round (x :: Double) = (fromIntegral :: Int -> Word8) (round x) + #-} + ------------------------------------------------------------------------ -- type Word16 ------------------------------------------------------------------------ @@ -390,6 +426,36 @@ instance Bits Word16 where "fromIntegral/Word16->a" fromIntegral = \(W16# x#) -> fromIntegral (W# x#) #-} +{-# RULES +"properFraction/Float->(Word16,Float)" + forall x. properFraction (x :: Float) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word16) n, y) } +"truncate/Float->Word16" + forall x. truncate (x :: Float) = (fromIntegral :: Int -> Word16) (truncate x) +"floor/Float->Word16" + forall x. floor (x :: Float) = (fromIntegral :: Int -> Word16) (floor x) +"ceiling/Float->Word16" + forall x. ceiling (x :: Float) = (fromIntegral :: Int -> Word16) (ceiling x) +"round/Float->Word16" + forall x. round (x :: Float) = (fromIntegral :: Int -> Word16) (round x) + #-} + +{-# RULES +"properFraction/Double->(Word16,Double)" + forall x. properFraction (x :: Double) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word16) n, y) } +"truncate/Double->Word16" + forall x. truncate (x :: Double) = (fromIntegral :: Int -> Word16) (truncate x) +"floor/Double->Word16" + forall x. floor (x :: Double) = (fromIntegral :: Int -> Word16) (floor x) +"ceiling/Double->Word16" + forall x. ceiling (x :: Double) = (fromIntegral :: Int -> Word16) (ceiling x) +"round/Double->Word16" + forall x. round (x :: Double) = (fromIntegral :: Int -> Word16) (round x) + #-} + ------------------------------------------------------------------------ -- type Word32 ------------------------------------------------------------------------ @@ -495,6 +561,39 @@ instance Bits Word32 where #if WORD_SIZE_IN_BITS > 32 -- Operations may assume and must ensure that it holds only values -- from its logical range. + +-- We can use rewrite rules for the RealFrac methods + +{-# RULES +"properFraction/Float->(Word32,Float)" + forall x. properFraction (x :: Float) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word32) n, y) } +"truncate/Float->Word32" + forall x. truncate (x :: Float) = (fromIntegral :: Int -> Word32) (truncate x) +"floor/Float->Word32" + forall x. floor (x :: Float) = (fromIntegral :: Int -> Word32) (floor x) +"ceiling/Float->Word32" + forall x. ceiling (x :: Float) = (fromIntegral :: Int -> Word32) (ceiling x) +"round/Float->Word32" + forall x. round (x :: Float) = (fromIntegral :: Int -> Word32) (round x) + #-} + +{-# RULES +"properFraction/Double->(Word32,Double)" + forall x. properFraction (x :: Double) = + case properFraction x of { + (n, y) -> ((fromIntegral :: Int -> Word32) n, y) } +"truncate/Double->Word32" + forall x. truncate (x :: Double) = (fromIntegral :: Int -> Word32) (truncate x) +"floor/Double->Word32" + forall x. floor (x :: Double) = (fromIntegral :: Int -> Word32) (floor x) +"ceiling/Double->Word32" + forall x. ceiling (x :: Double) = (fromIntegral :: Int -> Word32) (ceiling x) +"round/Double->Word32" + forall x. round (x :: Double) = (fromIntegral :: Int -> Word32) (round x) + #-} + #endif data Word32 = W32# Word# deriving (Eq, Ord)