[remove special handling of Float and Double, generate instances with m4 and hard code them as 32 and 64 bit IEEE floats respectively
John Meacham <john@repetae.net>**20070606105302] hunk ./C/FromGrin2.hs 207
+    f b Op.HintFloat = case b of
+        (Op.Bits 32) -> "float"
+        (Op.Bits 64) -> "double"
+        (Op.Bits 128) -> "__float128"
hunk ./data/names.txt 13
+Float     Jhc.Float.Float
+Double    Jhc.Float.Double
hunk ./data/primitives.txt 24
-Jhc.Float.Float, fbits<float>, float, FLT_MAX, FLT_MIN
-Jhc.Float.Double, fbits<double>, float, DBL_MAX, DBL_MIN
+#Jhc.Float.Float, fbits<float>, float, FLT_MAX, FLT_MIN
+#Jhc.Float.Double, fbits<double>, float, DBL_MAX, DBL_MIN
hunk ./lib/base/Jhc/Float.hs 1
-{-# OPTIONS_JHC -N -fffi #-}
-module Jhc.Float where
+{-# OPTIONS_JHC -N -fffi -fm4 #-}
hunk ./lib/base/Jhc/Float.hs 3
-import Jhc.IO(error)
-import Jhc.Order
+changequote({{,}})
+
+module Jhc.Float(
+    Float(..),
+    Double(..),
+    floatToDouble,
+    doubleToFloat,
+    Floating(..),
+    RealFrac(..),
+    RealFloat(..),
+    rationalToDouble
+    )
+    where
+
+import Jhc.Basics
hunk ./lib/base/Jhc/Float.hs 19
+import Jhc.IO(error)
hunk ./lib/base/Jhc/Float.hs 21
-import Jhc.Basics
+import Jhc.Order
+import Jhc.Types
hunk ./lib/base/Jhc/Float.hs 26
-data Float
-data Double
+data Float = Float Float32_
+data Double = Double Float64_
hunk ./lib/base/Jhc/Float.hs 147
-foreign import primitive "divide" divideDouble ::  Double -> Double -> Double
+foreign import primitive "FDiv" divideDouble ::  Double -> Double -> Double
+
+
+instance Eq Float where
+    Float x == Float y = boxBool (x `eqFloat` y)
+    Float x /= Float y = boxBool (x `neqFloat` y)
+
+instance Ord Float where
+    Float x < Float y = boxBool (float32FLt x y)
+    Float x > Float y = boxBool (float32FGt x y)
+    Float x <= Float y = boxBool (float32FLte x y)
+    Float x >= Float y = boxBool (float32FGte x y)
+
+
+
+foreign import primitive "FEq" eqFloat :: Float32_ -> Float32_ -> Bool__
+foreign import primitive "FNEq" neqFloat :: Float32_ -> Float32_ -> Bool__
+foreign import primitive "FLt" float32FLt :: Float32_ -> Float32_ -> Bool__
+foreign import primitive "FLte" float32FLte :: Float32_ -> Float32_ -> Bool__
+foreign import primitive "FGt" float32FGt :: Float32_ -> Float32_ -> Bool__
+foreign import primitive "FGte" float32FGte :: Float32_ -> Float32_ -> Bool__
+
+instance Eq Double where
+    Double x == Double y = boxBool (x `eqDouble` y)
+    Double x /= Double y = boxBool (x `neqDouble` y)
+
+instance Ord Double where
+    Double x < Double y = boxBool (float64FLt x y)
+    Double x > Double y = boxBool (float64FGt x y)
+    Double x <= Double y = boxBool (float64FLte x y)
+    Double x >= Double y = boxBool (float64FGte x y)
+
+foreign import primitive "FLt" float64FLt :: Float64_ -> Float64_ -> Bool__
+foreign import primitive "FLte" float64FLte :: Float64_ -> Float64_ -> Bool__
+foreign import primitive "FGt" float64FGt :: Float64_ -> Float64_ -> Bool__
+foreign import primitive "FGte" float64FGte :: Float64_ -> Float64_ -> Bool__
+
+foreign import primitive "FEq" eqDouble :: Float64_ -> Float64_ -> Bool__
+foreign import primitive "FNEq" neqDouble :: Float64_ -> Float64_ -> Bool__
+
+
+foreign import primitive "box" boxBool :: Bool__ -> Bool
+
+
+define(NUMINSTANCE,
+instance Num $1 where
+    $1 x * $1 y = $1 (times$1 x y)
+    $1 x + $1 y = $1 (plus$1 x y)
+    $1 x - $1 y = $1 (minus$1 x y)
+    abs ($1 x) = $1 (abs$1 x)
+    negate ($1 x) = $1 (neg$1 x)
+    fromInt x = fromInt$1 x
+    fromInteger x = fromInteger$1 x
+    signum x = case compare x 0 of
+        EQ -> 0
+        GT -> 1
+        LT -> -1
+
+foreign import primitive "FMul" times$1 :: $2 -> $2 -> $2
+foreign import primitive "FAdd" plus$1  :: $2 -> $2 -> $2
+foreign import primitive "FSub" minus$1 :: $2 -> $2 -> $2
+
+foreign import primitive "FAbs" abs$1 :: $2 -> $2
+foreign import primitive "FNeg" neg$1 :: $2 -> $2
+
+foreign import primitive "I2F"  fromInt$1 :: Int -> $1
+foreign import primitive "I2F"  fromInteger$1 :: Integer -> $1
+
+)
+
+
+
+
+NUMINSTANCE(Float,Float32_)
+NUMINSTANCE(Double,Float64_)
+
hunk ./lib/base/Prelude/Float.hs 1
-{-# OPTIONS_JHC -fffi #-}
+{-# OPTIONS_JHC -fffi  #-}
hunk ./lib/base/Prelude/Float.hs 243
-    floatRadix _ = c_flt_radix
-    floatDigits _ = c_flt_mant_dig
-    floatRange _ = (c_flt_min_exp,c_flt_max_exp)
+    floatRadix _ = 2
+    floatDigits _ = 24
+    floatRange _ = (-125,128)
hunk ./lib/base/Prelude/Float.hs 281
-foreign import primitive "const.FLT_RADIX" c_flt_radix :: Integer
-foreign import primitive "const.FLT_MANT_DIG" c_flt_mant_dig :: Int
-foreign import primitive "const.FLT_MIN_EXP" c_flt_min_exp :: Int
-foreign import primitive "const.FLT_MAX_EXP" c_flt_max_exp :: Int
hunk ./lib/base/Prelude/Float.hs 285
-    floatRadix _ = c_flt_radix
-    floatDigits _ = c_dbl_mant_dig
-    floatRange _ = (c_dbl_min_exp,c_dbl_max_exp)
+    floatRadix _ = 2
+    floatDigits _ = 53
+    floatRange _ = (-1021,1024)
hunk ./lib/base/Prelude/Float.hs 315
-foreign import primitive "const.DBL_MANT_DIG" c_dbl_mant_dig :: Int
-foreign import primitive "const.DBL_MIN_EXP" c_dbl_min_exp :: Int
-foreign import primitive "const.DBL_MAX_EXP" c_dbl_max_exp :: Int