From 63fb8a7f484648c3caa25351c8c94ac2395ec563 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 4 Apr 2013 16:50:14 +0200 Subject: [PATCH] add isl_aff_mod_val Signed-off-by: Sven Verdoolaege --- doc/user.pod | 2 ++ include/isl/aff.h | 2 ++ isl_aff.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 2a15f99e..e76e451b 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -3783,6 +3783,8 @@ Operations include __isl_take isl_pw_aff *pwaff); __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int mod); + __isl_give isl_aff *isl_aff_mod_val(__isl_take isl_aff *aff, + __isl_take isl_val *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, diff --git a/include/isl/aff.h b/include/isl/aff.h index 77114e33..c4ee5fe7 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -85,6 +85,8 @@ __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_mod_val(__isl_take isl_aff *aff, + __isl_take isl_val *mod); __isl_give isl_aff *isl_aff_mul(__isl_take isl_aff *aff1, __isl_take isl_aff *aff2); diff --git a/isl_aff.c b/isl_aff.c index 13060f0f..51f95c89 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -1311,6 +1311,37 @@ __isl_give isl_aff *isl_aff_mod(__isl_take isl_aff *aff, isl_int m) /* Compute * + * aff mod m = aff - m * floor(aff/m) + * + * with m an integer value. + */ +__isl_give isl_aff *isl_aff_mod_val(__isl_take isl_aff *aff, + __isl_take isl_val *m) +{ + isl_aff *res; + + if (!aff || !m) + goto error; + + if (!isl_val_is_int(m)) + isl_die(isl_val_get_ctx(m), isl_error_invalid, + "expecting integer modulo", goto error); + + res = isl_aff_copy(aff); + aff = isl_aff_scale_down_val(aff, isl_val_copy(m)); + aff = isl_aff_floor(aff); + aff = isl_aff_scale_val(aff, m); + res = isl_aff_sub(res, aff); + + return res; +error: + isl_aff_free(aff); + isl_val_free(m); + return NULL; +} + +/* 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) -- 2.11.4.GIT