1*5971e316Smrg #include <string.h>
2*5971e316Smrg #include <isl/val_gmp.h>
3*5971e316Smrg #include <isl_val_private.h>
4*5971e316Smrg
5*5971e316Smrg /* Return a reference to an isl_val representing the integer "z".
6*5971e316Smrg */
isl_val_int_from_gmp(isl_ctx * ctx,mpz_t z)7*5971e316Smrg __isl_give isl_val *isl_val_int_from_gmp(isl_ctx *ctx, mpz_t z)
8*5971e316Smrg {
9*5971e316Smrg isl_val *v;
10*5971e316Smrg
11*5971e316Smrg v = isl_val_alloc(ctx);
12*5971e316Smrg if (!v)
13*5971e316Smrg return NULL;
14*5971e316Smrg
15*5971e316Smrg isl_int_set(v->n, z);
16*5971e316Smrg isl_int_set_si(v->d, 1);
17*5971e316Smrg
18*5971e316Smrg return v;
19*5971e316Smrg }
20*5971e316Smrg
21*5971e316Smrg /* Return a reference to an isl_val representing the rational value "n"/"d".
22*5971e316Smrg */
isl_val_from_gmp(isl_ctx * ctx,const mpz_t n,const mpz_t d)23*5971e316Smrg __isl_give isl_val *isl_val_from_gmp(isl_ctx *ctx, const mpz_t n, const mpz_t d)
24*5971e316Smrg {
25*5971e316Smrg isl_val *v;
26*5971e316Smrg
27*5971e316Smrg v = isl_val_alloc(ctx);
28*5971e316Smrg if (!v)
29*5971e316Smrg return NULL;
30*5971e316Smrg
31*5971e316Smrg isl_int_set(v->n, n);
32*5971e316Smrg isl_int_set(v->d, d);
33*5971e316Smrg
34*5971e316Smrg return isl_val_normalize(v);
35*5971e316Smrg }
36*5971e316Smrg
37*5971e316Smrg /* Extract the numerator of a rational value "v" in "z".
38*5971e316Smrg *
39*5971e316Smrg * If "v" is not a rational value, then the result is undefined.
40*5971e316Smrg */
isl_val_get_num_gmp(__isl_keep isl_val * v,mpz_t z)41*5971e316Smrg int isl_val_get_num_gmp(__isl_keep isl_val *v, mpz_t z)
42*5971e316Smrg {
43*5971e316Smrg if (!v)
44*5971e316Smrg return -1;
45*5971e316Smrg if (!isl_val_is_rat(v))
46*5971e316Smrg isl_die(isl_val_get_ctx(v), isl_error_invalid,
47*5971e316Smrg "expecting rational value", return -1);
48*5971e316Smrg mpz_set(z, v->n);
49*5971e316Smrg return 0;
50*5971e316Smrg }
51*5971e316Smrg
52*5971e316Smrg /* Extract the denominator of a rational value "v" in "z".
53*5971e316Smrg *
54*5971e316Smrg * If "v" is not a rational value, then the result is undefined.
55*5971e316Smrg */
isl_val_get_den_gmp(__isl_keep isl_val * v,mpz_t z)56*5971e316Smrg int isl_val_get_den_gmp(__isl_keep isl_val *v, mpz_t z)
57*5971e316Smrg {
58*5971e316Smrg if (!v)
59*5971e316Smrg return -1;
60*5971e316Smrg if (!isl_val_is_rat(v))
61*5971e316Smrg isl_die(isl_val_get_ctx(v), isl_error_invalid,
62*5971e316Smrg "expecting rational value", return -1);
63*5971e316Smrg mpz_set(z, v->d);
64*5971e316Smrg return 0;
65*5971e316Smrg }
66*5971e316Smrg
67*5971e316Smrg /* Return a reference to an isl_val representing the unsigned
68*5971e316Smrg * integer value stored in the "n" chunks of size "size" at "chunks".
69*5971e316Smrg * The least significant chunk is assumed to be stored first.
70*5971e316Smrg */
isl_val_int_from_chunks(isl_ctx * ctx,size_t n,size_t size,const void * chunks)71*5971e316Smrg __isl_give isl_val *isl_val_int_from_chunks(isl_ctx *ctx, size_t n,
72*5971e316Smrg size_t size, const void *chunks)
73*5971e316Smrg {
74*5971e316Smrg isl_val *v;
75*5971e316Smrg
76*5971e316Smrg v = isl_val_alloc(ctx);
77*5971e316Smrg if (!v)
78*5971e316Smrg return NULL;
79*5971e316Smrg
80*5971e316Smrg mpz_import(v->n, n, -1, size, 0, 0, chunks);
81*5971e316Smrg isl_int_set_si(v->d, 1);
82*5971e316Smrg
83*5971e316Smrg return v;
84*5971e316Smrg }
85*5971e316Smrg
86*5971e316Smrg /* Return the number of chunks of size "size" required to
87*5971e316Smrg * store the absolute value of the numerator of "v".
88*5971e316Smrg */
isl_val_n_abs_num_chunks(__isl_keep isl_val * v,size_t size)89*5971e316Smrg isl_size isl_val_n_abs_num_chunks(__isl_keep isl_val *v, size_t size)
90*5971e316Smrg {
91*5971e316Smrg if (!v)
92*5971e316Smrg return isl_size_error;
93*5971e316Smrg
94*5971e316Smrg if (!isl_val_is_rat(v))
95*5971e316Smrg isl_die(isl_val_get_ctx(v), isl_error_invalid,
96*5971e316Smrg "expecting rational value", return isl_size_error);
97*5971e316Smrg
98*5971e316Smrg size *= 8;
99*5971e316Smrg return (mpz_sizeinbase(v->n, 2) + size - 1) / size;
100*5971e316Smrg }
101*5971e316Smrg
102*5971e316Smrg /* Store a representation of the absolute value of the numerator of "v"
103*5971e316Smrg * in terms of chunks of size "size" at "chunks".
104*5971e316Smrg * The least significant chunk is stored first.
105*5971e316Smrg * The number of chunks in the result can be obtained by calling
106*5971e316Smrg * isl_val_n_abs_num_chunks. The user is responsible for allocating
107*5971e316Smrg * enough memory to store the results.
108*5971e316Smrg *
109*5971e316Smrg * In the special case of a zero value, isl_val_n_abs_num_chunks will
110*5971e316Smrg * return one, while mpz_export will not fill in any chunks. We therefore
111*5971e316Smrg * do it ourselves.
112*5971e316Smrg */
isl_val_get_abs_num_chunks(__isl_keep isl_val * v,size_t size,void * chunks)113*5971e316Smrg isl_stat isl_val_get_abs_num_chunks(__isl_keep isl_val *v, size_t size,
114*5971e316Smrg void *chunks)
115*5971e316Smrg {
116*5971e316Smrg if (!v || !chunks)
117*5971e316Smrg return isl_stat_error;
118*5971e316Smrg
119*5971e316Smrg if (!isl_val_is_rat(v))
120*5971e316Smrg isl_die(isl_val_get_ctx(v), isl_error_invalid,
121*5971e316Smrg "expecting rational value", return isl_stat_error);
122*5971e316Smrg
123*5971e316Smrg mpz_export(chunks, NULL, -1, size, 0, 0, v->n);
124*5971e316Smrg if (isl_val_is_zero(v))
125*5971e316Smrg memset(chunks, 0, size);
126*5971e316Smrg
127*5971e316Smrg return isl_stat_ok;
128*5971e316Smrg }
129