From 10916ab567e80151d8e30800e4a96263092a0367 Mon Sep 17 00:00:00 2001
From: Ian Lynagh <igloo@earth.li>
Date: Tue, 10 Jan 2012 22:08:23 +0000
Subject: [PATCH] Add prelude rules for quotInteger, remInteger

---
 compiler/prelude/PrelNames.lhs | 27 ++++++++++++++---------
 compiler/prelude/PrelRules.lhs | 40 +++++++++++++++++++++++-----------
 2 files changed, 44 insertions(+), 23 deletions(-)

diff --git a/compiler/prelude/PrelNames.lhs b/compiler/prelude/PrelNames.lhs
index a88e536eb214..98460561c8b0 100644
--- a/compiler/prelude/PrelNames.lhs
+++ b/compiler/prelude/PrelNames.lhs
@@ -259,6 +259,7 @@ basicKnownKeyNames
         absIntegerName, signumIntegerName,
         leIntegerName, gtIntegerName, ltIntegerName, geIntegerName,
         compareIntegerName, quotRemIntegerName, divModIntegerName,
+        quotIntegerName, remIntegerName,
         floatFromIntegerName, doubleFromIntegerName,
         gcdIntegerName, lcmIntegerName,
         andIntegerName, orIntegerName, xorIntegerName, complementIntegerName,
@@ -827,6 +828,7 @@ integerTyConName, mkIntegerName,
     absIntegerName, signumIntegerName,
     leIntegerName, gtIntegerName, ltIntegerName, geIntegerName,
     compareIntegerName, quotRemIntegerName, divModIntegerName,
+    quotIntegerName, remIntegerName,
     floatFromIntegerName, doubleFromIntegerName,
     gcdIntegerName, lcmIntegerName,
     andIntegerName, orIntegerName, xorIntegerName, complementIntegerName,
@@ -851,6 +853,8 @@ geIntegerName         = varQual gHC_INTEGER_TYPE (fsLit "geInteger")         geI
 compareIntegerName    = varQual gHC_INTEGER_TYPE (fsLit "compareInteger")    compareIntegerIdKey
 quotRemIntegerName    = varQual gHC_INTEGER_TYPE (fsLit "quotRemInteger")    quotRemIntegerIdKey
 divModIntegerName     = varQual gHC_INTEGER_TYPE (fsLit "divModInteger")     divModIntegerIdKey
+quotIntegerName       = varQual gHC_INTEGER_TYPE (fsLit "quotInteger")       quotIntegerIdKey
+remIntegerName        = varQual gHC_INTEGER_TYPE (fsLit "remInteger")        remIntegerIdKey
 floatFromIntegerName  = varQual gHC_INTEGER_TYPE (fsLit "floatFromIntegerName")     floatFromIntegerIdKey
 doubleFromIntegerName = varQual gHC_INTEGER_TYPE (fsLit "doubleFromIntegerName")    doubleFromIntegerIdKey
 gcdIntegerName        = varQual gHC_INTEGER_TYPE (fsLit "gcdInteger")        gcdIntegerIdKey
@@ -1446,6 +1450,7 @@ mkIntegerIdKey, smallIntegerIdKey, integerToWordIdKey, integerToIntIdKey,
     eqIntegerIdKey, neqIntegerIdKey, absIntegerIdKey, signumIntegerIdKey,
     leIntegerIdKey, gtIntegerIdKey, ltIntegerIdKey, geIntegerIdKey,
     compareIntegerIdKey, quotRemIntegerIdKey, divModIntegerIdKey,
+    quotIntegerIdKey, remIntegerIdKey,
     floatFromIntegerIdKey, doubleFromIntegerIdKey,
     gcdIntegerIdKey, lcmIntegerIdKey,
     andIntegerIdKey, orIntegerIdKey, xorIntegerIdKey, complementIntegerIdKey,
@@ -1469,16 +1474,18 @@ geIntegerIdKey                = mkPreludeMiscIdUnique 75
 compareIntegerIdKey           = mkPreludeMiscIdUnique 76
 quotRemIntegerIdKey           = mkPreludeMiscIdUnique 77
 divModIntegerIdKey            = mkPreludeMiscIdUnique 78
