add isl_aff_mod and isl_pw_aff_mod
authorSven Verdoolaege <skimo@kotnet.org>
Sat, 30 Jul 2011 09:04:14 +0000 (11:04 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Sat, 30 Jul 2011 12:55:25 +0000 (14:55 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index c99469b..2a3dbf7 100644 (file)
@@ -2533,6 +2533,10 @@ Operations include
        __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
        __isl_give isl_pw_aff *isl_pw_aff_floor(
                __isl_take isl_pw_aff *pwaff);
+       __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff,
+               isl_int mod);
+       __isl_give isl_pw_aff *isl_pw_aff_mod(
+               __isl_take isl_pw_aff *pwaff, isl_int mod);
        __isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff,
                isl_int f);
        __isl_give isl_pw_aff *isl_pw_aff_scale(
index 87ea0ff..63e5f4b 100644 (file)
@@ -59,6 +59,7 @@ __isl_give isl_div *isl_aff_get_div(__isl_keep isl_aff *aff, int pos);
 __isl_give isl_aff *isl_aff_neg(__isl_take isl_aff *aff);
 __isl_give isl_aff *isl_aff_ceil(__isl_take isl_aff *aff);
 __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff);
+__isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int mod);
 
 __isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1,
        __isl_take isl_aff *aff2);
@@ -131,6 +132,8 @@ __isl_give isl_pw_aff *isl_pw_aff_sub(__isl_take isl_pw_aff *pwaff1,
 __isl_give isl_pw_aff *isl_pw_aff_neg(__isl_take isl_pw_aff *pwaff);
 __isl_give isl_pw_aff *isl_pw_aff_ceil(__isl_take isl_pw_aff *pwaff);
 __isl_give isl_pw_aff *isl_pw_aff_floor(__isl_take isl_pw_aff *pwaff);
+__isl_give isl_pw_aff *isl_pw_aff_mod(__isl_take isl_pw_aff *pwaff,
+       isl_int mod);
 
 __isl_give isl_pw_aff *isl_pw_aff_cond(__isl_take isl_set *cond,
        __isl_take isl_pw_aff *pwaff_true, __isl_take isl_pw_aff *pwaff_false);
index de0bd22..f1ec212 100644 (file)
--- a/isl_aff.c
+++ b/isl_aff.c
@@ -494,6 +494,40 @@ __isl_give isl_aff *isl_aff_floor(__isl_take isl_aff *aff)
        return aff;
 }
 
+/* Compute
+ *
+ *     aff mod m = aff - m * floor(aff/m)
+ */
+__isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int m)
+{
+       isl_aff *res;
+
+       res = isl_aff_copy(aff);
+       aff = isl_aff_scale_down(aff, m);
+       aff = isl_aff_floor(aff);
+       aff = isl_aff_scale(aff, m);
+       res = isl_aff_sub(res, aff);
+
+       return res;
+}
+
+/* Compute
+ *
+ *     pwaff mod m = pwaff - m * floor(pwaff/m)
+ */
+__isl_give isl_pw_aff *isl_pw_aff_mod(__isl_take isl_pw_aff *pwaff, isl_int m)
+{
+       isl_pw_aff *res;
+
+       res = isl_pw_aff_copy(pwaff);
+       pwaff = isl_pw_aff_scale_down(pwaff, m);
+       pwaff = isl_pw_aff_floor(pwaff);
+       pwaff = isl_pw_aff_scale(pwaff, m);
+       res = isl_pw_aff_sub(res, pwaff);
+
+       return res;
+}
+
 /* Given f, return ceil(f).
  * If f is an integer expression, then just return f.
  * Otherwise, create a new div d = [-f] and return the expression -d.