add isl_aff_scale and isl_aff_scale_down
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 2 Jun 2011 12:12:03 +0000 (14:12 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Thu, 2 Jun 2011 14:44:30 +0000 (16:44 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/aff.h
isl_aff.c

index 9a345c7..72f93fd 100644 (file)
@@ -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
 
index 80836eb..b01ff29 100644 (file)
@@ -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);
index fe07d4a..75b1c20 100644 (file)
--- 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;
+}