From 6ef5393d0c0b4b08b7316769b18e2ae92cd3cbcc Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Wed, 13 Mar 2013 13:08:20 +0100 Subject: [PATCH] generalize isl_multi_aff_add In the short term, this generalization will be useful to implement an isl_multi_aff_sub. Signed-off-by: Sven Verdoolaege --- isl_aff.c | 26 +------------------------- isl_multi_templ.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 25 deletions(-) diff --git a/isl_aff.c b/isl_aff.c index 3acb3f5..dadc332 100644 --- a/isl_aff.c +++ b/isl_aff.c @@ -2677,31 +2677,7 @@ __isl_give isl_pw_multi_aff *isl_pw_multi_aff_identity( __isl_give isl_multi_aff *isl_multi_aff_add(__isl_take isl_multi_aff *maff1, __isl_take isl_multi_aff *maff2) { - int i; - isl_ctx *ctx; - - maff1 = isl_multi_aff_cow(maff1); - if (!maff1 || !maff2) - goto error; - - ctx = isl_multi_aff_get_ctx(maff1); - if (!isl_space_is_equal(maff1->space, maff2->space)) - isl_die(ctx, isl_error_invalid, - "spaces don't match", goto error); - - for (i = 0; i < maff1->n; ++i) { - maff1->p[i] = isl_aff_add(maff1->p[i], - isl_aff_copy(maff2->p[i])); - if (!maff1->p[i]) - goto error; - } - - isl_multi_aff_free(maff2); - return maff1; -error: - isl_multi_aff_free(maff1); - isl_multi_aff_free(maff2); - return NULL; + return isl_multi_aff_bin_op(maff1, maff2, &isl_aff_add); } /* Given two multi-affine expressions A -> B and C -> D, diff --git a/isl_multi_templ.c b/isl_multi_templ.c index 7080493..0156411 100644 --- a/isl_multi_templ.c +++ b/isl_multi_templ.c @@ -794,3 +794,43 @@ error: FN(MULTI(BASE),free)(multi2); return NULL; } + +/* This function is currently only used from isl_aff.c + */ +static __isl_give MULTI(BASE) *FN(MULTI(BASE),bin_op)( + __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2, + __isl_give EL *(*fn)(__isl_take EL *, __isl_take EL *)) + __attribute__ ((unused)); + +/* Pairwise perform "fn" to the elements of "multi1" and "multi2" and + * return the result. + */ +static __isl_give MULTI(BASE) *FN(MULTI(BASE),bin_op)( + __isl_take MULTI(BASE) *multi1, __isl_take MULTI(BASE) *multi2, + __isl_give EL *(*fn)(__isl_take EL *, __isl_take EL *)) +{ + int i; + isl_ctx *ctx; + + multi1 = FN(MULTI(BASE),cow)(multi1); + if (!multi1 || !multi2) + goto error; + + ctx = FN(MULTI(BASE),get_ctx)(multi1); + if (!isl_space_is_equal(multi1->space, multi2->space)) + isl_die(ctx, isl_error_invalid, + "spaces don't match", goto error); + + for (i = 0; i < multi1->n; ++i) { + multi1->p[i] = fn(multi1->p[i], FN(EL,copy)(multi2->p[i])); + if (!multi1->p[i]) + goto error; + } + + FN(MULTI(BASE),free)(multi2); + return multi1; +error: + FN(MULTI(BASE),free)(multi1); + FN(MULTI(BASE),free)(multi2); + return NULL; +} -- 2.7.4