@@ -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>.
@@ -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); \
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".
@@ -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)
@@ -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,