github.com/aergoio/aergo@v1.3.1/libtool/src/gmp-6.1.2/tests/devel/divmod_1.c (about)

     1  /*
     2  Copyright 1996, 1998, 2000, 2001, 2007 Free Software Foundation, Inc.
     3  
     4  This file is part of the GNU MP Library test suite.
     5  
     6  The GNU MP Library test suite is free software; you can redistribute it
     7  and/or modify it under the terms of the GNU General Public License as
     8  published by the Free Software Foundation; either version 3 of the License,
     9  or (at your option) any later version.
    10  
    11  The GNU MP Library test suite is distributed in the hope that it will be
    12  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
    14  Public License for more details.
    15  
    16  You should have received a copy of the GNU General Public License along with
    17  the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
    18  
    19  #include <stdio.h>
    20  #include <stdlib.h>
    21  #include "gmp.h"
    22  #include "gmp-impl.h"
    23  #include "tests.h"
    24  
    25  #if defined (USG) || defined (__SVR4) || defined (_UNICOS) || defined (__hpux)
    26  #include <time.h>
    27  
    28  int
    29  cputime ()
    30  {
    31    if (CLOCKS_PER_SEC < 100000)
    32      return clock () * 1000 / CLOCKS_PER_SEC;
    33    return clock () / (CLOCKS_PER_SEC / 1000);
    34  }
    35  #else
    36  #include <sys/types.h>
    37  #include <sys/time.h>
    38  #include <sys/resource.h>
    39  
    40  int
    41  cputime ()
    42  {
    43    struct rusage rus;
    44  
    45    getrusage (0, &rus);
    46    return rus.ru_utime.tv_sec * 1000 + rus.ru_utime.tv_usec / 1000;
    47  }
    48  #endif
    49  
    50  static void mpn_print (mp_ptr, mp_size_t);
    51  
    52  #define M * 1000000
    53  
    54  #ifndef CLOCK
    55  #error "Don't know CLOCK of your machine"
    56  #endif
    57  
    58  #ifndef OPS
    59  #define OPS 20000000
    60  #endif
    61  #ifndef SIZE
    62  #define SIZE 1000
    63  #endif
    64  #ifndef TIMES
    65  #define TIMES OPS/SIZE
    66  #endif
    67  
    68  #ifndef FSIZE
    69  #define FSIZE SIZE
    70  #endif
    71  
    72  int
    73  main ()
    74  {
    75    mp_limb_t np[SIZE];
    76    mp_limb_t dx[SIZE + FSIZE + 2];
    77    mp_limb_t dy[SIZE + FSIZE + 2];
    78    mp_limb_t dlimb;
    79    mp_size_t nn, fn;
    80    mp_limb_t retx, rety;
    81    int test;
    82  #if TIMES != 1
    83    int i;
    84    long t0, t;
    85    double cyc;
    86  #endif
    87  
    88    for (test = 0; ; test++)
    89      {
    90  #if TIMES == 1 && ! defined (PRINT)
    91        if (test % (SIZE > 100000 ? 1 : 100000 / SIZE) == 0)
    92  	{
    93  	  printf ("\r%u", test);
    94  	  fflush (stdout);
    95  	}
    96  #endif
    97  
    98  #ifdef RANDOM
    99        nn = random () % (SIZE + 1);
   100        fn = random () % (FSIZE + 1);
   101  #else
   102        nn = SIZE;
   103        fn = FSIZE;
   104  #endif
   105  
   106        dx[0] = 0x87654321;
   107        dx[nn + fn + 1] = 0x12345678;
   108        dy[0] = 0x87654321;
   109        dy[nn + fn + 1] = 0x12345678;
   110        mpn_random2 (np, nn);
   111  
   112  #ifdef FIXED_DLIMB
   113        dlimb = FIXED_DLIMB;
   114  #else
   115        do
   116  	{
   117  	  mpn_random2 (&dlimb, 1);
   118  #ifdef FORCE_NORM
   119  	  dlimb |= GMP_NUMB_HIGHBIT;
   120  #endif
   121  #ifdef FORCE_UNNORM
   122  	  dlimb &= GMP_NUMB_MAX >> 1;
   123  #endif
   124  	}
   125        while (dlimb == 0);
   126  #endif
   127  
   128  #if defined (PRINT) || defined (XPRINT)
   129        printf ("N=");
   130        mpn_print (np, nn);
   131        printf ("D=");
   132        mpn_print (&dlimb, 1);
   133        printf ("nn=%ld\n", (long) nn);
   134  #endif
   135  
   136  #if TIMES != 1
   137        t0 = cputime();
   138        for (i = 0; i < TIMES; i++)
   139  	mpn_divrem_1 (dx + 1, 0L, np, nn, dlimb);
   140        t = cputime() - t0;
   141        cyc = ((double) t * CLOCK) / (TIMES * nn * 1000.0);
   142        printf ("mpn_divrem_1 int:    %5ldms (%.3f cycles/limb) [%.2f Gb/s]\n",
   143  	      t, cyc,
   144  	      CLOCK/cyc*GMP_LIMB_BITS*GMP_LIMB_BITS/1e9);
   145        t0 = cputime();
   146        for (i = 0; i < TIMES; i++)
   147  	mpn_divrem_1 (dx + 1, fn, np, 0, dlimb);
   148        t = cputime() - t0;
   149        cyc = ((double) t * CLOCK) / (TIMES * fn * 1000.0);
   150        printf ("mpn_divrem_1 frac:   %5ldms (%.3f cycles/limb) [%.2f Gb/s]\n",
   151  	      t, cyc,
   152  	      CLOCK/cyc*GMP_LIMB_BITS*GMP_LIMB_BITS/1e9);
   153  #endif
   154  
   155        retx = refmpn_divrem_1 (dx + 1, fn, np, nn, dlimb);
   156        rety = mpn_divrem_1 (dy + 1, fn, np, nn, dlimb);
   157  
   158  #ifndef NOCHECK
   159        if (retx != rety || mpn_cmp (dx, dy, fn + nn + 2) != 0)
   160  	{
   161  	  printf ("ERROR in test %d, nn=%ld, fn=%ld\n", test, nn, fn);
   162  	  mpn_print (np, nn);
   163  	  mpn_print (&dlimb, 1);
   164  	  printf ("rq: ");
   165  	  mpn_print (dx + 1, nn + fn);
   166  	  printf ("rr: %*lX\n", (int) (2 * sizeof(mp_limb_t)), retx);
   167  	  printf (" q: ");
   168  	  mpn_print (dy + 1, nn + fn);
   169  	  printf (" r: %*lX\n", (int) (2 * sizeof(mp_limb_t)), rety);
   170  	  if (dy[0] != 0x87654321)
   171  	    printf ("clobbered at low end %*lX\n", (int) (2 * sizeof(mp_limb_t)), dy[0]);
   172  	  if (dy[nn + fn + 1] != 0x12345678)
   173  	    printf ("clobbered at high end\n");
   174  	  abort ();
   175  	}
   176  #endif
   177      }
   178  }
   179  
   180  static void
   181  mpn_print (mp_ptr p, mp_size_t size)
   182  {
   183    mp_size_t i;
   184  
   185    for (i = size - 1; i >= 0; i--)
   186      {
   187  #ifdef _LONG_LONG_LIMB
   188        printf ("%0*lX%0*lX", (int) (sizeof(mp_limb_t)),
   189  	      (unsigned long) (p[i] >> (GMP_LIMB_BITS/2)),
   190                (int) (sizeof(mp_limb_t)), (unsigned long) (p[i]));
   191  #else
   192        printf ("%0*lX", (int) (2 * sizeof(mp_limb_t)), p[i]);
   193  #endif
   194  #ifdef SPACE
   195        if (i != 0)
   196  	printf (" ");
   197  #endif
   198      }
   199    puts ("");
   200  }