~ubuntu-branches/ubuntu/vivid/gcl/vivid

« back to all changes in this revision

Viewing changes to h/mp.h

  • Committer: Bazaar Package Importer
  • Author(s): Camm Maguire
  • Date: 2002-03-04 14:29:59 UTC
  • Revision ID: james.westby@ubuntu.com-20020304142959-dey14w08kr7lldu3
Tags: upstream-2.5.0.cvs20020219
ImportĀ upstreamĀ versionĀ 2.5.0.cvs20020219

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
 
 
2
 
 
3
#ifdef GMP
 
4
 
 
5
#include "gmp.h"
 
6
/* define to show we included mp.h */
 
7
#define _MP_H  
 
8
 
 
9
#define MOST_NEG_FIXNUM (-2147483647-1)
 
10
#define MOST_POSITIVE_FIXNUM (2147483647)
 
11
 
 
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)
 
16
 
 
17
 
 
18
 
 
19
 
 
20
 
 
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)))
 
23
 
 
24
/* temporary holders to put fixnums in ... */
 
25
 
 
26
typedef struct
 
27
{ MP_INT mpz;
 
28
  mp_limb_t body;
 
29
} mpz_int;
 
30
 
 
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
 
33
*/   
 
34
#define SI_TEMP_DECL(w) mpz_int w
 
35
            
 
36
#define SI_TO_MP(x, temp) (mpz_set_si(MP(temp),(x)), MP(temp))
 
37
            
 
38
 
 
39
#define INTEGER_TO_MP(x, temp ) \
 
40
  (type_of(x) == t_bignum ? MP(x) : SI_TO_MP(fix(x), temp))
 
41
 
 
42
#define MPOP(action,function,x1,x2) \
 
43
  do {  \
 
44
   function(MP(big_fixnum2) ,x1,x2); \
 
45
   action maybe_replace_big(big_fixnum2); \
 
46
  } while(0)
 
47
 
 
48
 
 
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); \
 
53
      } while(0)
 
54
 
 
55
 
 
56
#define MYmake_fixnum(action,x) \
 
57
  do{register int CMPt1; \
 
58
   action \
 
59
   ((((CMPt1=(x))+1024)&-2048)==0?small_fixnum(CMPt1):make_fixnum(CMPt1));}while(0)
 
60
     
 
61
#define addii mpz_add
 
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))
 
64
            
 
65
#define mulii mpz_mul
 
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)
 
68
            
 
69
#define subii mpz_sub
 
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))
 
74
 
 
75
 
 
76
 
 
77
 
 
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)
 
88
     
 
89
/* the bit length of each word in bignum representation */
 
90
#define BIG_RADIX 32
 
91
 
 
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)
 
95
 
 
96
 
 
97
#else
 
98
 
 
99
#include "genpari.h"
 
100
#undef K
 
101
 
 
102
#undef subis
 
103
#define subis(y,x) (x== (1<<31) ? addii(ABS_MOST_NEGS,y) : addsi(-x,y))
 
104
GEN subss();
 
105
 
 
106
#define SI_TO_MP(x,ignore) stoi(x)
 
107
 
 
108
#define INT_FLAG 0x1010000
 
109
 
 
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))
 
113
 
 
114
 
 
115
#define MP_SELF(x) MP(x)._mp_d
 
116
 
 
117
 
 
118
/* the bit length of each word in bignum representation */
 
119
#define BIG_RADIX 32
 
120
 
 
121
/* used for gc protecting */
 
122
object big_register_1;
 
123
 
 
124
object big_minus();
 
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))
 
142
 
 
143
 
 
144
#define MP_BITCOUNT(u) gen_bitcount(u)
 
145
#define MP_SIZE_IN_BASE2(u) gen_bitlength(u)
 
146
  
 
147
  
 
148
  
 
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)
 
154
 
 
155
 
 
156
 
 
157
 
 
158
 
 
159
                           
 
160
 
 
161
GEN addss();
 
162
 
 
163
#define MPOP(dowith, fun,x1,x2) \
 
164
  do{GEN _xgen ; \
 
165
     save_avma ; \
 
166
     _xgen =fun(x1,x2) ;\
 
167
     restore_avma; \
 
168
     dowith make_integer(_xgen);  }while(0)
 
169
 
 
170
 
 
171
#define MPOP_DEST(where ,fun,x1,x2) \
 
172
  do{GEN _xgen ; \
 
173
     save_avma ; \
 
174
     _xgen =fun(x1,x2) ;\
 
175
     restore_avma; \
 
176
     gcopy_to_big(_xgen,where);  }while(0)
 
177
 
 
178
#endif