-floatFromIntegerIdKey         = mkPreludeMiscIdUnique 79
-doubleFromIntegerIdKey        = mkPreludeMiscIdUnique 80
-gcdIntegerIdKey               = mkPreludeMiscIdUnique 81
-lcmIntegerIdKey               = mkPreludeMiscIdUnique 82
-andIntegerIdKey               = mkPreludeMiscIdUnique 83
-orIntegerIdKey                = mkPreludeMiscIdUnique 84
-xorIntegerIdKey               = mkPreludeMiscIdUnique 85
-complementIntegerIdKey        = mkPreludeMiscIdUnique 86
-shiftLIntegerIdKey            = mkPreludeMiscIdUnique 87
-shiftRIntegerIdKey            = mkPreludeMiscIdUnique 88
+quotIntegerIdKey              = mkPreludeMiscIdUnique 79
+remIntegerIdKey               = mkPreludeMiscIdUnique 80
+floatFromIntegerIdKey         = mkPreludeMiscIdUnique 81
+doubleFromIntegerIdKey        = mkPreludeMiscIdUnique 82
+gcdIntegerIdKey               = mkPreludeMiscIdUnique 83
+lcmIntegerIdKey               = mkPreludeMiscIdUnique 84
+andIntegerIdKey               = mkPreludeMiscIdUnique 85
+orIntegerIdKey                = mkPreludeMiscIdUnique 86
+xorIntegerIdKey               = mkPreludeMiscIdUnique 87
+complementIntegerIdKey        = mkPreludeMiscIdUnique 88
+shiftLIntegerIdKey            = mkPreludeMiscIdUnique 89
+shiftRIntegerIdKey            = mkPreludeMiscIdUnique 90
 
 rootMainKey, runMainKey :: Unique
 rootMainKey                   = mkPreludeMiscIdUnique 100
diff --git a/compiler/prelude/PrelRules.lhs b/compiler/prelude/PrelRules.lhs
index 59142da10624..6a3d90a21890 100644
--- a/compiler/prelude/PrelRules.lhs
+++ b/compiler/prelude/PrelRules.lhs
@@ -642,10 +642,10 @@ builtinIntegerRules =
   rule_binop_Bool     "ltInteger"         ltIntegerName         (<),
   rule_binop_Bool     "geInteger"         geIntegerName         (>=),
   rule_binop_Ordering "compareInteger"    compareIntegerName    compare,
-  rule_divop          "divModInteger"     divModIntegerName     divMod,
-  rule_divop          "quotRemInteger"    quotRemIntegerName    quotRem,
-  -- TODO: quotInteger rule
-  -- TODO: remInteger rule
+  rule_divop_both     "divModInteger"     divModIntegerName     divMod,
+  rule_divop_both     "quotRemInteger"    quotRemIntegerName    quotRem,
+  rule_divop_one      "quotInteger"       quotIntegerName       quot,
+  rule_divop_one      "remInteger"        remIntegerName        rem,
   -- TODO: encodeFloatInteger rule
   rule_convert        "floatFromInteger"  floatFromIntegerName  mkFloatLitFloat,
   -- TODO: encodeDoubleInteger rule
@@ -668,9 +668,12 @@ builtinIntegerRules =
           rule_binop str name op
            = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2,
                            ru_try = match_Integer_binop op }
-          rule_divop str name op
+          rule_divop_both str name op
            = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2,
-                           ru_try = match_Integer_divop op }
+                           ru_try = match_Integer_divop_both op }
+          rule_divop_one str name op
+           = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2,
+                           ru_try = match_Integer_divop_one op }
           rule_Int_binop str name op
            = BuiltinRule { ru_name = fsLit str, ru_fn = name, ru_nargs = 2,
                            ru_try = match_Integer_Int_binop op }
@@ -773,11 +776,11 @@ match_Integer_binop binop id_unf [xl,yl]
 match_Integer_binop _ _ _ = Nothing
 
 -- This helper is used for the quotRem and divMod functions
-match_Integer_divop :: (Integer -> Integer -> (Integer, Integer))
-                    -> IdUnfoldingFun
-                    -> [Expr CoreBndr]
-                    -> Maybe (Expr CoreBndr)
-match_Integer_divop divop id_unf [xl,yl]
+match_Integer_divop_both :: (Integer -> Integer -> (Integer, Integer))
+                         -> IdUnfoldingFun
+                         -> [Expr CoreBndr]
+                         -> Maybe (Expr CoreBndr)
+match_Integer_divop_both divop id_unf [xl,yl]
   | Just (LitInteger x i) <- exprIsLiteral_maybe id_unf xl
   , Just (LitInteger y _) <- exprIsLiteral_maybe id_unf yl
   , y /= 0
@@ -789,9 +792,20 @@ match_Integer_divop divop id_unf [xl,yl]
                                Type integerTy,
                                Lit (LitInteger r i),
                                Lit (LitInteger s i)]
-      _ -> panic "match_Integer_divop: mkIntegerId has the wrong type"
+      _ -> panic "match_Integer_divop_both: mkIntegerId has the wrong type"
+match_Integer_divop_both _ _ _ = Nothing
 
-match_Integer_divop _ _ _ = Nothing
+-- This helper is used for the quotRem and divMod functions
+match_Integer_divop_one :: (Integer -> Integer -> Integer)
+                        -> IdUnfoldingFun
+                        -> [Expr CoreBndr]
+                        -> Maybe (Expr CoreBndr)
+match_Integer_divop_one divop id_unf [xl,yl]
+  | Just (LitInteger x i) <- exprIsLiteral_maybe id_unf xl
+  , Just (LitInteger y _) <- exprIsLiteral_maybe id_unf yl
+  , y /= 0
+  = Just (Lit (LitInteger (x `divop` y) i))
+match_Integer_divop_one _ _ _ = Nothing
 
 match_Integer_Int_binop :: (Integer -> Int -> Integer)
                         -> IdUnfoldingFun
-- 
GitLab