brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 9b9e73d Raw
69 lines · c
1#include <isl_val_private.h>2 3/* Return a reference to an isl_val representing the unsigned4 * 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{10	isl_val *v;11 12	v = isl_val_alloc(ctx);13	if (!v)14		return NULL;15 16	impz_import(isl_sioimath_reinit_big(v->n), n, -1, size, 0, 0, chunks);17	isl_sioimath_try_demote(v->n);18	isl_int_set_si(v->d, 1);19 20	return v;21}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 calling27 * isl_val_n_abs_num_chunks.  The user is responsible for allocating28 * enough memory to store the results.29 *30 * In the special case of a zero value, isl_val_n_abs_num_chunks will31 * return one, while impz_export will not fill in any chunks.  We therefore32 * do it ourselves.33 */34isl_stat isl_val_get_abs_num_chunks(__isl_keep isl_val *v, size_t size,35	void *chunks)36{37	isl_sioimath_scratchspace_t scratch;38 39	if (!v || !chunks)40		return isl_stat_error;41 42	if (!isl_val_is_rat(v))43		isl_die(isl_val_get_ctx(v), isl_error_invalid,44			"expecting rational value", return isl_stat_error);45 46	impz_export(chunks, NULL, -1, size, 0, 0,47	    isl_sioimath_bigarg_src(*v->n, &scratch));48	if (isl_val_is_zero(v))49		memset(chunks, 0, size);50 51	return isl_stat_ok;52}53 54/* Return the number of chunks of size "size" required to55 * store the absolute value of the numerator of "v".56 */57isl_size isl_val_n_abs_num_chunks(__isl_keep isl_val *v, size_t size)58{59	if (!v)60		return isl_size_error;61 62	if (!isl_val_is_rat(v))63		isl_die(isl_val_get_ctx(v), isl_error_invalid,64			"expecting rational value", return isl_size_error);65 66	size *= 8;67	return (isl_sioimath_sizeinbase(*v->n, 2) + size - 1) / size;68}69