Annotation of OpenXM_contrib/gmp/tests/t-constants.c, Revision 1.1.1.1
1.1 ohara 1: /* Check the values of some constants.
2:
3: Copyright 2000, 2001, 2002 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 2.1 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; see the file COPYING.LIB. If not, write to
19: the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
20: MA 02111-1307, USA. */
21:
22: #include <stdio.h>
23: #include <stdlib.h>
24: #include "gmp.h"
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, 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%lX"));
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: {
249: mp_limb_t modlimb_inverse_3_calc;
250: modlimb_invert (modlimb_inverse_3_calc, CNST_LIMB(3));
251: CHECK_LIMB (MODLIMB_INVERSE_3 & GMP_NUMB_MASK,
252: modlimb_inverse_3_calc & GMP_NUMB_MASK);
253: }
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: #ifdef PP_INVERTED
262: {
263: mp_limb_t pp_inverted_calc;
264: invert_limb (pp_inverted_calc, PP);
265: CHECK_LIMB (PP_INVERTED, pp_inverted_calc);
266: }
267: #endif
268:
269: if (argc >= 2 || error)
270: {
271: int bits;
272:
273: printf ("\n");
274: printf ("After gmp.h,\n");
275: printf (" ULONG_MAX %s\n", ulong_max_def);
276: printf (" LONG_MAX %s\n", long_max_def);
277: printf (" UINT_MAX %s\n", uint_max_def);
278: printf (" INT_MAX %s\n", int_max_def);
279: printf (" USHRT_MAX %s\n", ushrt_max_def);
280: printf (" SHRT_MAX %s\n", shrt_max_def);
281: printf ("\n");
282:
283: #ifdef _CRAY
284: printf ("_CRAY is defined, so limits.h is being used\n");
285: #endif
286:
287: printf ("ULONG_MAX %lX\n", ULONG_MAX);
288: printf ("ULONG_HIGHBIT %lX\n", ULONG_HIGHBIT);
289: printf ("LONG_MAX %lX\n", LONG_MAX);
290: printf ("LONG_MIN %lX\n", LONG_MIN);
291:
292: printf ("UINT_MAX %X\n", UINT_MAX);
293: printf ("UINT_HIGHBIT %X\n", UINT_HIGHBIT);
294: printf ("INT_MAX %X\n", INT_MAX);
295: printf ("INT_MIN %X\n", INT_MIN);
296:
297: printf ("USHRT_MAX %hX\n", USHRT_MAX);
298: printf ("USHRT_HIGHBIT %hX\n", USHRT_HIGHBIT);
299: printf ("SHRT_MAX %hX\n", SHRT_MAX);
300: printf ("SHRT_MIN %hX\n", SHRT_MIN);
301:
302: printf ("\n");
303: printf ("Bits\n");
304: CALC_BITS (bits, long); printf (" long %d\n", bits);
305: CALC_BITS (bits, int); printf (" int %d\n", bits);
306: CALC_BITS (bits, short); printf (" short %d\n", bits);
307: CALC_BITS (bits, unsigned long); printf (" unsigned long %d\n", bits);
308: CALC_BITS (bits, unsigned int); printf (" unsigned int %d\n", bits);
309: CALC_BITS (bits, unsigned short); printf (" unsigned short %d\n", bits);
310: CALC_BITS (bits, mp_size_t); printf (" mp_size_t %d\n", bits);
311: }
312:
313: if (error)
314: abort ();
315:
316: exit (0);
317: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>