Annotation of OpenXM_contrib/gmp/mpn/tests/divrem.c, Revision 1.1.1.1
1.1 maekawa 1: #include <stdio.h>
2: #include "gmp.h"
3: #include "gmp-impl.h"
4: #include "longlong.h"
5:
6: #ifndef USG
7: #include <sys/time.h>
8: #include <sys/resource.h>
9:
10: unsigned long
11: cputime ()
12: {
13: struct rusage rus;
14:
15: getrusage (0, &rus);
16: return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
17: }
18: #else
19: #include <time.h>
20:
21: #ifndef CLOCKS_PER_SEC
22: #define CLOCKS_PER_SEC 1000000
23: #endif
24:
25: #if CLOCKS_PER_SEC >= 10000
26: #define CLOCK_TO_MILLISEC(cl) ((cl) / (CLOCKS_PER_SEC / 1000))
27: #else
28: #define CLOCK_TO_MILLISEC(cl) ((cl) * 1000 / CLOCKS_PER_SEC)
29: #endif
30:
31: unsigned long
32: cputime ()
33: {
34: return CLOCK_TO_MILLISEC (clock ());
35: }
36: #endif
37:
38: #define M * 1000000
39:
40: #ifndef CLOCK
41: #if defined (__m88k__)
42: #define CLOCK 20 M
43: #elif defined (__i386__)
44: #define CLOCK (16.666667 M)
45: #elif defined (__m68k__)
46: #define CLOCK (20 M)
47: #elif defined (_IBMR2)
48: #define CLOCK (25 M)
49: #elif defined (__sparc__)
50: #define CLOCK (20 M)
51: #elif defined (__sun__)
52: #define CLOCK (20 M)
53: #elif defined (__mips)
54: #define CLOCK (40 M)
55: #elif defined (__hppa__)
56: #define CLOCK (50 M)
57: #elif defined (__alpha)
58: #define CLOCK (133 M)
59: #else
60: #error "Don't know CLOCK of your machine"
61: #endif
62: #endif
63:
64: #ifndef OPS
65: #define OPS 20000000
66: #endif
67: #ifndef SIZE
68: #define SIZE 100
69: #endif
70: #ifndef TIMES
71: #define TIMES OPS/SIZE
72: #else
73: #undef OPS
74: #define OPS (SIZE*TIMES)
75: #endif
76:
77: main ()
78: {
79: mp_limb_t nptr[2 * SIZE];
80: mp_limb_t dptr[SIZE];
81: mp_limb_t qptr[2 * SIZE];
82: mp_limb_t pptr[2 * SIZE];
83: mp_limb_t rptr[2 * SIZE];
84: mp_size_t nsize, dsize, qsize, rsize, psize;
85: int test;
86: mp_limb_t qlimb;
87:
88: for (test = 0; ; test++)
89: {
90: #ifdef RANDOM
91: nsize = random () % (2 * SIZE) + 1;
92: dsize = random () % nsize + 1;
93: #else
94: nsize = 2 * SIZE;
95: dsize = SIZE;
96: #endif
97:
98: mpn_random2 (nptr, nsize);
99: mpn_random2 (dptr, dsize);
100: dptr[dsize - 1] |= (mp_limb_t) 1 << (BITS_PER_MP_LIMB - 1);
101:
102: MPN_COPY (rptr, nptr, nsize);
103: qlimb = mpn_divrem (qptr, (mp_size_t) 0, rptr, nsize, dptr, dsize);
104: rsize = dsize;
105: qsize = nsize - dsize;
106: qptr[qsize] = qlimb;
107: qsize += qlimb;
108: if (qsize == 0 || qsize > 2 * SIZE)
109: {
110: continue; /* bogus */
111: }
112: else
113: {
114: mp_limb_t cy;
115: if (qsize > dsize)
116: mpn_mul (pptr, qptr, qsize, dptr, dsize);
117: else
118: mpn_mul (pptr, dptr, dsize, qptr, qsize);
119: psize = qsize + dsize;
120: psize -= pptr[psize - 1] == 0;
121: cy = mpn_add (pptr, pptr, psize, rptr, rsize);
122: pptr[psize] = cy;
123: psize += cy;
124: }
125:
126: if (nsize != psize || mpn_cmp (nptr, pptr, nsize) != 0)
127: abort ();
128: }
129: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>