summaryrefslogtreecommitdiff
path: root/cloog-0.16.3/include/cloog/int.h
blob: 623a1cb646d92b8c85cd5469694d8adef65d25bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#ifndef CLOOG_INT_H
#define CLOOG_INT_H

#include <assert.h>
#include <stdio.h>
#if defined(CLOOG_INT_GMP)
#include <string.h>
#include <gmp.h>
#ifndef mp_get_memory_functions
void mp_get_memory_functions(
		void *(**alloc_func_ptr) (size_t),
		void *(**realloc_func_ptr) (void *, size_t, size_t),
		void (**free_func_ptr) (void *, size_t));
#endif
#endif

#if defined(__cplusplus)
extern "C" 
  {
#endif 

#if defined(CLOOG_INT_INT)
typedef int		cloog_int_t;
#define CLOOG_INT_FORMAT	"%d"
#elif defined(CLOOG_INT_LONG)
typedef long		cloog_int_t;
#define CLOOG_INT_FORMAT	"%ld"
#elif defined(CLOOG_INT_LONG_LONG)
typedef long long	cloog_int_t;
#define CLOOG_INT_FORMAT	"%lld"
#elif defined(CLOOG_INT_GMP)
typedef mpz_t		cloog_int_t;
#else
#error "No integer type defined"
#endif

#if defined(CLOOG_INT_GMP)

#define cloog_int_init(i)	mpz_init(i)
#define cloog_int_clear(i)	mpz_clear(i);

#define cloog_int_set(r,i)	mpz_set(r,i)
#define cloog_int_set_si(r,i)	mpz_set_si(r,i)
#define cloog_int_abs(r,i)	mpz_abs(r,i)
#define cloog_int_neg(r,i)	mpz_neg(r,i)
#define cloog_int_swap(i,j)	mpz_swap(i,j)

#define cloog_int_add(r,i,j)	mpz_add(r,i,j)
#define cloog_int_add_ui(r,i,j)	mpz_add_ui(r,i,j)
#define cloog_int_sub(r,i,j)	mpz_sub(r,i,j)
#define cloog_int_sub_ui(r,i,j)	mpz_sub_ui(r,i,j)
#define cloog_int_mul(r,i,j)	mpz_mul(r,i,j)
#define cloog_int_addmul(r,i,j)	mpz_addmul(r,i,j)
#define cloog_int_divexact(r,i,j)	mpz_divexact(r,i,j)
#define cloog_int_tdiv_q(r,i,j)	mpz_tdiv_q(r,i,j)
#define cloog_int_fdiv_q(r,i,j)	mpz_fdiv_q(r,i,j)
#define cloog_int_fdiv_r(r,i,j)	mpz_fdiv_r(r,i,j)
#define cloog_int_cdiv_q(r,i,j)	mpz_cdiv_q(r,i,j)
#define cloog_int_gcd(r,i,j)	mpz_gcd(r,i,j)

#define cloog_int_sgn(i)	mpz_sgn(i)
#define cloog_int_cmp(i,j)	mpz_cmp(i,j)
#define cloog_int_abs_cmp(i,j)	mpz_cmpabs(i,j)
#define cloog_int_cmp_si(i,si)	mpz_cmp_si(i,si)
#define cloog_int_eq(i,j)	(mpz_cmp(i,j) == 0)
#define cloog_int_ne(i,j)	(mpz_cmp(i,j) != 0)
#define cloog_int_gt(i,j)	(mpz_cmp(i,j) > 0)

#define cloog_int_is_divisible_by(i,j)	mpz_divisible_p(i,j)

#define cloog_int_read(r,s)	mpz_set_str(r,s,10)
typedef void (*cloog_int_print_gmp_free_t)(void *, size_t);
#define cloog_int_print(out,i)						\
	do {								\
		char *s;						\
		cloog_int_print_gmp_free_t gmp_free;			\
		s = mpz_get_str(0, 10, i);				\
		fprintf(out, "%s", s);					\
		mp_get_memory_functions(NULL, NULL, &gmp_free);		\
		(*gmp_free)(s, strlen(s)+1);				\
	} while (0)

#else

#define cloog_int_init(i)	((i) = 0)
#define cloog_int_clear(i)	do { } while (0)

#define cloog_int_set(r,i)	((r) = (i))
#define cloog_int_set_si(r,i)	((r) = (i))
#define cloog_int_abs(r,i)	((r) = (i) > 0 ? (i) : -(i))
#define cloog_int_neg(r,i)	((r) = -(i))
#define cloog_int_swap(i,j)	do {					\
					cloog_int_t _t = i;		\
					i = j;				\
					j = _t;				\
				} while (0)

