Home | History | Annotate | Download | only in cloog
      1 #ifndef CLOOG_INT_H
      2 #define CLOOG_INT_H
      3 
      4 #include <assert.h>
      5 #include <stdio.h>
      6 #if defined(CLOOG_INT_GMP)
      7 #include <string.h>
      8 #include <gmp.h>
      9 #ifndef mp_get_memory_functions
     10 void mp_get_memory_functions(
     11 		void *(**alloc_func_ptr) (size_t),
     12 		void *(**realloc_func_ptr) (void *, size_t, size_t),
     13 		void (**free_func_ptr) (void *, size_t));
     14 #endif
     15 #endif
     16 
     17 #if defined(__cplusplus)
     18 extern "C"
     19   {
     20 #endif
     21 
     22 #if defined(CLOOG_INT_INT)
     23 typedef int		cloog_int_t;
     24 #define CLOOG_INT_FORMAT	"%d"
     25 #elif defined(CLOOG_INT_LONG)
     26 typedef long		cloog_int_t;
     27 #define CLOOG_INT_FORMAT	"%ld"
     28 #elif defined(CLOOG_INT_LONG_LONG)
     29 typedef long long	cloog_int_t;
     30 #define CLOOG_INT_FORMAT	"%lld"
     31 #elif defined(CLOOG_INT_GMP)
     32 typedef mpz_t		cloog_int_t;
     33 #else
     34 #error "No integer type defined"
     35 #endif
     36 
     37 #if defined(CLOOG_INT_GMP)
     38 
     39 #define cloog_int_init(i)	mpz_init(i)
     40 #define cloog_int_clear(i)	mpz_clear(i);
     41 
     42 #define cloog_int_set(r,i)	mpz_set(r,i)
     43 #define cloog_int_set_si(r,i)	mpz_set_si(r,i)
     44 #define cloog_int_abs(r,i)	mpz_abs(r,i)
     45 #define cloog_int_neg(r,i)	mpz_neg(r,i)
     46 #define cloog_int_swap(i,j)	mpz_swap(i,j)
     47 
     48 #define cloog_int_add(r,i,j)	mpz_add(r,i,j)
     49 #define cloog_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
     50 #define cloog_int_sub(r,i,j)	mpz_sub(r,i,j)
     51 #define cloog_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
     52 #define cloog_int_mul(r,i,j)	mpz_mul(r,i,j)
     53 #define cloog_int_addmul(r,i,j)	mpz_addmul(r,i,j)
     54 #define cloog_int_divexact(r,i,j)	mpz_divexact(r,i,j)
     55 #define cloog_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
     56 #define cloog_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
     57 #define cloog_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
     58 #define cloog_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
     59 #define cloog_int_gcd(r,i,j)	mpz_gcd(r,i,j)
     60 
     61 #define cloog_int_sgn(i)	mpz_sgn(i)
     62 #define cloog_int_cmp(i,j)	mpz_cmp(i,j)
     63 #define cloog_int_abs_cmp(i,j)	mpz_cmpabs(i,j)
     64 #define cloog_int_cmp_si(i,si)	mpz_cmp_si(i,si)
     65 #define cloog_int_eq(i,j)	(mpz_cmp(i,j) == 0)
     66 #define cloog_int_ne(i,j)	(mpz_cmp(i,j) != 0)
     67 #define cloog_int_gt(i,j)	(mpz_cmp(i,j) > 0)
     68 
     69 #define cloog_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)
     70 
     71 #define cloog_int_read(r,s)	mpz_set_str(r,s,10)
     72 typedef void (*cloog_int_print_gmp_free_t)(void *, size_t);
     73 #define cloog_int_print(out,i)						\
     74 	do {								\
     75 		char *s;						\
     76 		cloog_int_print_gmp_free_t gmp_free;			\
     77 		s = mpz_get_str(0, 10, i);				\
     78 		fprintf(out, "%s", s);					\
     79 		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
     80 		(*gmp_free)(s, strlen(s)+1);				\
     81 	} while (0)
     82 
     83 #else
     84 
     85 #define cloog_int_init(i)	((i) = 0)
     86 #define cloog_int_clear(i)	do { } while (0)
     87 
     88 #define cloog_int_set(r,i)	((r) = (i))
     89 #define cloog_int_set_si(r,i)	((r) = (i))
     90 #define cloog_int_abs(r,i)	((r) = (i) > 0 ? (i) : -(i))
     91 #define cloog_int_neg(r,i)	((r) = -(i))
     92 #define cloog_int_swap(i,j)	do {					\
     93 					cloog_int_t _t = i;		\
     94 					i = j;				\
     95 					j = _t;				\
     96 				} while (0)
     97 
     98 #define cloog_int_add(r,i,j)	((r) = (i) + (j))
     99 #define cloog_int_add_ui(r,i,j)	((r) = (i) + (j))
    100 #define cloog_int_sub(r,i,j)	((r) = (i) - (j))
    101 #define cloog_int_sub_ui(r,i,j)	((r) = (i) - (j))
    102 #define cloog_int_mul(r,i,j)	((r) = (i) * (j))
    103 #define cloog_int_addmul(r,i,j)	((r) += (i) * (j))
    104 #define cloog_int_divexact(r,i,j)	((r) = (i) / (j))
    105 #define cloog_int_tdiv_q(r,i,j)	((r) = (i) / (j))
    106 #define cloog_int_fdiv_q(r,i,j)	do {					\
    107 					assert((j) > 0);		\
    108 					(r) = (i) >= 0 ? (i) / (j) :	\
    109 					    -((-(i)+(j)-1)/(j));	\
    110 				} while (0)
    111 #define cloog_int_fdiv_r(r,i,j)	do {					\
    112 					assert((j) > 0);		\
    113 					(r) = (i) >= 0 ? (i) % (j) :	\
    114 					    (j)-1 - ((-(i)+(j)-1)%(j));	\
    115 				} while (0)
    116 #define cloog_int_cdiv_q(r,i,j)	do {					\
    117 					assert((j) > 0);		\
    118 					(r) = (i) >= 0 ?		\
    119 					    ((i)+(j)-1) / (j) :		\
    120 					    -(-(i)/(j));		\
    121 				} while (0)
    122 cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b);
    123 #define cloog_int_gcd(r,i,j)	(r) = cloog_gcd(i,j)
    124 
    125 #define cloog_int_sgn(i)	((i) > 0 ? 1 : (i) < 0 ? -1 : 0)
    126 #define cloog_int_cmp(i,j)	(i - j)
    127 #define cloog_int_abs_cmp(i,j)	(((i) > 0 ? (i) : -(i)) - ((j) > 0 ? (j) : -(j)))
    128 #define cloog_int_cmp_si(i,si)	(i - si)
    129 #define cloog_int_eq(i,j)	((i) == (j))
    130 #define cloog_int_ne(i,j)	((i) != (j))
    131 #define cloog_int_gt(i,j)	((i) > (j))
    132 
    133 #define cloog_int_is_divisible_by(i,j)	((i) % (j) == 0)
    134 
    135 #define cloog_int_read(i,s)	sscanf(s, CLOOG_INT_FORMAT, &i)
    136 #define cloog_int_print(out,i)	fprintf(out, CLOOG_INT_FORMAT, i)
    137 
    138 #endif
    139 
    140 #define cloog_int_is_pos(i)	(cloog_int_sgn(i) > 0)
    141 #define cloog_int_is_neg(i)	(cloog_int_sgn(i) < 0)
    142 #define cloog_int_is_zero(i)	(cloog_int_sgn(i) == 0)
    143 #define cloog_int_is_one(i)	(cloog_int_cmp_si(i,1) == 0)
    144 #define cloog_int_is_neg_one(i)	(cloog_int_cmp_si(i,-1) == 0)
    145 #define cloog_int_gt_si(i,si)	(cloog_int_cmp_si(i,si) > 0)
    146 #define cloog_int_ne_si(i,j)	(cloog_int_cmp_si(i,j) != 0)
    147 #define cloog_int_lt(i,j)	(cloog_int_cmp(i,j) < 0)
    148 #define cloog_int_le(i,j)	(cloog_int_cmp(i,j) <= 0)
    149 #define cloog_int_abs_ne(i,j)	(cloog_int_abs_cmp(i,j) != 0)
    150 #define cloog_int_abs_ge(i,j)	(cloog_int_abs_cmp(i,j) >= 0)
    151 #define cloog_int_abs_lt(i,j)	(cloog_int_abs_cmp(i,j) < 0)
    152 
    153 struct cloog_vec {
    154 	unsigned	size;
    155 	cloog_int_t	*p;
    156 };
    157 
    158 struct cloog_vec *cloog_vec_alloc(unsigned size);
    159 void cloog_vec_free(struct cloog_vec *vec);
    160 
    161 int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len);
    162 void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len);
    163 void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len);
    164 void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
    165 			cloog_int_t m2, cloog_int_t *src2, unsigned len);
    166 void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd);
    167 int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len);
    168 void cloog_seq_normalize(cloog_int_t *p, unsigned len);
    169 
    170 #if defined(__cplusplus)
    171   }
    172 #endif
    173 
    174 #endif
    175