From 5d2531851d8a96864f01980f4dd7b597caced140 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sat, 6 Apr 2013 18:29:01 +0200 Subject: [PATCH] add isl_union_pw_*_scale_val Signed-off-by: Sven Verdoolaege --- doc/user.pod | 8 ++++++ include/isl/polynomial.h | 5 ++++ isl_union_templ.c | 64 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index dae2ef8..f5396fe 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -4805,6 +4805,10 @@ obviously equal, use __isl_give isl_pw_qpolynomial *isl_pw_qpolynomial_pow( __isl_take isl_pw_qpolynomial *pwqp, unsigned exponent); + __isl_give isl_union_pw_qpolynomial * + isl_union_pw_qpolynomial_scale_val( + __isl_take isl_union_pw_qpolynomial *upwqp, + __isl_take isl_val *v); __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_add( __isl_take isl_union_pw_qpolynomial *upwqp1, __isl_take isl_union_pw_qpolynomial *upwqp2); @@ -5017,6 +5021,10 @@ obviously equal, use isl_pw_qpolynomial_fold_scale_val( __isl_take isl_pw_qpolynomial_fold *pwf, __isl_take isl_val *v); + __isl_give isl_union_pw_qpolynomial_fold * + isl_union_pw_qpolynomial_fold_scale_val( + __isl_take isl_union_pw_qpolynomial_fold *upwf, + __isl_take isl_val *v); __isl_give isl_pw_qpolynomial_fold *isl_pw_qpolynomial_fold_add( __isl_take isl_pw_qpolynomial_fold *pwf1, diff --git a/include/isl/polynomial.h b/include/isl/polynomial.h index 4dd14b8..804ab7d 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -477,6 +477,8 @@ __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul( __isl_take isl_union_pw_qpolynomial *upwqp2); __isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_mul_isl_int( __isl_take isl_union_pw_qpolynomial *upwqp, isl_int v); +__isl_give isl_union_pw_qpolynomial *isl_union_pw_qpolynomial_scale_val( + __isl_take isl_union_pw_qpolynomial *upwqp, __isl_take isl_val *v); __isl_give isl_union_set *isl_union_pw_qpolynomial_domain( __isl_take isl_union_pw_qpolynomial *upwqp); @@ -541,6 +543,9 @@ __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_add_unio __isl_take isl_union_pw_qpolynomial *upwqp); __isl_give isl_union_pw_qpolynomial_fold *isl_union_pw_qpolynomial_fold_mul_isl_int( __isl_take isl_union_pw_qpolynomial_fold *upwf, isl_int v); +__isl_give isl_union_pw_qpolynomial_fold * +isl_union_pw_qpolynomial_fold_scale_val( + __isl_take isl_union_pw_qpolynomial_fold *upwf, __isl_take isl_val *v); __isl_give isl_union_set *isl_union_pw_qpolynomial_fold_domain( __isl_take isl_union_pw_qpolynomial_fold *upwf); diff --git a/isl_union_templ.c b/isl_union_templ.c index cd55f4e..65ab08f 100644 --- a/isl_union_templ.c +++ b/isl_union_templ.c @@ -805,6 +805,70 @@ error: return NULL; } +/* Multiply *entry by the isl_val "user". + * + * Return 0 on success and -1 on error. + */ +static int scale_val(void **entry, void *user) +{ + PW **pw = (PW **)entry; + isl_val *v = user; + + *pw = FN(PW,scale_val)(*pw, isl_val_copy(v)); + if (!*pw) + return -1; + + return 0; +} + +/* Multiply "u" by "v" and return the result. + */ +__isl_give UNION *FN(UNION,scale_val)(__isl_take UNION *u, + __isl_take isl_val *v) +{ + if (!u || !v) + goto error; + if (isl_val_is_one(v)) { + isl_val_free(v); + return u; + } + + if (DEFAULT_IS_ZERO && u && isl_val_is_zero(v)) { + UNION *zero; + isl_space *space = FN(UNION,get_space)(u); +#ifdef HAS_TYPE + zero = FN(UNION,ZERO)(space, u->type); +#else + zero = FN(UNION,ZERO)(space); +#endif + FN(UNION,free)(u); + isl_val_free(v); + return zero; + } + + if (!isl_val_is_rat(v)) + isl_die(isl_val_get_ctx(v), isl_error_invalid, + "expecting rational factor", goto error); + + u = FN(UNION,cow)(u); + if (!u) + return NULL; + +#ifdef HAS_TYPE + if (isl_val_is_neg(v)) + u->type = isl_fold_type_negate(u->type); +#endif + if (isl_hash_table_foreach(u->dim->ctx, &u->table, &scale_val, v) < 0) + goto error; + + isl_val_free(v); + return u; +error: + isl_val_free(v); + FN(UNION,free)(u); + return NULL; +} + S(UNION,plain_is_equal_data) { UNION *u2; -- 2.7.4