#define cloog_int_add(r,i,j)	((r) = (i) + (j))
#define cloog_int_add_ui(r,i,j)	((r) = (i) + (j))
#define cloog_int_sub(r,i,j)	((r) = (i) - (j))
#define cloog_int_sub_ui(r,i,j)	((r) = (i) - (j))
#define cloog_int_mul(r,i,j)	((r) = (i) * (j))
#define cloog_int_addmul(r,i,j)	((r) += (i) * (j))
#define cloog_int_divexact(r,i,j)	((r) = (i) / (j))
#define cloog_int_tdiv_q(r,i,j)	((r) = (i) / (j))
#define cloog_int_fdiv_q(r,i,j)	do {					\
					assert((j) > 0);		\
					(r) = (i) >= 0 ? (i) / (j) :	\
					    -((-(i)+(j)-1)/(j));	\
				} while (0)
#define cloog_int_fdiv_r(r,i,j)	do {					\
					assert((j) > 0);		\
					(r) = (i) >= 0 ? (i) % (j) :	\
					    (j)-1 - ((-(i)+(j)-1)%(j));	\
				} while (0)
#define cloog_int_cdiv_q(r,i,j)	do {					\
					assert((j) > 0);		\
					(r) = (i) >= 0 ?		\
					    ((i)+(j)-1) / (j) :		\
					    -(-(i)/(j));		\
				} while (0)
cloog_int_t cloog_gcd(cloog_int_t a, cloog_int_t b);
#define cloog_int_gcd(r,i,j)	(r) = cloog_gcd(i,j)

#define cloog_int_sgn(i)	((i) > 0 ? 1 : (i) < 0 ? -1 : 0)
#define cloog_int_cmp(i,j)	(i - j)
#define cloog_int_abs_cmp(i,j)	(((i) > 0 ? (i) : -(i)) - ((j) > 0 ? (j) : -(j)))
#define cloog_int_cmp_si(i,si)	(i - si)
#define cloog_int_eq(i,j)	((i) == (j))
#define cloog_int_ne(i,j)	((i) != (j))
#define cloog_int_gt(i,j)	((i) > (j))

#define cloog_int_is_divisible_by(i,j)	((i) % (j) == 0)

#define cloog_int_read(i,s)	sscanf(s, CLOOG_INT_FORMAT, &i)
#define cloog_int_print(out,i)	fprintf(out, CLOOG_INT_FORMAT, i)

#endif

#define cloog_int_is_pos(i)	(cloog_int_sgn(i) > 0)
#define cloog_int_is_neg(i)	(cloog_int_sgn(i) < 0)
#define cloog_int_is_zero(i)	(cloog_int_sgn(i) == 0)
#define cloog_int_is_one(i)	(cloog_int_cmp_si(i,1) == 0)
#define cloog_int_is_neg_one(i)	(cloog_int_cmp_si(i,-1) == 0)
#define cloog_int_gt_si(i,si)	(cloog_int_cmp_si(i,si) > 0)
#define cloog_int_ne_si(i,j)	(cloog_int_cmp_si(i,j) != 0)
#define cloog_int_lt(i,j)	(cloog_int_cmp(i,j) < 0)
#define cloog_int_le(i,j)	(cloog_int_cmp(i,j) <= 0)
#define cloog_int_abs_ne(i,j)	(cloog_int_abs_cmp(i,j) != 0)
#define cloog_int_abs_ge(i,j)	(cloog_int_abs_cmp(i,j) >= 0)
#define cloog_int_abs_lt(i,j)	(cloog_int_abs_cmp(i,j) < 0)

struct cloog_vec {
	unsigned	size;
	cloog_int_t	*p;
};

struct cloog_vec *cloog_vec_alloc(unsigned size);
void cloog_vec_free(struct cloog_vec *vec);

int cloog_seq_first_non_zero(cloog_int_t *p, unsigned len);
void cloog_seq_cpy(cloog_int_t *dst, cloog_int_t *src, unsigned len);
void cloog_seq_neg(cloog_int_t *dst, cloog_int_t *src, unsigned len);
void cloog_seq_combine(cloog_int_t *dst, cloog_int_t m1, cloog_int_t *src1,
			cloog_int_t m2, cloog_int_t *src2, unsigned len);
void cloog_seq_gcd(cloog_int_t *p, unsigned len, cloog_int_t *gcd);
int cloog_seq_is_neg(cloog_int_t *p1, cloog_int_t *p2, unsigned len);
void cloog_seq_normalize(cloog_int_t *p, unsigned len);

#if defined(__cplusplus)
  }
#endif 

#endif