1 /* Check the values of some constants.
2
3 Copyright 2000-2003, 2014 Free Software Foundation, Inc.
4
5 This file is part of the GNU MP Library test suite.
6
7 The GNU MP Library test suite is free software; you can redistribute it
8 and/or modify it under the terms of the GNU General Public License as
9 published by the Free Software Foundation; either version 3 of the License,
10 or (at your option) any later version.
11
12 The GNU MP Library test suite is distributed in the hope that it will be
13 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
15 Public License for more details.
16
17 You should have received a copy of the GNU General Public License along with
18 the GNU MP Library test suite. If not, see https://www.gnu.org/licenses/. */
19
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include "gmp-impl.h"
23 #include "tests.h"
24
25
26 #ifdef ULONG_MAX
27 const char *ulong_max_def = "defined";
28 #else
29 const char *ulong_max_def = "not defined";
30 #endif
31 #ifdef LONG_MAX
32 const char *long_max_def = "defined";
33 #else
34 const char *long_max_def = "not defined";
35 #endif
36
37 #ifdef UINT_MAX
38 const char *uint_max_def = "defined";
39 #else
40 const char *uint_max_def = "not defined";
41 #endif
42 #ifdef INT_MAX
43 const char *int_max_def = "defined";
44 #else
45 const char *int_max_def = "not defined";
46 #endif
47
48 #ifdef USHRT_MAX
49 const char *ushrt_max_def = "defined";
50 #else
51 const char *ushrt_max_def = "not defined";
52 #endif
53 #ifdef SHRT_MAX
54 const char *shrt_max_def = "defined";
55 #else
56 const 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 #define CHECK_LIMB(x,y) CHECK_LIMB_S (x, #x, y, #y)
180 #define CHECK_INT(x,y) CHECK_INT_S (x, #x, y, #y)
181 #define CHECK_CONDITION(x) CHECK_CONDITION_S (x, #x)
182 #define CHECK_BITS(c,t) CHECK_BITS_S (c, #c, t)
183 #define CHECK_MAX(m,n,t,f) CHECK_MAX_S (m, #m, n, #n, t, f)
184 #define CHECK_HIGHBIT(n,t,f) CHECK_HIGHBIT_S (n, #n, t, f)
185
186
187 /* The tests below marked "Bad!" fail on Cray T90 systems, where int, short
188 and mp_size_t are 48 bits or some such but don't wraparound in a plain
189 twos complement fashion. In particular,
190
191 INT_HIGHBIT << 1 = 0xFFFFC00000000000 != 0
192 INT_MAX + 1 = 35184372088832 != INT_MIN = -35184372088832
193
194 This is a bit bizarre, but doesn't matter because GMP doesn't rely on any
195 particular overflow behaviour for int or short, only for mp_limb_t. */
196
197 int
main(int argc,char * argv[])198 main (int argc, char *argv[])
199 {
200 int error = 0;
201
202 CHECK_INT (GMP_LIMB_BYTES, (int) sizeof(mp_limb_t));
203 CHECK_INT (mp_bits_per_limb, GMP_LIMB_BITS);
204
205 CHECK_BITS (GMP_LIMB_BITS, mp_limb_t);
206 CHECK_BITS (BITS_PER_ULONG, unsigned long);
207
208 CHECK_HIGHBIT (GMP_LIMB_HIGHBIT, mp_limb_t, LL("0x%lX","0x%llX"));
209 CHECK_HIGHBIT (ULONG_HIGHBIT, unsigned long, "0x%lX");
210 CHECK_HIGHBIT (UINT_HIGHBIT, unsigned int, "0x%X");
211 CHECK_HIGHBIT (USHRT_HIGHBIT, unsigned short, "0x%hX");
212 #if 0 /* Bad! */
213 CHECK_HIGHBIT (LONG_HIGHBIT, long, "0x%lX");
214 CHECK_HIGHBIT (INT_HIGHBIT, int, "0x%X");
215 CHECK_HIGHBIT (SHRT_HIGHBIT, short, "0x%hX");
216 #endif
217
218 #if 0 /* Bad! */
219 CHECK_MAX (LONG_MAX, LONG_MIN, long, "%ld");
220 CHECK_MAX (INT_MAX, INT_MIN, int, "%d");
221 CHECK_MAX (SHRT_MAX, SHRT_MIN, short, "%hd");
222 #endif
223 CHECK_MAX (ULONG_MAX, 0, unsigned long, "%lu");
224 CHECK_MAX (UINT_MAX, 0, unsigned int, "%u");
225 CHECK_MAX (USHRT_MAX, 0, unsigned short, "%hu");
226 #if 0 /* Bad! */
227 CHECK_MAX (MP_SIZE_T_MAX, MP_SIZE_T_MIN, mp_size_t, SS("%d","%ld"));
228 #endif
229
230 /* UHWtype should have at least enough bits for half a UWtype */
231 {
232 int bits_per_UWtype, bits_per_UHWtype;
233 CALC_BITS (bits_per_UWtype, UWtype);
234 CALC_BITS (bits_per_UHWtype, UHWtype);
235 CHECK_CONDITION (2*bits_per_UHWtype >= bits_per_UWtype);
236 }
237
238 ASSERT_ALWAYS_LIMB (MODLIMB_INVERSE_3);
239 {
240 mp_limb_t modlimb_inverse_3_calc;
241 binvert_limb (modlimb_inverse_3_calc, CNST_LIMB(3));
242 ASSERT_ALWAYS_LIMB (modlimb_inverse_3_calc);
243 CHECK_LIMB (MODLIMB_INVERSE_3, modlimb_inverse_3_calc);
244 }
245 {
246 mp_limb_t MODLIMB_INVERSE_3_times_3
247 = (MODLIMB_INVERSE_3 * CNST_LIMB(3)) & GMP_NUMB_MASK;
248 CHECK_LIMB (MODLIMB_INVERSE_3_times_3, CNST_LIMB(1));
249 }
250
251 {
252 mp_limb_t hi, lo;
253 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_MAX_DIV3-1,
254 CNST_LIMB(3) << GMP_NAIL_BITS);
255 if (! (hi < 1))
256 {
257 printf ("GMP_NUMB_CEIL_MAX_DIV3 too big\n");
258 error = 1;
259 }
260 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_MAX_DIV3,
261 CNST_LIMB(3) << GMP_NAIL_BITS);
262 if (! (hi >= 1))
263 {
264 printf ("GMP_NUMB_CEIL_MAX_DIV3 too small\n");
265 error = 1;
266 }
267 }
268
269 {
270 mp_limb_t hi, lo;
271 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_2MAX_DIV3-1,
272 CNST_LIMB(3) << GMP_NAIL_BITS);
273 if (! (hi < 2))
274 {
275 printf ("GMP_NUMB_CEIL_2MAX_DIV3 too big\n");
276 error = 1;
277 }
278 hi = refmpn_umul_ppmm (&lo, GMP_NUMB_CEIL_2MAX_DIV3,
279 CNST_LIMB(3) << GMP_NAIL_BITS);
280 if (! (hi >= 2))
281 {
282 printf ("GMP_NUMB_CEIL_2MAX_DIV3 too small\n");
283 error = 1;
284 }
285 }
286
287 #ifdef PP_INVERTED
288 {
289 mp_limb_t pp_inverted_calc;
290 invert_limb (pp_inverted_calc, PP);
291 CHECK_LIMB (PP_INVERTED, pp_inverted_calc);
292 }
293 #endif
294
295 if (argc >= 2 || error)
296 {
297 int bits;
298
299 printf ("\n");
300 printf ("After gmp.h,\n");
301 printf (" ULONG_MAX %s\n", ulong_max_def);
302 printf (" LONG_MAX %s\n", long_max_def);
303 printf (" UINT_MAX %s\n", uint_max_def);
304 printf (" INT_MAX %s\n", int_max_def);
305 printf (" USHRT_MAX %s\n", ushrt_max_def);
306 printf (" SHRT_MAX %s\n", shrt_max_def);
307 printf ("\n");
308
309 #ifdef _CRAY
310 printf ("_CRAY is defined, so limits.h is being used\n");
311 #endif
312
313 printf ("ULONG_MAX %lX\n", ULONG_MAX);
314 printf ("ULONG_HIGHBIT %lX\n", ULONG_HIGHBIT);
315 printf ("LONG_MAX %lX\n", LONG_MAX);
316 printf ("LONG_MIN %lX\n", LONG_MIN);
317
318 printf ("UINT_MAX %X\n", UINT_MAX);
319 printf ("UINT_HIGHBIT %X\n", UINT_HIGHBIT);
320 printf ("INT_MAX %X\n", INT_MAX);
321 printf ("INT_MIN %X\n", INT_MIN);
322
323 printf ("USHRT_MAX %X\n", USHRT_MAX);
324 printf ("USHRT_HIGHBIT %X\n", USHRT_HIGHBIT);
325 printf ("SHRT_MAX %X\n", SHRT_MAX);
326 printf ("SHRT_MIN %X\n", SHRT_MIN);
327
328 printf ("\n");
329 printf ("Bits\n");
330 CALC_BITS (bits, long); printf (" long %d\n", bits);
331 CALC_BITS (bits, int); printf (" int %d\n", bits);
332 CALC_BITS (bits, short); printf (" short %d\n", bits);
333 CALC_BITS (bits, unsigned long); printf (" unsigned long %d\n", bits);
334 CALC_BITS (bits, unsigned int); printf (" unsigned int %d\n", bits);
335 CALC_BITS (bits, unsigned short); printf (" unsigned short %d\n", bits);
336 CALC_BITS (bits, mp_size_t); printf (" mp_size_t %d\n", bits);
337 }
338
339 if (error)
340 abort ();
341
342 exit (0);
343 }
344