/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/tools/polly/lib/External/isl/isl_val_sioimath.c
Line | Count | Source (jump to first uncovered line) |
1 | | #include <isl_val_private.h> |
2 | | |
3 | | /* Return a reference to an isl_val representing the unsigned |
4 | | * integer value stored in the "n" chunks of size "size" at "chunks". |
5 | | * The least significant chunk is assumed to be stored first. |
6 | | */ |
7 | | __isl_give isl_val *isl_val_int_from_chunks(isl_ctx *ctx, size_t n, |
8 | | size_t size, const void *chunks) |
9 | 20.4k | { |
10 | 20.4k | isl_val *v; |
11 | 20.4k | |
12 | 20.4k | v = isl_val_alloc(ctx); |
13 | 20.4k | if (!v) |
14 | 0 | return NULL; |
15 | 20.4k | |
16 | 20.4k | impz_import(isl_sioimath_reinit_big(v->n), n, -1, size, 0, 0, chunks); |
17 | 20.4k | isl_sioimath_try_demote(v->n); |
18 | 20.4k | isl_int_set_si(v->d, 1); |
19 | 20.4k | |
20 | 20.4k | return v; |
21 | 20.4k | } |
22 | | |
23 | | /* Store a representation of the absolute value of the numerator of "v" |
24 | | * in terms of chunks of size "size" at "chunks". |
25 | | * The least significant chunk is stored first. |
26 | | * The number of chunks in the result can be obtained by calling |
27 | | * isl_val_n_abs_num_chunks. The user is responsible for allocating |
28 | | * enough memory to store the results. |
29 | | * |
30 | | * In the special case of a zero value, isl_val_n_abs_num_chunks will |
31 | | * return one, while impz_export will not fill in any chunks. We therefore |
32 | | * do it ourselves. |
33 | | */ |
34 | | int isl_val_get_abs_num_chunks(__isl_keep isl_val *v, size_t size, |
35 | | void *chunks) |
36 | 3.89k | { |
37 | 3.89k | isl_sioimath_scratchspace_t scratch; |
38 | 3.89k | |
39 | 3.89k | if (!v || !chunks) |
40 | 0 | return -1; |
41 | 3.89k | |
42 | 3.89k | if (!isl_val_is_rat(v)) |
43 | 3.89k | isl_die0 (isl_val_get_ctx(v), isl_error_invalid, |
44 | 3.89k | "expecting rational value", return -1); |
45 | 3.89k | |
46 | 3.89k | impz_export(chunks, NULL, -1, size, 0, 0, |
47 | 3.89k | isl_sioimath_bigarg_src(*v->n, &scratch)); |
48 | 3.89k | if (isl_val_is_zero(v)) |
49 | 3.89k | memset(chunks, 0, size); |
50 | 3.89k | |
51 | 3.89k | return 0; |
52 | 3.89k | } |
53 | | |
54 | | /* Return the number of chunks of size "size" required to |
55 | | * store the absolute value of the numerator of "v". |
56 | | */ |
57 | | size_t isl_val_n_abs_num_chunks(__isl_keep isl_val *v, size_t size) |
58 | 3.89k | { |
59 | 3.89k | if (!v) |
60 | 0 | return 0; |
61 | 3.89k | |
62 | 3.89k | if (!isl_val_is_rat(v)) |
63 | 3.89k | isl_die0 (isl_val_get_ctx(v), isl_error_invalid, |
64 | 3.89k | "expecting rational value", return 0); |
65 | 3.89k | |
66 | 3.89k | size *= 8; |
67 | 3.89k | return (isl_sioimath_sizeinbase(*v->n, 2) + size - 1) / size; |
68 | 3.89k | } |