2 #include "../include/cloog/cloog.h"
4 #define ALLOC(type) (type*)malloc(sizeof(type))
5 #define ALLOCN(type,n) (type*)malloc((n)*sizeof(type))
7 #if defined(CLOOG_INT_INT) || \
8 defined(CLOOG_INT_LONG) || \
9 defined(CLOOG_INT_LONG_LONG)
11 cloog_int_t
cloog_gcd(cloog_int_t a
, cloog_int_t b
)
14 cloog_int_t t
= b
% a
;
25 struct cloog_vec
*cloog_vec_alloc(unsigned size
)
28 struct cloog_vec
*vec
;
30 vec
= ALLOC(struct cloog_vec
);
34 vec
->p
= ALLOCN(cloog_int_t
, size
);
39 for (i
= 0; i
< size
; ++i
)
40 cloog_int_init(vec
->p
[i
]);
48 void cloog_vec_free(struct cloog_vec
*vec
)
55 for (i
= 0; i
< vec
->size
; ++i
)
56 cloog_int_clear(vec
->p
[i
]);
61 void cloog_vec_dump(struct cloog_vec
*vec
)
65 for (i
= 0; i
< vec
->size
; ++i
) {
66 cloog_int_print(stderr
, vec
->p
[i
]);
69 fprintf(stderr
, "\n");
72 int cloog_seq_first_non_zero(cloog_int_t
*p
, unsigned len
)
76 for (i
= 0; i
< len
; ++i
)
77 if (!cloog_int_is_zero(p
[i
]))
82 void cloog_seq_neg(cloog_int_t
*dst
, cloog_int_t
*src
, unsigned len
)
85 for (i
= 0; i
< len
; ++i
)
86 cloog_int_neg(dst
[i
], src
[i
]);
89 void cloog_seq_cpy(cloog_int_t
*dst
, cloog_int_t
*src
, unsigned len
)
92 for (i
= 0; i
< len
; ++i
)
93 cloog_int_set(dst
[i
], src
[i
]);
96 static void cloog_seq_scale_down(cloog_int_t
*dst
, cloog_int_t
*src
, cloog_int_t m
, unsigned len
)
99 for (i
= 0; i
< len
; ++i
)
100 cloog_int_divexact(dst
[i
], src
[i
], m
);
103 void cloog_seq_combine(cloog_int_t
*dst
, cloog_int_t m1
, cloog_int_t
*src1
,
104 cloog_int_t m2
, cloog_int_t
*src2
, unsigned len
)
110 for (i
= 0; i
< len
; ++i
) {
111 cloog_int_mul(tmp
, m1
, src1
[i
]);
112 cloog_int_addmul(tmp
, m2
, src2
[i
]);
113 cloog_int_set(dst
[i
], tmp
);
115 cloog_int_clear(tmp
);
118 static int cloog_seq_abs_min_non_zero(cloog_int_t
*p
, unsigned len
)
120 int i
, min
= cloog_seq_first_non_zero(p
, len
);
123 for (i
= min
+ 1; i
< len
; ++i
) {
124 if (cloog_int_is_zero(p
[i
]))
126 if (cloog_int_abs_lt(p
[i
], p
[min
]))
132 void cloog_seq_gcd(cloog_int_t
*p
, unsigned len
, cloog_int_t
*gcd
)
134 int i
, min
= cloog_seq_abs_min_non_zero(p
, len
);
137 cloog_int_set_si(*gcd
, 0);
140 cloog_int_abs(*gcd
, p
[min
]);
141 for (i
= 0; cloog_int_cmp_si(*gcd
, 1) > 0 && i
< len
; ++i
) {
144 if (cloog_int_is_zero(p
[i
]))
146 cloog_int_gcd(*gcd
, *gcd
, p
[i
]);
150 int cloog_seq_is_neg(cloog_int_t
*p1
, cloog_int_t
*p2
, unsigned len
)
154 for (i
= 0; i
< len
; ++i
) {
155 if (cloog_int_abs_ne(p1
[i
], p2
[i
]))
157 if (cloog_int_is_zero(p1
[i
]))
159 if (cloog_int_eq(p1
[i
], p2
[i
]))
165 void cloog_seq_normalize(cloog_int_t
*p
, unsigned len
)
173 cloog_seq_gcd(p
, len
, &gcd
);
174 if (!cloog_int_is_zero(gcd
) && !cloog_int_is_one(gcd
))
175 cloog_seq_scale_down(p
, p
, gcd
, len
);
176 cloog_int_clear(gcd
);