From 0e00b23c2195956fbaf988255422d2a463095357 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Thu, 2 Jun 2011 14:12:03 +0200 Subject: [PATCH] add isl_aff_scale and isl_aff_scale_down Signed-off-by: Sven Verdoolaege --- doc/user.pod | 4 ++++ include/isl/aff.h | 3 +++ isl_aff.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 9a345c7a..72f93fdf 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -2126,6 +2126,10 @@ Operations include __isl_take isl_aff *aff2); __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_scale(__isl_take isl_aff *aff, + isl_int f); + __isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, + isl_int f); An expression can be printed using diff --git a/include/isl/aff.h b/include/isl/aff.h index 80836eb6..b01ff299 100644 --- a/include/isl/aff.h +++ b/include/isl/aff.h @@ -51,6 +51,9 @@ __isl_give isl_aff *isl_aff_add(__isl_take isl_aff *aff1, __isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1, __isl_take isl_aff *aff2); +__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f); +__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f); + __isl_give isl_printer *isl_printer_print_aff(__isl_take isl_printer *p, __isl_keep isl_aff *aff); void isl_aff_dump(__isl_keep isl_aff *aff); diff --git a/isl_aff.c b/isl_aff.c index fe07d4a9..75b1c203 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -513,3 +513,52 @@ __isl_give isl_aff *isl_aff_sub(__isl_take isl_aff *aff1, { return isl_aff_add(aff1, isl_aff_neg(aff2)); } + +__isl_give isl_aff *isl_aff_scale(__isl_take isl_aff *aff, isl_int f) +{ + isl_int gcd; + + if (isl_int_is_one(f)) + return aff; + + aff = isl_aff_cow(aff); + if (!aff) + return NULL; + aff->v = isl_vec_cow(aff->v); + if (!aff->v) + return isl_aff_free(aff); + + isl_int_init(gcd); + isl_int_gcd(gcd, aff->v->el[0], f); + isl_int_divexact(aff->v->el[0], aff->v->el[0], gcd); + isl_int_divexact(gcd, f, gcd); + isl_seq_scale(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1); + isl_int_clear(gcd); + + return aff; +} + +__isl_give isl_aff *isl_aff_scale_down(__isl_take isl_aff *aff, isl_int f) +{ + isl_int gcd; + + if (isl_int_is_one(f)) + return aff; + + aff = isl_aff_cow(aff); + if (!aff) + return NULL; + aff->v = isl_vec_cow(aff->v); + if (!aff->v) + return isl_aff_free(aff); + + isl_int_init(gcd); + isl_seq_gcd(aff->v->el + 1, aff->v->size - 1, &gcd); + isl_int_gcd(gcd, gcd, f); + isl_seq_scale_down(aff->v->el + 1, aff->v->el + 1, gcd, aff->v->size - 1); + isl_int_divexact(gcd, f, gcd); + isl_int_mul(aff->v->el[0], aff->v->el[0], gcd); + isl_int_clear(gcd); + + return aff; +} -- 2.11.4.GIT