temporarily make isl_val_int_from_isl_int available
[platform/upstream/isl.git] / isl_power_templ.c
1 #include <isl_val_private.h>
2
3 #define xFN(TYPE,NAME) TYPE ## _ ## NAME
4 #define FN(TYPE,NAME) xFN(TYPE,NAME)
5
6 /* Compute the given non-zero power of "map" and return the result.
7  * If the exponent "exp" is negative, then the -exp th power of the inverse
8  * relation is computed.
9  */
10 __isl_give TYPE *FN(TYPE,fixed_power)(__isl_take TYPE *map, isl_int exp)
11 {
12         isl_ctx *ctx;
13         TYPE *res = NULL;
14         isl_int r;
15
16         if (!map)
17                 return NULL;
18
19         ctx = FN(TYPE,get_ctx)(map);
20         if (isl_int_is_zero(exp))
21                 isl_die(ctx, isl_error_invalid,
22                         "expecting non-zero exponent", goto error);
23
24         if (isl_int_is_neg(exp)) {
25                 isl_int_neg(exp, exp);
26                 map = FN(TYPE,reverse)(map);
27                 return FN(TYPE,fixed_power)(map, exp);
28         }
29
30         isl_int_init(r);
31         for (;;) {
32                 isl_int_fdiv_r(r, exp, ctx->two);
33
34                 if (!isl_int_is_zero(r)) {
35                         if (!res)
36                                 res = FN(TYPE,copy)(map);
37                         else {
38                                 res = FN(TYPE,apply_range)(res,
39                                                           FN(TYPE,copy)(map));
40                                 res = FN(TYPE,coalesce)(res);
41                         }
42                         if (!res)
43                                 break;
44                 }
45
46                 isl_int_fdiv_q(exp, exp, ctx->two);
47                 if (isl_int_is_zero(exp))
48                         break;
49
50                 map = FN(TYPE,apply_range)(map, FN(TYPE,copy)(map));
51                 map = FN(TYPE,coalesce)(map);
52         }
53         isl_int_clear(r);
54
55         FN(TYPE,free)(map);
56         return res;
57 error:
58         FN(TYPE,free)(map);
59         return NULL;
60 }
61
62 /* Compute the given non-zero power of "map" and return the result.
63  * If the exponent "exp" is negative, then the -exp th power of the inverse
64  * relation is computed.
65  */
66 __isl_give TYPE *FN(TYPE,fixed_power_val)(__isl_take TYPE *map,
67         __isl_take isl_val *exp)
68 {
69         if (!map || !exp)
70                 goto error;
71         if (!isl_val_is_int(exp))
72                 isl_die(FN(TYPE,get_ctx)(map), isl_error_invalid,
73                         "expecting integer exponent", goto error);
74         map = FN(TYPE,fixed_power)(map, exp->n);
75         isl_val_free(exp);
76         return map;
77 error:
78         FN(TYPE,free)(map);
79         isl_val_free(exp);
80         return NULL;
81 }