Annotation of OpenXM_contrib/gmp/mpn/tests/add_n.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "gmp.h"
3: #include "gmp-impl.h"
4:
5: #ifndef USG
6: #include <sys/time.h>
7: #include <sys/resource.h>
8:
9: unsigned long
10: cputime ()
11: {
12: struct rusage rus;
13:
14: getrusage (0, &rus);
15: return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
16: }
17: #else
18: #include <time.h>
19:
20: #ifndef CLOCKS_PER_SEC
21: #define CLOCKS_PER_SEC 1000000
22: #endif
23:
24: #if CLOCKS_PER_SEC >= 10000
25: #define CLOCK_TO_MILLISEC(cl) ((cl) / (CLOCKS_PER_SEC / 1000))
26: #else
27: #define CLOCK_TO_MILLISEC(cl) ((cl) * 1000 / CLOCKS_PER_SEC)
28: #endif
29:
30: unsigned long
31: cputime ()
32: {
33: return CLOCK_TO_MILLISEC (clock ());
34: }
35: #endif
36:
37: #define M * 1000000
38:
39: #ifndef CLOCK
40: #if defined (__m88k__)
41: #define CLOCK 20 M
42: #elif defined (__i386__)
43: #define CLOCK (16.666667 M)
44: #elif defined (__m68k__)
45: #define CLOCK (20 M)
46: #elif defined (_IBMR2)
47: #define CLOCK (25 M)
48: #elif defined (__sparc__)
49: #define CLOCK (20 M)
50: #elif defined (__sun__)
51: #define CLOCK (20 M)
52: #elif defined (__mips)
53: #define CLOCK (40 M)
54: #elif defined (__hppa__)
55: #define CLOCK (50 M)
56: #elif defined (__alpha)
57: #define CLOCK (133 M)
58: #else
59: #error "Don't know CLOCK of your machine"
60: #endif
61: #endif
62:
63: #ifndef OPS
64: #define OPS 10000000
65: #endif
66: #ifndef SIZE
67: #define SIZE 328
68: #endif
69: #ifndef TIMES
70: #define TIMES OPS/SIZE
71: #else
72: #undef OPS
73: #define OPS (SIZE*TIMES)
74: #endif
75:
76:
77: mp_limb_t
78: #if __STDC__
79: refmpn_add_n (mp_ptr res_ptr,
80: mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
81: #else
82: refmpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
83: register mp_ptr res_ptr;
84: register mp_srcptr s1_ptr;
85: register mp_srcptr s2_ptr;
86: mp_size_t size;
87: #endif
88: {
89: register mp_limb_t x, y, cy;
90: register mp_size_t j;
91:
92: /* The loop counter and index J goes from -SIZE to -1. This way
93: the loop becomes faster. */
94: j = -size;
95:
96: /* Offset the base pointers to compensate for the negative indices. */
97: s1_ptr -= j;
98: s2_ptr -= j;
99: res_ptr -= j;
100:
101: cy = 0;
102: do
103: {
104: y = s2_ptr[j];
105: x = s1_ptr[j];
106: y += cy; /* add previous carry to one addend */
107: cy = (y < cy); /* get out carry from that addition */
108: y = x + y; /* add other addend */
109: cy = (y < x) + cy; /* get out carry from that add, combine */
110: res_ptr[j] = y;
111: }
112: while (++j != 0);
113:
114: return cy;
115: }
116:
117: main (argc, argv)
118: int argc;
119: char **argv;
120: {
121: mp_limb_t s1[SIZE];
122: mp_limb_t s2[SIZE];
123: mp_limb_t dx[SIZE+1];
124: mp_limb_t dy[SIZE+1];
125: int cyx, cyy;
126: int i;
127: long t0, t;
128: int test;
129: mp_size_t size;
130:
131: for (test = 0; ; test++)
132: {
133: #ifdef RANDOM
134: size = (random () % SIZE + 1);
135: #else
136: size = SIZE;
137: #endif
138:
139: mpn_random2 (s1, size);
140: mpn_random2 (s2, size);
141:
142: dx[size] = 0x12345678;
143: dy[size] = 0x12345678;
144:
145: #ifdef PRINT
146: mpn_print (s1, size);
147: mpn_print (s2, size);
148: #endif
149: t0 = cputime();
150: for (i = 0; i < TIMES; i++)
151: cyx = refmpn_add_n (dx, s1, s2, size);
152: t = cputime() - t0;
153: #if TIMES != 1
154: printf ("refmpn_add_n: %ldms (%.2f cycles/limb)\n",
155: t,
156: ((double) t * CLOCK) / (OPS * 1000.0));
157: #endif
158: #ifdef PRINT
159: printf ("%d ", cyx); mpn_print (dx, size);
160: #endif
161:
162: t0 = cputime();
163: for (i = 0; i < TIMES; i++)
164: cyx = mpn_add_n (dx, s1, s2, size);
165: t = cputime() - t0;
166: #if TIMES != 1
167: printf ("mpn_add_n: %ldms (%.2f cycles/limb)\n",
168: t,
169: ((double) t * CLOCK) / (OPS * 1000.0));
170: #endif
171: #ifdef PRINT
172: printf ("%d ", cyx); mpn_print (dx, size);
173: #endif
174:
175: #ifndef NOCHECK
176: /* Put garbage in the destination. */
177: for (i = 0; i < size; i++)
178: {
179: dx[i] = 0x7654321;
180: dy[i] = 0x1234567;
181: }
182:
183: cyx = refmpn_add_n (dx, s1, s2, size);
184: cyy = mpn_add_n (dy, s1, s2, size);
185: if (cyx != cyy || mpn_cmp (dx, dy, size) != 0
186: || dx[size] != 0x12345678 || dy[size] != 0x12345678)
187: {
188: #ifndef PRINT
189: printf ("%d ", cyx); mpn_print (dx, size);
190: printf ("%d ", cyy); mpn_print (dy, size);
191: #endif
192: abort();
193: }
194: #endif
195: }
196: }
197:
198: mpn_print (mp_ptr p, mp_size_t size)
199: {
200: mp_size_t i;
201:
202: for (i = size - 1; i >= 0; i--)
203: {
204: printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);
205: #ifdef SPACE
206: if (i != 0)
207: printf (" ");
208: #endif
209: }
210: puts ("");
211: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>