[project @ 2003-11-13 15:02:53 by simonpj]
[ghc-hetmet.git] / ghc / compiler / prelude / PrelRules.lhs
index 62b8cfc..8f5df8c 100644 (file)
@@ -21,7 +21,7 @@ module PrelRules ( primOpRules, builtinRules ) where
 
 import CoreSyn
 import Id              ( mkWildId )
-import Literal         ( Literal(..), isLitLitLit, mkMachInt, mkMachWord
+import Literal         ( Literal(..), mkMachInt, mkMachWord
                        , literalType
                        , word2IntLit, int2WordLit
                        , narrow8IntLit, narrow16IntLit, narrow32IntLit
@@ -34,22 +34,23 @@ import PrimOp               ( PrimOp(..), primOpOcc )
 import TysWiredIn      ( trueDataConId, falseDataConId )
 import TyCon           ( tyConDataCons_maybe, isEnumerationTyCon, isNewTyCon )
 import DataCon         ( dataConTag, dataConTyCon, dataConWorkId, fIRST_TAG )
-import CoreUtils       ( exprIsValue, cheapEqExpr, exprIsConApp_maybe )
+import CoreUtils       ( cheapEqExpr, exprIsConApp_maybe )
 import Type            ( tyConAppTyCon, eqType )
 import OccName         ( occNameUserString)
 import PrelNames       ( unpackCStringFoldrName, unpackCStringFoldrIdKey, hasKey,
                          eqStringName, unpackCStringIdKey )
 import Maybes          ( orElse )
 import Name            ( Name )
-import Bits            ( Bits(..) )
-#if __GLASGOW_HASKELL__ >= 500
-import Word            ( Word )
-#else
-import Word            ( Word64 )
-#endif
 import Outputable
 import FastString
 import CmdLineOpts      ( opt_SimplExcessPrecision )
+
+import DATA_BITS       ( Bits(..) )
+#if __GLASGOW_HASKELL__ >= 500
+import DATA_WORD       ( Word )
+#else
+import DATA_WORD       ( Word64 )
+#endif
 \end{code}
 
 
@@ -176,16 +177,14 @@ primOpRules op = primop_rule op
 %*                                                                     *
 %************************************************************************
 
-       IMPORTANT NOTE
-
-In all these operations we might find a LitLit as an operand; that's
-why we have the catch-all Nothing case.
+ToDo: the reason these all return Nothing is because there used to be
+the possibility of an argument being a litlit.  Litlits are now gone,
+so this could be cleaned up.
 
 \begin{code}
 --------------------------
 litCoerce :: (Literal -> Literal) -> Literal -> Maybe CoreExpr
-litCoerce fn lit | isLitLitLit lit = Nothing
-                 | otherwise       = Just (Lit (fn lit))
+litCoerce fn lit = Just (Lit (fn lit))
 
 --------------------------
 cmpOp :: (Ordering -> Bool) -> Literal -> Literal -> Maybe CoreExpr
@@ -207,10 +206,12 @@ cmpOp cmp l1 l2
 
 --------------------------
 
-negOp (MachFloat f)  = Just (mkFloatVal (-f))
-negOp (MachDouble d) = Just (mkDoubleVal (-d))
-negOp (MachInt i)    = intResult (-i)
-negOp l                     = Nothing
+negOp (MachFloat 0.0) = Nothing  -- can't represent -0.0 as a Rational
+negOp (MachFloat f)   = Just (mkFloatVal (-f))
+negOp (MachDouble 0.0) = Nothing
+negOp (MachDouble d)   = Just (mkDoubleVal (-d))
+negOp (MachInt i)      = intResult (-i)
+negOp l                       = Nothing
 
 --------------------------
 intOp2 op (MachInt i1) (MachInt i2) = intResult (i1 `op` i2)