diff options
Diffstat (limited to 'polly/lib/External/isl/isl_multi_bin_val_templ.c')
-rw-r--r-- | polly/lib/External/isl/isl_multi_bin_val_templ.c | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/polly/lib/External/isl/isl_multi_bin_val_templ.c b/polly/lib/External/isl/isl_multi_bin_val_templ.c new file mode 100644 index 000000000000..a7a3913da9b1 --- /dev/null +++ b/polly/lib/External/isl/isl_multi_bin_val_templ.c @@ -0,0 +1,73 @@ +/* + * Copyright 2013 Ecole Normale Superieure + * + * Use of this software is governed by the MIT license + * + * Written by Sven Verdoolaege, + * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France + */ + +/* Apply "fn" to each of the elements of "multi" with as second argument "v". + */ +static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_val)( + __isl_take MULTI(BASE) *multi, + __isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v), + __isl_take isl_val *v) +{ + isl_size n; + int i; + + n = FN(MULTI(BASE),size)(multi); + if (n < 0 || !v) + goto error; + + for (i = 0; i < n; ++i) { + EL *el; + + el = FN(MULTI(BASE),take_at)(multi, i); + el = fn(el, isl_val_copy(v)); + multi = FN(MULTI(BASE),restore_at)(multi, i, el); + } + + isl_val_free(v); + return multi; +error: + isl_val_free(v); + FN(MULTI(BASE),free)(multi); + return NULL; +} + +#undef TYPE +#define TYPE MULTI(BASE) +#include "isl_type_check_match_range_multi_val.c" + +/* Elementwise apply "fn" to "multi" and "mv". + */ +static __isl_give MULTI(BASE) *FN(MULTI(BASE),fn_multi_val)( + __isl_take MULTI(BASE) *multi, + __isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v), + __isl_take isl_multi_val *mv) +{ + isl_size n; + int i; + + n = FN(MULTI(BASE),size)(multi); + if (n < 0 || FN(MULTI(BASE),check_match_range_multi_val)(multi, mv) < 0) + goto error; + + for (i = 0; i < n; ++i) { + isl_val *v; + EL *el; + + v = isl_multi_val_get_val(mv, i); + el = FN(MULTI(BASE),take_at)(multi, i); + el = fn(el, v); + multi = FN(MULTI(BASE),restore_at)(multi, i, el); + } + + isl_multi_val_free(mv); + return multi; +error: + isl_multi_val_free(mv); + return FN(MULTI(BASE),free)(multi); +} |