From: Sven Verdoolaege Date: Sun, 5 May 2013 17:00:23 +0000 (+0200) Subject: add isl_qpolynomial_fold_scale_val X-Git-Tag: isl-0.12~73 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fupstream%2Fisl.git;a=commitdiff_plain;h=ca90b151a05f17ccc1c3215ff24dc5d7b9198ff4 add isl_qpolynomial_fold_scale_val Signed-off-by: Sven Verdoolaege --- diff --git a/doc/user.pod b/doc/user.pod index a63f071..7ddf30f 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -4992,6 +4992,9 @@ obviously equal, use __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale( __isl_take isl_qpolynomial_fold *fold, isl_int v); + __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val( + __isl_take isl_qpolynomial_fold *fold, + __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 3439d44..555a2b4 100644 --- a/include/isl/polynomial.h +++ b/include/isl/polynomial.h @@ -294,6 +294,8 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_mul_isl_int( __isl_take isl_qpolynomial_fold *fold, isl_int v); __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale( __isl_take isl_qpolynomial_fold *fold, isl_int v); +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_val *v); __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_move_dims( __isl_take isl_qpolynomial_fold *fold, diff --git a/isl_fold.c b/isl_fold.c index 82cad6f..4b7cd76 100644 --- a/isl_fold.c +++ b/isl_fold.c @@ -1630,3 +1630,50 @@ __isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale( { return isl_qpolynomial_fold_mul_isl_int(fold, v); } + +/* Multiply "fold" by "v". + */ +__isl_give isl_qpolynomial_fold *isl_qpolynomial_fold_scale_val( + __isl_take isl_qpolynomial_fold *fold, __isl_take isl_val *v) +{ + int i; + + if (!fold || !v) + goto error; + + if (isl_val_is_one(v)) { + isl_val_free(v); + return fold; + } + if (isl_val_is_zero(v)) { + isl_qpolynomial_fold *zero; + isl_space *space = isl_qpolynomial_fold_get_domain_space(fold); + zero = isl_qpolynomial_fold_empty(fold->type, space); + isl_qpolynomial_fold_free(fold); + isl_val_free(v); + return zero; + } + if (!isl_val_is_rat(v)) + isl_die(isl_qpolynomial_fold_get_ctx(fold), isl_error_invalid, + "expecting rational factor", goto error); + + fold = isl_qpolynomial_fold_cow(fold); + if (!fold) + goto error; + + if (isl_val_is_neg(v)) + fold->type = isl_fold_type_negate(fold->type); + for (i = 0; i < fold->n; ++i) { + fold->qp[i] = isl_qpolynomial_scale_val(fold->qp[i], + isl_val_copy(v)); + if (!fold->qp[i]) + goto error; + } + + isl_val_free(v); + return fold; +error: + isl_val_free(v); + isl_qpolynomial_fold_free(fold); + return NULL; +}