diff options
author | Takano Akio <tak@anoak.io> | 2016-09-04 13:22:22 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2016-09-05 14:58:20 -0400 |
commit | 6ea62427de419ea071e1ea79ad0c15d9f4e90a67 (patch) | |
tree | 370423005b992268abf3b401d445bb48efed39bf /compiler/prelude/PrelRules.hs | |
parent | 71dd6e4429833238bcdaf96da8e2e41a62dacbf4 (diff) | |
download | haskell-6ea62427de419ea071e1ea79ad0c15d9f4e90a67.tar.gz |
Turn divInt# and modInt# into bitwise operations when possible
This implements #5615 for divInt# and modInt#.
I also included rules to do constant-folding when the both arguments
are known.
Test Plan: validate
Reviewers: austin, simonmar, bgamari
Reviewed By: bgamari
Subscribers: hvr, thomie
Differential Revision: https://phabricator.haskell.org/D2486
GHC Trac Issues: #5615
Diffstat (limited to 'compiler/prelude/PrelRules.hs')
-rw-r--r-- | compiler/prelude/PrelRules.hs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/compiler/prelude/PrelRules.hs b/compiler/prelude/PrelRules.hs index a57609a89d..8868047005 100644 --- a/compiler/prelude/PrelRules.hs +++ b/compiler/prelude/PrelRules.hs @@ -988,7 +988,26 @@ builtinRules BuiltinRule { ru_name = fsLit "Inline", ru_fn = inlineIdName, ru_nargs = 2, ru_try = \_ _ _ -> match_inline }, BuiltinRule { ru_name = fsLit "MagicDict", ru_fn = idName magicDictId, - ru_nargs = 4, ru_try = \_ _ _ -> match_magicDict } + ru_nargs = 4, ru_try = \_ _ _ -> match_magicDict }, + mkBasicRule divIntName 2 $ msum + [ nonZeroLit 1 >> binaryLit (intOp2 div) + , leftZero zeroi + , do + [arg, Lit (MachInt d)] <- getArgs + Just n <- return $ exactLog2 d + dflags <- getDynFlags + return $ Var (mkPrimOpId ISraOp) `App` arg `App` mkIntVal dflags n + ], + mkBasicRule modIntName 2 $ msum + [ nonZeroLit 1 >> binaryLit (intOp2 mod) + , leftZero zeroi + , do + [arg, Lit (MachInt d)] <- getArgs + Just _ <- return $ exactLog2 d + dflags <- getDynFlags + return $ Var (mkPrimOpId AndIOp) + `App` arg `App` mkIntVal dflags (d - 1) + ] ] ++ builtinIntegerRules |