2
Copyright 1996, 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
4
This file is part of the GNU MP Library.
6
The GNU MP Library is free software; you can redistribute it and/or modify
7
it under the terms of the GNU Lesser General Public License as published by
8
the Free Software Foundation; either version 2.1 of the License, or (at your
9
option) any later version.
11
The GNU MP Library is distributed in the hope that it will be useful, but
12
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
13
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
14
License for more details.
16
You should have received a copy of the GNU Lesser General Public License
17
along with the GNU MP Library; see the file COPYING.LIB. If not, write to
18
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
26
#if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
32
if (CLOCKS_PER_SEC < 100000)
33
return clock () * 1000 / CLOCKS_PER_SEC;
34
return clock () / (CLOCKS_PER_SEC / 1000);
37
#include <sys/types.h>
39
#include <sys/resource.h>
47
return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
54
#if defined (__m88k__)
56
#elif defined (__i386__)
57
#define CLOCK (16666667)
58
#elif defined (__m68k__)
60
#elif defined (_IBMR2)
62
#elif defined (__sparc__)
64
#elif defined (__sun__)
66
#elif defined (__mips)
68
#elif defined (__hppa__)
70
#elif defined (__alpha)
73
#error "Don't know CLOCK of your machine"
84
#define TIMES OPS/SIZE
87
#define OPS (SIZE*TIMES)
93
refmpn_sub_n (mp_ptr res_ptr,
94
mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
96
refmpn_sub_n (res_ptr, s1_ptr, s2_ptr, size)
97
register mp_ptr res_ptr;
98
register mp_srcptr s1_ptr;
99
register mp_srcptr s2_ptr;
103
register mp_limb_t x, y, cy;
104
register mp_size_t j;
106
/* The loop counter and index J goes from -SIZE to -1. This way
107
the loop becomes faster. */
110
/* Offset the base pointers to compensate for the negative indices. */
120
y += cy; /* add previous carry to subtrahend */
121
cy = (y < cy); /* get out carry from that addition */
122
y = x - y; /* main subtract */
123
cy = (y > x) + cy; /* get out carry from the subtract, combine */
137
mp_limb_t dx[SIZE+2];
138
mp_limb_t dy[SIZE+2];
145
for (test = 0; ; test++)
147
#if TIMES == 1 && ! defined (PRINT)
148
if (test % (SIZE > 10000 ? 1 : 10000 / SIZE) == 0)
150
printf ("\r%d", test);
156
size = random () % SIZE + 1;
163
dx[size+1] = 0x12345678;
164
dy[size+1] = 0x12345678;
167
mpn_random (s1, size);
168
mpn_random (s2, size);
172
for (i = 0; i < TIMES; i++)
173
refmpn_sub_n (dx+1, s1, s2, size);
175
printf ("refmpn_sub_n: %5ldms (%.2f cycles/limb)\n",
176
t, ((double) t * CLOCK) / (OPS * 1000.0));
180
for (i = 0; i < TIMES; i++)
181
mpn_sub_n (dx+1, s1, s2, size);
183
printf ("mpn_sub_n: %5ldms (%.2f cycles/limb)\n",
184
t, ((double) t * CLOCK) / (OPS * 1000.0));
188
mpn_random2 (s1, size);
189
mpn_random2 (s2, size);
192
mpn_print (s1, size);
193
mpn_print (s2, size);
196
/* Put garbage in the destination. */
197
for (i = 0; i < size; i++)
203
cyx = refmpn_sub_n (dx+1, s1, s2, size);
204
cyy = mpn_sub_n (dy+1, s1, s2, size);
206
printf ("%d ", cyx); mpn_print (dx+1, size);
207
printf ("%d ", cyy); mpn_print (dy+1, size);
209
if (cyx != cyy || mpn_cmp (dx, dy, size+2) != 0
210
|| dx[0] != 0x87654321 || dx[size+1] != 0x12345678)
213
printf ("%d ", cyx); mpn_print (dx+1, size);
214
printf ("%d ", cyy); mpn_print (dy+1, size);
216
printf ("TEST NUMBER %d\n", test);
223
mpn_print (mp_ptr p, mp_size_t size)
227
for (i = size - 1; i >= 0; i--)
229
#ifdef _LONG_LONG_LIMB
230
printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)),
231
(unsigned long) (p[i] >> (BITS_PER_MP_LIMB/2)),
232
(int) (sizeof(mp_limb_t)), (unsigned long) (p[i]));
234
printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);