Annotation of OpenXM_contrib/gmp/tests/mpn/t-aors_1.c, Revision 1.1.1.1
1.1 ohara 1: /* Test mpn_add_1 and mpn_sub_1.
2:
3: Copyright 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:
23: #include <stdio.h>
24: #include <stdlib.h>
25:
26: #include "gmp.h"
27: #include "gmp-impl.h"
28: #include "tests.h"
29:
30:
31: #define M GMP_NUMB_MAX
32: #define ASIZE 10
33: #define MAGIC 0x1234
34:
35: #define SETUP() \
36: do { \
37: refmpn_random (got, data[i].size); \
38: got[data[i].size] = MAGIC; \
39: } while (0)
40:
41: #define SETUP_INPLACE() \
42: do { \
43: refmpn_copyi (got, data[i].src, data[i].size); \
44: got[data[i].size] = MAGIC; \
45: } while (0)
46:
47: #define VERIFY(name) \
48: do { \
49: verify (name, i, data[i].src, data[i].n, \
50: got_c, data[i].want_c, \
51: got, data[i].want, data[i].size); \
52: } while (0)
53:
54: typedef mp_limb_t (*mpn_aors_1_t)
55: _PROTO ((mp_ptr, mp_srcptr, mp_size_t, mp_limb_t));
56: mpn_aors_1_t fudge _PROTO ((mpn_aors_1_t));
57:
58:
59: void
60: verify (const char *name, int i,
61: mp_srcptr src, mp_limb_t n,
62: mp_limb_t got_c, mp_limb_t want_c,
63: mp_srcptr got, mp_srcptr want, mp_size_t size)
64: {
65: if (got[size] != MAGIC)
66: {
67: printf ("Overwrite at %s i=%d\n", name, i);
68: abort ();
69: }
70:
71: if (got_c != want_c || ! refmpn_equal_anynail (got, want, size))
72: {
73: printf ("Wrong at %s i=%d size=%ld\n", name, i, size);
74: mpn_trace (" src", src, size);
75: mpn_trace (" n", &n, (mp_size_t) 1);
76: mpn_trace (" got", got, size);
77: mpn_trace (" want", want, size);
78: mpn_trace (" got c", &got_c, (mp_size_t) 1);
79: mpn_trace ("want c", &want_c, (mp_size_t) 1);
80: abort ();
81: }
82: }
83:
84:
85: void
86: check_add_1 (void)
87: {
88: static const struct {
89: mp_size_t size;
90: mp_limb_t n;
91: const mp_limb_t src[ASIZE];
92: mp_limb_t want_c;
93: const mp_limb_t want[ASIZE];
94: } data[] = {
95: { 1, 0, { 0 }, 0, { 0 } },
96: { 1, 0, { 1 }, 0, { 1 } },
97: { 1, 1, { 0 }, 0, { 1 } },
98: { 1, 0, { M }, 0, { M } },
99: { 1, M, { 0 }, 0, { M } },
100: { 1, 1, { 123 }, 0, { 124 } },
101:
102: { 1, 1, { M }, 1, { 0 } },
103: { 1, M, { 1 }, 1, { 0 } },
104: { 1, M, { M }, 1, { M-1 } },
105:
106: { 2, 0, { 0, 0 }, 0, { 0, 0 } },
107: { 2, 0, { 1, 0 }, 0, { 1, 0 } },
108: { 2, 1, { 0, 0 }, 0, { 1, 0 } },
109: { 2, 0, { M, 0 }, 0, { M, 0 } },
110: { 2, M, { 0, 0 }, 0, { M, 0 } },
111: { 2, 1, { M, 0 }, 0, { 0, 1 } },
112: { 2, M, { 1, 0 }, 0, { 0, 1 } },
113: { 2, M, { M, 0 }, 0, { M-1, 1 } },
114: { 2, M, { M, 0 }, 0, { M-1, 1 } },
115:
116: { 2, 1, { M, M }, 1, { 0, 0 } },
117: { 2, M, { 1, M }, 1, { 0, 0 } },
118: { 2, M, { M, M }, 1, { M-1, 0 } },
119: { 2, M, { M, M }, 1, { M-1, 0 } },
120:
121: { 3, 1, { M, M, M }, 1, { 0, 0, 0 } },
122: { 3, M, { 1, M, M }, 1, { 0, 0, 0 } },
123: { 3, M, { M, M, M }, 1, { M-1, 0, 0 } },
124: { 3, M, { M, M, M }, 1, { M-1, 0, 0 } },
125:
126: { 4, 1, { M, M, M, M }, 1, { 0, 0, 0, 0 } },
127: { 4, M, { 1, M, M, M }, 1, { 0, 0, 0, 0 } },
128: { 4, M, { M, M, M, M }, 1, { M-1, 0, 0, 0 } },
129: { 4, M, { M, M, M, M }, 1, { M-1, 0, 0, 0 } },
130:
131: { 4, M, { M, 0, M, M }, 0, { M-1, 1, M, M } },
132: { 4, M, { M, M-1, M, M }, 0, { M-1, M, M, M } },
133:
134: { 4, M, { M, M, 0, M }, 0, { M-1, 0, 1, M } },
135: { 4, M, { M, M, M-1, M }, 0, { M-1, 0, M, M } },
136: };
137:
138: mp_limb_t got[ASIZE];
139: mp_limb_t got_c;
140: int i;
141:
142: for (i = 0; i < numberof (data); i++)
143: {
144: SETUP ();
145: got_c = mpn_add_1 (got, data[i].src, data[i].size, data[i].n);
146: VERIFY ("check_add_1 (separate)");
147:
148: SETUP_INPLACE ();
149: got_c = mpn_add_1 (got, got, data[i].size, data[i].n);
150: VERIFY ("check_add_1 (in-place)");
151:
152: if (data[i].n == 1)
153: {
154: SETUP ();
155: got_c = mpn_add_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
156: VERIFY ("check_add_1 (separate, const 1)");
157:
158: SETUP_INPLACE ();
159: got_c = mpn_add_1 (got, got, data[i].size, CNST_LIMB(1));
160: VERIFY ("check_add_1 (in-place, const 1)");
161: }
162:
163: /* Same again on functions, not inlines. */
164: SETUP ();
165: got_c = (*fudge(mpn_add_1)) (got, data[i].src, data[i].size, data[i].n);
166: VERIFY ("check_add_1 (function, separate)");
167:
168: SETUP_INPLACE ();
169: got_c = (*fudge(mpn_add_1)) (got, got, data[i].size, data[i].n);
170: VERIFY ("check_add_1 (function, in-place)");
171: }
172: }
173:
174: void
175: check_sub_1 (void)
176: {
177: static const struct {
178: mp_size_t size;
179: mp_limb_t n;
180: const mp_limb_t src[ASIZE];
181: mp_limb_t want_c;
182: const mp_limb_t want[ASIZE];
183: } data[] = {
184: { 1, 0, { 0 }, 0, { 0 } },
185: { 1, 0, { 1 }, 0, { 1 } },
186: { 1, 1, { 1 }, 0, { 0 } },
187: { 1, 0, { M }, 0, { M } },
188: { 1, 1, { M }, 0, { M-1 } },
189: { 1, 1, { 123 }, 0, { 122 } },
190:
191: { 1, 1, { 0 }, 1, { M } },
192: { 1, M, { 0 }, 1, { 1 } },
193:
194: { 2, 0, { 0, 0 }, 0, { 0, 0 } },
195: { 2, 0, { 1, 0 }, 0, { 1, 0 } },
196: { 2, 1, { 1, 0 }, 0, { 0, 0 } },
197: { 2, 0, { M, 0 }, 0, { M, 0 } },
198: { 2, 1, { M, 0 }, 0, { M-1, 0 } },
199: { 2, 1, { 123, 0 }, 0, { 122, 0 } },
200:
201: { 2, 1, { 0, 0 }, 1, { M, M } },
202: { 2, M, { 0, 0 }, 1, { 1, M } },
203:
204: { 3, 0, { 0, 0, 0 }, 0, { 0, 0, 0 } },
205: { 3, 0, { 123, 0, 0 }, 0, { 123, 0, 0 } },
206:
207: { 3, 1, { 0, 0, 0 }, 1, { M, M, M } },
208: { 3, M, { 0, 0, 0 }, 1, { 1, M, M } },
209:
210: { 4, 1, { 0, 0, 0, 0 }, 1, { M, M, M, M } },
211: { 4, M, { 0, 0, 0, 0 }, 1, { 1, M, M, M } },
212:
213: { 4, 1, { 0, 0, 1, 42 }, 0, { M, M, 0, 42 } },
214: { 4, M, { 0, 0, 123, 24 }, 0, { 1, M, 122, 24 } },
215: };
216:
217: mp_limb_t got[ASIZE];
218: mp_limb_t got_c;
219: int i;
220:
221: for (i = 0; i < numberof (data); i++)
222: {
223: SETUP ();
224: got_c = mpn_sub_1 (got, data[i].src, data[i].size, data[i].n);
225: VERIFY ("check_sub_1 (separate)");
226:
227: SETUP_INPLACE ();
228: got_c = mpn_sub_1 (got, got, data[i].size, data[i].n);
229: VERIFY ("check_sub_1 (in-place)");
230:
231: if (data[i].n == 1)
232: {
233: SETUP ();
234: got_c = mpn_sub_1 (got, data[i].src, data[i].size, CNST_LIMB(1));
235: VERIFY ("check_sub_1 (separate, const 1)");
236:
237: SETUP_INPLACE ();
238: got_c = mpn_sub_1 (got, got, data[i].size, CNST_LIMB(1));
239: VERIFY ("check_sub_1 (in-place, const 1)");
240: }
241:
242: /* Same again on functions, not inlines. */
243: SETUP ();
244: got_c = (*fudge(mpn_sub_1)) (got, data[i].src, data[i].size, data[i].n);
245: VERIFY ("check_sub_1 (function, separate)");
246:
247: SETUP_INPLACE ();
248: got_c = (*fudge(mpn_sub_1)) (got, got, data[i].size, data[i].n);
249: VERIFY ("check_sub_1 (function, in-place)");
250: }
251: }
252:
253: /* Try to prevent the optimizer inlining. */
254: mpn_aors_1_t
255: fudge (mpn_aors_1_t f)
256: {
257: return f;
258: }
259:
260: int
261: main (void)
262: {
263: tests_start ();
264: mp_trace_base = -16;
265:
266: check_add_1 ();
267: check_sub_1 ();
268:
269: tests_end ();
270: exit (0);
271: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>