OLD | NEW |
| (Empty) |
1 /* Check the values of some constants. | |
2 | |
3 Copyright 2000, 2001, 2002, 2003 Free Software Foundation, Inc. | |
4 | |
5 This file is part of the GNU MP Library. | |
6 | |
7 The GNU MP Library is free software; you can redistribute it and/or modify | |
8 it under the terms of the GNU Lesser General Public License as published by | |
9 the Free Software Foundation; either version 3 of the License, or (at your | |
10 option) any later version. | |
11 | |
12 The GNU MP Library is distributed in the hope that it will be useful, but | |
13 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY | |
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public | |
15 License for more details. | |
16 | |
17 You should have received a copy of the GNU Lesser General Public License | |
18 along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */ | |
19 | |
20 #include <stdio.h> | |
21 #include <stdlib.h> | |
22 #include "gmp.h" | |
23 #include "tests.h" | |
24 | |
25 | |
26 #ifdef ULONG_MAX | |
27 char *ulong_max_def = "defined"; | |
28 #else | |
29 char *ulong_max_def = "not defined"; | |
30 #endif | |
31 #ifdef LONG_MAX | |
32 char *long_max_def = "defined"; | |
33 #else | |
34 char *long_max_def = "not defined"; | |
35 #endif | |
36 | |
37 #ifdef UINT_MAX | |
38 char *uint_max_def = "defined"; | |
39 #else | |
40 char *uint_max_def = "not defined"; | |
41 #endif | |
42 #ifdef INT_MAX | |
43 char *int_max_def = "defined"; | |
44 #else | |
45 char *int_max_def = "not defined"; | |
46 #endif | |
47 | |
48 #ifdef USHRT_MAX | |
49 char *ushrt_max_def = "defined"; | |
50 #else | |
51 char *ushrt_max_def = "not defined"; | |
52 #endif | |
53 #ifdef SHRT_MAX | |
54 char *shrt_max_def = "defined"; | |
55 #else | |
56 char *shrt_max_def = "not defined"; | |
57 #endif | |
58 | |
59 #include "gmp-impl.h" | |
60 #include "longlong.h" | |
61 | |
62 | |
63 #ifdef _LONG_LONG_LIMB | |
64 #define LL(l,ll) ll | |
65 #else | |
66 #define LL(l,ll) l | |
67 #endif | |
68 | |
69 #if __GMP_MP_SIZE_T_INT | |
70 #define SS(i,l) i | |
71 #else | |
72 #define SS(i,l) l | |
73 #endif | |
74 | |
75 | |
76 #define CHECK_LIMB_S(x, xname, y, yname) \ | |
77 do { \ | |
78 if ((x) != (y)) \ | |
79 { \ | |
80 printf (LL("%s == %lx, but %s == %lx\n", \ | |
81 "%s == %llx, but %s == %llx\n"), \ | |
82 xname, x, yname, y); \ | |
83 error = 1; \ | |
84 } \ | |
85 } while (0) | |
86 | |
87 #define CHECK_INT_S(x, xname, y, yname) \ | |
88 do { \ | |
89 if ((x) != (y)) \ | |
90 { \ | |
91 printf ("%s == %d, but %s == %d\n", xname, x, yname, y); \ | |
92 error = 1; \ | |
93 } \ | |
94 } while (0) | |
95 | |
96 | |
97 | |
98 #define CHECK_CONDITION_S(x, xname) \ | |
99 do { \ | |
100 if (!(x)) \ | |
101 { \ | |
102 printf ("%s is false\n", xname); \ | |
103 error = 1; \ | |
104 } \ | |
105 } while (0) | |
106 | |
107 | |
108 /* How many bits seem to work in the given type. */ | |
109 #define CALC_BITS(result, type) \ | |
110 do { \ | |
111 type n = 1; \ | |
112 result = 0; \ | |
113 while (n != 0) \ | |
114 { \ | |
115 n <<= 1; \ | |
116 result++; \ | |
117 } \ | |
118 } while (0) | |
119 | |
120 #define CHECK_BITS_S(constant, constant_name, type) \ | |
121 do { \ | |
122 int calculated; \ | |
123 CALC_BITS (calculated, type); \ | |
124 if (calculated != constant) \ | |
125 { \ | |
126 printf ("%s == %d, but calculated %d\n", \ | |
127 constant_name, constant, calculated); \ | |
128 error = 1; \ | |
129 } \ | |
130 } while (0) | |
131 | |
132 | |
133 #define CHECK_HIGHBIT_S(value, value_name, type, format) \ | |
134 do { \ | |
135 type n = value; \ | |
136 if (n == 0) \ | |
137 { \ | |
138 printf ("%s == 0\n", value_name); \ | |
139 error = 1; \ | |
140 } \ | |
141 n <<= 1; \ | |
142 if (n != 0) \ | |
143 { \ | |
144 printf ("%s << 1 = ", value_name); \ | |
145 printf (format, n); \ | |
146 printf (" != 0\n"); \ | |
147 error = 1; \ | |
148 } \ | |
149 } while (0) | |
150 | |
151 | |
152 #define CHECK_MAX_S(max_val, max_name, min_val, min_name, type, format) \ | |
153 do { \ | |
154 type maxval = max_val; \ | |
155 type minval = min_val; \ | |
156 type n = maxval; \ | |
157 n++; \ | |
158 if (n != minval) \ | |
159 { \ | |
160 printf ("%s + 1 = ", max_name); \ | |
161 printf (format, n); \ | |
162 printf (" != %s = ", min_name); \ | |
163 printf (format, minval); \ | |
164 printf ("\n"); \ | |
165 error = 1; \ | |
166 } \ | |
167 if (maxval <= minval) \ | |
168 { \ | |
169 printf ("%s = ", max_name); \ | |
170 printf (format, maxval); \ | |
171 printf (" <= %s = ", min_name); \ | |
172 printf (format, minval); \ | |
173 printf ("\n"); \ | |
174 error = 1; \ | |
175 } \ | |
176 } while (0) | |
177 | |
178 | |
179 #if HAVE_STRINGIZE | |
180 #define CHECK_LIMB(x,y) CHECK_LIMB_S (x, #x, y, #y) | |
181 #define CHECK_INT(x,y) CHECK_INT_S (x, #x, y, #y) | |
182 #define CHECK_CONDITION(x) CHECK_CONDITION_S (x, #x) | |
183 #define CHECK_BITS(c,t) CHECK_BITS_S (c, #c, t) | |
184 #define CHECK_MAX(m,n,t,f) CHECK_MAX_S (m, #m, n, #n, t, f) | |
185 #define CHECK_HIGHBIT(n,t,f) CHECK_HIGHBIT_S (n, #n, t, f) | |
186 #else | |
187 #define CHECK_LIMB(x,y) CHECK_LIMB_S (x, "x", y, "y") | |
188 #define CHECK_INT(x,y) CHECK_INT_S (x, "x", y, "y") | |
189 #define CHECK_CONDITION(x) CHECK_CONDITION_S (x, "x") | |
190 #define CHECK_BITS(c,t) CHECK_BITS_S (c, "c", t) | |
191 #define CHECK_MAX(m,n,t,f) CHECK_MAX_S (m, "m", n, "n", t, f) | |
192 #define CHECK_HIGHBIT(n,t,f) CHECK_HIGHBIT_S (n, "n", t, f) | |
193 #endif | |
194 | |
195 | |
196 /* The tests below marked "Bad!" fail on Cray T90 systems, where int, short | |
197 and mp_size_t are 48 bits or some such but don't wraparound in a plain | |
198 twos complement fashion. In particular, | |
199 | |
200 INT_HIGHBIT << 1 = 0xFFFFC00000000000 != 0 | |
201 INT_MAX + 1 = 35184372088832 != INT_MIN = -35184372088832 | |
202 | |
203 This is a bit bizarre, but doesn't matter because GMP doesn't rely on any | |
204 particular overflow behaviour for int or short, only for mp_limb_t. */ | |
205 | |
206 int | |
207 main (int argc, char *argv[]) | |
208 { | |
209 int error = 0; | |
210 | |
211 CHECK_INT (BYTES_PER_MP_LIMB, (int) sizeof(mp_limb_t)); | |
212 CHECK_INT (mp_bits_per_limb, BITS_PER_MP_LIMB); | |
213 CHECK_INT (__GMP_BITS_PER_MP_LIMB, BITS_PER_MP_LIMB); | |
214 | |
215 CHECK_BITS (BITS_PER_MP_LIMB, mp_limb_t); | |
216 CHECK_BITS (BITS_PER_ULONG, unsigned long); | |
217 | |
218 CHECK_HIGHBIT (GMP_LIMB_HIGHBIT, mp_limb_t, LL("0x%lX","0x%llX")); | |
219 CHECK_HIGHBIT (ULONG_HIGHBIT, unsigned long, "0x%lX"); | |
220 CHECK_HIGHBIT (UINT_HIGHBIT, unsigned int, "0x%X"); | |
221 CHECK_HIGHBIT (USHRT_HIGHBIT, unsigned short, "0x%hX"); | |
222 CHECK_HIGHBIT (LONG_HIGHBIT, long, "0x%lX"); | |
223 #if 0 /* Bad! */ | |
224 CHECK_HIGHBIT (INT_HIGHBIT, int, "0x%X"); | |
225 CHECK_HIGHBIT (SHRT_HIGHBIT, short, "0x%hX"); | |
226 #endif | |
227 | |
228 #if 0 /* Bad! */ | |
229 CHECK_MAX (LONG_MAX, LONG_MIN, long, "%ld"); | |
230 CHECK_MAX (INT_MAX, INT_MIN, int, "%d"); | |
231 CHECK_MAX (SHRT_MAX, SHRT_MIN, short, "%hd"); | |
232 #endif | |
233 CHECK_MAX (ULONG_MAX, 0, unsigned long, "%lu"); | |
234 CHECK_MAX (UINT_MAX, 0, unsigned int, "%u"); | |
235 CHECK_MAX (USHRT_MAX, 0, unsigned short, "%hu"); | |
236 #if 0 /* Bad! */ | |
237 CHECK_MAX (MP_SIZE_T_MAX, MP_SIZE_T_MIN, mp_size_t, SS("%d","%ld")); | |
238 #endif | |
239 | |
240 /* UHWtype should have at least enough bits for half a UWtype */ | |
241 { | |
242 int bits_per_UWtype, bits_per_UHWtype; | |
243 CALC_BITS (bits_per_UWtype, UWtype); | |
244 CALC_BITS (bits_per_UHWtype, UHWtype); | |
245 CHECK_CONDITION (2*bits_per_UHWtype >= bits_per_UWtype); | |
246 } | |
247 | |
248 ASSERT_ALWAYS_LIMB (MODLIMB_INVERSE_3); | |
249 { | |
250 mp_limb_t modlimb_inverse_3_calc; | |
251 binvert_limb (modlimb_inverse_3_calc, CNST_LIMB(3)); | |
252 ASSERT_ALWAYS_LIMB (modlimb_inverse_3_calc); | |
253 CHECK_LIMB (MODLIMB_INVERSE_3, modlimb_inverse_3_calc); | |
254 } | |
255 { | |
256 mp_limb_t MODLIMB_INVERSE_3_times_3 | |
257 = (MODLIMB_INVERSE_3 * CNST_LIMB(3)) & GMP_NUMB_MASK; | |
258 CHECK_LIMB (MODLIMB_INVERSE_3_times_3, CNST_LIMB(1)); | |
259 } | |
260 | |
261 { | |
262 mp_limb_t hi, lo; | |
263 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_MAX_DIV3-1, | |
264 CNST_LIMB(3) << GMP_NAIL_BITS); | |
265 if (! (hi < 1)) | |
266 { | |
267 printf ("GMP_NUMB_CEIL_MAX_DIV3 too big\n"); | |
268 error = 1; | |
269 } | |
270 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_MAX_DIV3, | |
271 CNST_LIMB(3) << GMP_NAIL_BITS); | |
272 if (! (hi >= 1)) | |
273 { | |
274 printf ("GMP_NUMB_CEIL_MAX_DIV3 too small\n"); | |
275 error = 1; | |
276 } | |
277 } | |
278 | |
279 { | |
280 mp_limb_t hi, lo; | |
281 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_2MAX_DIV3-1, | |
282 CNST_LIMB(3) << GMP_NAIL_BITS); | |
283 if (! (hi < 2)) | |
284 { | |
285 printf ("GMP_NUMB_CEIL_2MAX_DIV3 too big\n"); | |
286 error = 1; | |
287 } | |
288 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_2MAX_DIV3, | |
289 CNST_LIMB(3) << GMP_NAIL_BITS); | |
290 if (! (hi >= 2)) | |
291 { | |
292 printf ("GMP_NUMB_CEIL_2MAX_DIV3 too small\n"); | |
293 error = 1; | |
294 } | |
295 } | |
296 | |
297 #ifdef PP_INVERTED | |
298 { | |
299 mp_limb_t pp_inverted_calc; | |
300 invert_limb (pp_inverted_calc, PP); | |
301 CHECK_LIMB (PP_INVERTED, pp_inverted_calc); | |
302 } | |
303 #endif | |
304 | |
305 if (argc >= 2 || error) | |
306 { | |
307 int bits; | |
308 | |
309 printf ("\n"); | |
310 printf ("After gmp.h,\n"); | |
311 printf (" ULONG_MAX %s\n", ulong_max_def); | |
312 printf (" LONG_MAX %s\n", long_max_def); | |
313 printf (" UINT_MAX %s\n", uint_max_def); | |
314 printf (" INT_MAX %s\n", int_max_def); | |
315 printf (" USHRT_MAX %s\n", ushrt_max_def); | |
316 printf (" SHRT_MAX %s\n", shrt_max_def); | |
317 printf ("\n"); | |
318 | |
319 #ifdef _CRAY | |
320 printf ("_CRAY is defined, so limits.h is being used\n"); | |
321 #endif | |
322 | |
323 printf ("ULONG_MAX %lX\n", ULONG_MAX); | |
324 printf ("ULONG_HIGHBIT %lX\n", ULONG_HIGHBIT); | |
325 printf ("LONG_MAX %lX\n", LONG_MAX); | |
326 printf ("LONG_MIN %lX\n", LONG_MIN); | |
327 | |
328 printf ("UINT_MAX %X\n", UINT_MAX); | |
329 printf ("UINT_HIGHBIT %X\n", UINT_HIGHBIT); | |
330 printf ("INT_MAX %X\n", INT_MAX); | |
331 printf ("INT_MIN %X\n", INT_MIN); | |
332 | |
333 printf ("USHRT_MAX %hX\n", USHRT_MAX); | |
334 printf ("USHRT_HIGHBIT %hX\n", USHRT_HIGHBIT); | |
335 printf ("SHRT_MAX %hX\n", SHRT_MAX); | |
336 printf ("SHRT_MIN %hX\n", SHRT_MIN); | |
337 | |
338 printf ("\n"); | |
339 printf ("Bits\n"); | |
340 CALC_BITS (bits, long); printf (" long %d\n", bits); | |
341 CALC_BITS (bits, int); printf (" int %d\n", bits); | |
342 CALC_BITS (bits, short); printf (" short %d\n", bits); | |
343 CALC_BITS (bits, unsigned long); printf (" unsigned long %d\n", bits); | |
344 CALC_BITS (bits, unsigned int); printf (" unsigned int %d\n", bits); | |
345 CALC_BITS (bits, unsigned short); printf (" unsigned short %d\n", bits); | |
346 CALC_BITS (bits, mp_size_t); printf (" mp_size_t %d\n", bits); | |
347 } | |
348 | |
349 if (error) | |
350 abort (); | |
351 | |
352 exit (0); | |
353 } | |
OLD | NEW |