X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Futils%2FFastTypes.lhs;h=ded373fd4d3c67d6fdaa2a46ca770f3da64e1824;hb=01ecefa4b97106fec5c139c5514e5d56e59ecbaf;hp=bcea61de7805b27d891b74771568923ea714c334;hpb=da72bd5d852ac0e01a00f5d54030a958fbcf72dc;p=ghc-hetmet.git diff --git a/compiler/utils/FastTypes.lhs b/compiler/utils/FastTypes.lhs index bcea61d..ded373f 100644 --- a/compiler/utils/FastTypes.lhs +++ b/compiler/utils/FastTypes.lhs @@ -34,6 +34,8 @@ fastBool True = 1# fastBool False = 0# isFastTrue x = x ==# 1# +-- note that fastOr and fastAnd are strict in both arguments +-- since they are unboxed fastOr 1# _ = 1# fastOr 0# x = x @@ -60,11 +62,16 @@ negateFastInt = negate type FastBool = Bool fastBool x = x isFastTrue x = x -fastOr = (||) -fastAnd = (&&) +-- make sure these are as strict as the unboxed version, +-- so that the performance characteristics match +fastOr False False = False +fastOr _ _ = True +fastAnd True True = True +fastAnd _ _ = False --These are among the type-signatures necessary for !ghc to compile -- but break ghc (can't give a signature for an import...) +--Note that the comparisons actually do return Bools not FastBools. (+#) :: FastInt -> FastInt -> FastInt (-#) :: FastInt -> FastInt -> FastInt (*#) :: FastInt -> FastInt -> FastInt @@ -75,19 +82,6 @@ fastAnd = (&&) (>#) :: FastInt -> FastInt -> Bool #endif /* ! __GLASGOW_HASKELL__ */ --- however it's still possible to check that these are --- valid signatures nonetheless (e.g., ==# returns Bool --- not FastBool/Int# !) -_signatures = - ( (+#) :: FastInt -> FastInt -> FastInt - , (-#) :: FastInt -> FastInt -> FastInt - , (*#) :: FastInt -> FastInt -> FastInt - , (==#) :: FastInt -> FastInt -> Bool - , (<#) :: FastInt -> FastInt -> Bool - , (<=#) :: FastInt -> FastInt -> Bool - , (>=#) :: FastInt -> FastInt -> Bool - , (>#) :: FastInt -> FastInt -> Bool - ) -- type-signatures will improve the non-ghc-specific versions -- and keep things accurate (and ABLE to compile!)