1#include <isl_int.h>
2
3uint32_t isl_imath_hash(mp_int v, uint32_t hash)
4{
5	unsigned const char *data = (unsigned char *)v->digits;
6	unsigned const char *end = data + v->used * sizeof(v->digits[0]);
7
8	if (v->sign == 1)
9		isl_hash_byte(hash, 0xFF);
10	for (; data < end; ++data)
11		isl_hash_byte(hash, *data);
12	return hash;
13}
14
15/* Try a standard conversion that fits into a long.
16 */
17int isl_imath_fits_slong_p(mp_int op)
18{
19	long out;
20	mp_result res = mp_int_to_int(op, &out);
21	return res == MP_OK;
22}
23
24/* Try a standard conversion that fits into an unsigned long.
25 */
26int isl_imath_fits_ulong_p(mp_int op)
27{
28	unsigned long out;
29	mp_result res = mp_int_to_uint(op, &out);
30	return res == MP_OK;
31}
32
33void isl_imath_addmul_ui(mp_int rop, mp_int op1, unsigned long op2)
34{
35	mpz_t temp;
36	mp_int_init(&temp);
37
38	mp_int_set_uvalue(&temp, op2);
39	mp_int_mul(op1, &temp, &temp);
40	mp_int_add(rop, &temp, rop);
41
42	mp_int_clear(&temp);
43}
44
45void isl_imath_submul_ui(mp_int rop, mp_int op1, unsigned long op2)
46{
47	mpz_t temp;
48	mp_int_init(&temp);
49
50	mp_int_set_uvalue(&temp, op2);
51	mp_int_mul(op1, &temp, &temp);
52	mp_int_sub(rop, &temp, rop);
53
54	mp_int_clear(&temp);
55}
56
57/* Compute the division of lhs by a rhs of type unsigned long, rounding towards
58 * positive infinity (Ceil).
59 */
60void isl_imath_cdiv_q_ui(mp_int rop, mp_int lhs, unsigned long rhs)
61{
62	mpz_t temp;
63	mp_int_init(&temp);
64
65	mp_int_set_uvalue(&temp, rhs);
66	impz_cdiv_q(rop, lhs, &temp);
67
68	mp_int_clear(&temp);
69}
70
71/* Compute the division of lhs by a rhs of type unsigned long, rounding towards
72 * negative infinity (Floor).
73 */
74void isl_imath_fdiv_q_ui(mp_int rop, mp_int lhs, unsigned long rhs)
75{
76	mpz_t temp;
77	mp_int_init(&temp);
78
79	mp_int_set_uvalue(&temp, rhs);
80	impz_fdiv_q(rop, lhs, &temp);
81
82	mp_int_clear(&temp);
83}
84