6
/* define to show we included mp.h */
9
#define MOST_NEG_FIXNUM (-2147483647-1)
10
#define MOST_POSITIVE_FIXNUM (2147483647)
12
#define MP_ALLOCATED(x) MP(x)->_mp_alloc
13
#define MP_SELF(x) MP(x)->_mp_d
14
#define MP_SIZE(x) MP(x)->_mp_size
15
#define MP_LIMB_SIZE sizeof(mp_limb_t)
21
#define MP(x) (&((x)->big.big_mpz_t))
22
#define MP_ASSIGN_OBJECT(u,x) (type_of(x) == t_bignum ? mpz_set(u,MP(x)) : mpz_set_si(u,fix(x)))
24
/* temporary holders to put fixnums in ... */
31
/* for integers which are in the fixnum range, we allocate a temporary
32
place in the stack which we use to convert this into an MP
34
#define SI_TEMP_DECL(w) mpz_int w
36
#define SI_TO_MP(x, temp) (mpz_set_si(MP(temp),(x)), MP(temp))
39
#define INTEGER_TO_MP(x, temp ) \
40
(type_of(x) == t_bignum ? MP(x) : SI_TO_MP(fix(x), temp))
42
#define MPOP(action,function,x1,x2) \
44
function(MP(big_fixnum2) ,x1,x2); \
45
action maybe_replace_big(big_fixnum2); \
49
#define MPOP_DEST(where,function,x1,x2) \
50
do { extern MP_INT *verify_mp(); \
51
function(MP(where),x1,x2); \
52
verify_big_or_zero(where); \
56
#define MYmake_fixnum(action,x) \
57
do{register int CMPt1; \
59
((((CMPt1=(x))+1024)&-2048)==0?small_fixnum(CMPt1):make_fixnum(CMPt1));}while(0)
62
#define addsi(u,a,b) (a >= 0 ? mpz_add_ui(u,b,a) : mpz_sub_ui(u,b,-a))
63
#define addss(u,a,b) addsi(u,a,SI_TO_MP(b,big_fixnum1))
66
#define mulsi(u,s,i) mpz_mul_si(u,i,s)
67
#define mulss(u,s1,s2) mpz_mul_si(u,SI_TO_MP(s1,big_fixnum1),s2)
70
#define subsi(u,a,b) mpz_sub(u,SI_TO_MP(a,big_fixnum1),b)
71
#define subis(u,a,b) (b >= 0 ? mpz_sub_ui(u,a,b) : mpz_add_ui(u,a,-b))
72
#define subss(u,a,b) subis(u,SI_TO_MP(a,big_fixnum1),b)
73
#define shifti(u,a,w) (w>=0 ? mpz_mul_2exp(u,a,w) : mpz_fdiv_q_2exp(u,MP(x),-w))
78
#define cmpii(a,b) mpz_cmp(a,b)
79
#define BIG_SIGN(x) mpz_sgn(MP(x))
80
#define MP_SIGN(x) mpz_sgn(MP(x))
81
#define signe(u) mpz_sgn(u)
82
#define ZERO_BIG(x) (mpz_set_ui(MP(x),0))
83
/* force to be positive or negative according to sign. */
84
#define SET_BIG_SIGN(x,sign) \
85
do{if (sign < 0) {if (big_sign(x) > 0) mpz_neg(MP(x),MP(x)); } \
86
else { if (big_sign(x) < 0) mpz_neg(MP(x),MP(x)); } } while(0)
87
#define MP_LOW(u,n) ((u)->_mp_d)
89
/* the bit length of each word in bignum representation */
92
/* #define MP_COUNT_BITS(u) mpz_sizeinbase(u,2) */
93
#define MP_BITCOUNT(u) mpz_bitcount(u)
94
#define MP_SIZE_IN_BASE2(u) mpz_bitlength(u)
103
#define subis(y,x) (x== (1<<31) ? addii(ABS_MOST_NEGS,y) : addsi(-x,y))
106
#define SI_TO_MP(x,ignore) stoi(x)
108
#define INT_FLAG 0x1010000
110
#define MP_ALLOCATED(x) (x)->big.big_length
111
#define MP_SELF(x) (x)->big.big_self
112
#define MP_LIMB_SIZE (sizeof(long))
115
#define MP_SELF(x) MP(x)._mp_d
118
/* the bit length of each word in bignum representation */
121
/* used for gc protecting */
122
object big_register_1;
125
object make_bignum();
126
object make_integer();
127
#define BIG_SIGN(x) signe(MP(x))
128
#define SET_BIG_SIGN(x,sign) setsigne(MP(x),sign)
129
#define MP(x) ((GEN)((x)->big.big_self))
130
#define MP_START_LOW(u,x,l) u = (x)+l
131
#define MP_START_HIGH(u,x,l) u = (x)+2
132
#define MP_NEXT_UP(u) (*(--(u)))
133
#define MP_NEXT_DOWN(u) (*((u)++))
134
/* ith word from the least significant */
135
#define MP_ITH_WORD(u,i,l) (u)[l-i-1]
136
#define MP_CODE_WORDS 2
137
/* MP_LOW(x,lgef(x)) is the least significant word */
138
#define MP_LOW(x,l) ((x)[(l)-1])
139
/* most significant word if l is the lgef(x) */
140
#define MP_HIGH(x,l) (x)[2]
141
#define MP_ONLY_WORD(u) MP_LOW((u),(MP_CODE_WORDS+1))
144
#define MP_BITCOUNT(u) gen_bitcount(u)
145
#define MP_SIZE_IN_BASE2(u) gen_bitlength(u)
149
#define MP_FIRST(x) ((MP(x))[2])
150
#define MP_SIGN(x) (signe(MP(x)))
151
#define ZERO_BIG(x) \
152
do { (x)->big.big_length = 2; \
153
(x)->big.big_self = gzero;} while(0)
163
#define MPOP(dowith, fun,x1,x2) \
168
dowith make_integer(_xgen); }while(0)
171
#define MPOP_DEST(where ,fun,x1,x2) \
176
gcopy_to_big(_xgen,where); }while(0)