add isl_multi_*_scale_down_multi_val
authorSven Verdoolaege <skimo@kotnet.org>
Thu, 4 Jul 2013 09:07:08 +0000 (4 11:07 +0200)
committerSven Verdoolaege <skimo@kotnet.org>
Wed, 24 Jul 2013 11:43:38 +0000 (24 13:43 +0200)
Signed-off-by: Sven Verdoolaege <skimo@kotnet.org>
doc/user.pod
include/isl/multi.h
isl_multi_templ.c
isl_val.c
isl_val_private.h

index f4bb7ff..1bf518a 100644 (file)
@@ -3378,6 +3378,10 @@ Operations include
        __isl_give isl_multi_val *isl_multi_val_scale_multi_val(
                __isl_take isl_multi_val *mv1,
                __isl_take isl_multi_val *mv2);
+       __isl_give isl_multi_val *
+       isl_multi_val_scale_down_multi_val(
+               __isl_take isl_multi_val *mv1,
+               __isl_take isl_multi_val *mv2);
 
 A multiple value can be printed using
 
@@ -4249,6 +4253,14 @@ C<isl_multi_aff_sub> subtracts the second argument from the first.
        isl_union_pw_multi_aff_scale_multi_val(
                __isl_take isl_union_pw_multi_aff *upma,
                __isl_take isl_multi_val *mv);
+       __isl_give isl_multi_aff *
+       isl_multi_aff_scale_down_multi_val(
+               __isl_take isl_multi_aff *ma,
+               __isl_take isl_multi_val *mv);
+       __isl_give isl_multi_pw_aff *
+       isl_multi_pw_aff_scale_down_multi_val(
+               __isl_take isl_multi_pw_aff *mpa,
+               __isl_take isl_multi_val *mv);
 
 C<isl_multi_aff_scale_multi_val> scales the elements of C<ma>
 by the corresponding elements of C<mv>.
index b4ed1e1..11141bc 100644 (file)
@@ -82,6 +82,9 @@ __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_val(            \
 __isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_multi_val(       \
        __isl_take isl_multi_##BASE *multi,                             \
        __isl_take isl_multi_val *mv);                                  \
+__isl_give isl_multi_##BASE *isl_multi_##BASE##_scale_down_multi_val(  \
+       __isl_take isl_multi_##BASE *multi,                             \
+       __isl_take isl_multi_val *mv);                                  \
 __isl_give isl_multi_##BASE *isl_multi_##BASE##_align_params(          \
        __isl_take isl_multi_##BASE *multi,                             \
        __isl_take isl_space *model);                                   \
index 4208b81..020983e 100644 (file)
@@ -1042,6 +1042,42 @@ error:
        return FN(MULTI(BASE),free)(multi);
 }
 
+/* Divide the elements of "multi" by the corresponding element of "mv"
+ * and return the result.
+ */
+__isl_give MULTI(BASE) *FN(MULTI(BASE),scale_down_multi_val)(
+       __isl_take MULTI(BASE) *multi, __isl_take isl_multi_val *mv)
+{
+       int i;
+
+       if (!multi || !mv)
+               goto error;
+
+       if (!isl_space_tuple_match(multi->space, isl_dim_out,
+                                       mv->space, isl_dim_set))
+               isl_die(isl_multi_val_get_ctx(mv), isl_error_invalid,
+                       "spaces don't match", goto error);
+
+       multi = FN(MULTI(BASE),cow)(multi);
+       if (!multi)
+               return NULL;
+
+       for (i = 0; i < multi->n; ++i) {
+               isl_val *v;
+
+               v = isl_multi_val_get_val(mv, i);
+               multi->p[i] = FN(EL,scale_down_val)(multi->p[i], v);
+               if (!multi->p[i])
+                       goto error;
+       }
+
+       isl_multi_val_free(mv);
+       return multi;
+error:
+       isl_multi_val_free(mv);
+       return FN(MULTI(BASE),free)(multi);
+}
+
 #ifndef NO_MOVE_DIMS
 /* Move the "n" dimensions of "src_type" starting at "src_pos" of "multi"
  * to dimensions of "dst_type" at "dst_pos".
index 4a68922..072d7c5 100644 (file)
--- a/isl_val.c
+++ b/isl_val.c
@@ -851,6 +851,17 @@ error:
        return NULL;
 }
 
+/* Divide "v1" by "v2".
+ *
+ * This is a private copy of isl_val_div for use in the generic
+ * isl_multi_*_scale_down_val instantiated for isl_val.
+ */
+__isl_give isl_val *isl_val_scale_down_val(__isl_take isl_val *v1,
+       __isl_take isl_val *v2)
+{
+       return isl_val_div(v1, v2);
+}
+
 /* Given two integer values "v1" and "v2", check if "v1" is divisible by "v2".
  */
 int isl_val_is_divisible_by(__isl_keep isl_val *v1, __isl_keep isl_val *v2)
index 7ac1bb7..9668d7e 100644 (file)
@@ -51,6 +51,8 @@ __isl_give isl_val *isl_val_zero_on_domain(__isl_take isl_local_space *ls);
 
 __isl_give isl_val *isl_val_scale_val(__isl_take isl_val *v1,
        __isl_take isl_val *v2);
+__isl_give isl_val *isl_val_scale_down_val(__isl_take isl_val *v1,
+       __isl_take isl_val *v2);
 
 int isl_val_matching_params(__isl_keep isl_val *v, __isl_keep isl_space *space);
 int isl_val_check_match_domain_space(__isl_keep isl_val *v,