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 int cloog_seq_first_non_zero(cloog_int_t
*p
, unsigned len
)
65 for (i
= 0; i
< len
; ++i
)
66 if (!cloog_int_is_zero(p
[i
]))
71 void cloog_seq_neg(cloog_int_t
*dst
, cloog_int_t
*src
, unsigned len
)
74 for (i
= 0; i
< len
; ++i
)
75 cloog_int_neg(dst
[i
], src
[i
]);
78 void cloog_seq_cpy(cloog_int_t
*dst
, cloog_int_t
*src
, unsigned len
)
81 for (i
= 0; i
< len
; ++i
)
82 cloog_int_set(dst
[i
], src
[i
]);
85 static void cloog_seq_scale_down(cloog_int_t
*dst
, cloog_int_t
*src
, cloog_int_t m
, unsigned len
)
88 for (i
= 0; i
< len
; ++i
)
89 cloog_int_divexact(dst
[i
], src
[i
], m
);
92 void cloog_seq_combine(cloog_int_t
*dst
, cloog_int_t m1
, cloog_int_t
*src1
,
93 cloog_int_t m2
, cloog_int_t
*src2
, unsigned len
)
99 for (i
= 0; i
< len
; ++i
) {
100 cloog_int_mul(tmp
, m1
, src1
[i
]);
101 cloog_int_addmul(tmp
, m2
, src2
[i
]);
102 cloog_int_set(dst
[i
], tmp
);
104 cloog_int_clear(tmp
);
107 static int cloog_seq_abs_min_non_zero(cloog_int_t
*p
, unsigned len
)
109 int i
, min
= cloog_seq_first_non_zero(p
, len
);
112 for (i
= min
+ 1; i
< len
; ++i
) {
113 if (cloog_int_is_zero(p
[i
]))
115 if (cloog_int_abs_lt(p
[i
], p
[min
]))
121 void cloog_seq_gcd(cloog_int_t
*p
, unsigned len
, cloog_int_t
*gcd
)
123 int i
, min
= cloog_seq_abs_min_non_zero(p
, len
);
126 cloog_int_set_si(*gcd
, 0);
129 cloog_int_abs(*gcd
, p
[min
]);
130 for (i
= 0; cloog_int_cmp_si(*gcd
, 1) > 0 && i
< len
; ++i
) {
133 if (cloog_int_is_zero(p
[i
]))
135 cloog_int_gcd(*gcd
, *gcd
, p
[i
]);
139 int cloog_seq_is_neg(cloog_int_t
*p1
, cloog_int_t
*p2
, unsigned len
)
143 for (i
= 0; i
< len
; ++i
) {
144 if (cloog_int_abs_ne(p1
[i
], p2
[i
]))
146 if (cloog_int_is_zero(p1
[i
]))
148 if (cloog_int_eq(p1
[i
], p2
[i
]))
154 void cloog_seq_normalize(cloog_int_t
*p
, unsigned len
)
162 cloog_seq_gcd(p
, len
, &gcd
);
163 if (!cloog_int_is_zero(gcd
) && !cloog_int_is_one(gcd
))
164 cloog_seq_scale_down(p
, p
, gcd
, len
);
165 cloog_int_clear(gcd
);