Blame tests/devel/tst-addsub.c

Packit 5c3484
/* Copyright 1996, 2001 Free Software Foundation, Inc.
Packit 5c3484
Packit 5c3484
This file is part of the GNU MP Library test suite.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is free software; you can redistribute it
Packit 5c3484
and/or modify it under the terms of the GNU General Public License as
Packit 5c3484
published by the Free Software Foundation; either version 3 of the License,
Packit 5c3484
or (at your option) any later version.
Packit 5c3484
Packit 5c3484
The GNU MP Library test suite is distributed in the hope that it will be
Packit 5c3484
useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 5c3484
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General
Packit 5c3484
Public License for more details.
Packit 5c3484
Packit 5c3484
You should have received a copy of the GNU General Public License along with
Packit 5c3484
the GNU MP Library test suite.  If not, see https://www.gnu.org/licenses/.  */
Packit 5c3484
Packit 5c3484
#include <stdio.h>
Packit 5c3484
#include <stdlib.h>
Packit 5c3484
#include "gmp.h"
Packit 5c3484
#include "gmp-impl.h"
Packit 5c3484
#include "tests.h"
Packit 5c3484
Packit 5c3484
#define ADD 1
Packit 5c3484
#define SUB 2
Packit 5c3484
Packit 5c3484
#ifndef METHOD
Packit 5c3484
#define METHOD ADD
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if METHOD == ADD
Packit 5c3484
#define REFCALL refmpn_add_n
Packit 5c3484
#define TESTCALL mpn_add_n
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#if METHOD == SUB
Packit 5c3484
#define REFCALL refmpn_sub_n
Packit 5c3484
#define TESTCALL mpn_sub_n
Packit 5c3484
#endif
Packit 5c3484
Packit 5c3484
#define SIZE 100
Packit 5c3484
Packit 5c3484
int
Packit 5c3484
main (int argc, char **argv)
Packit 5c3484
{
Packit 5c3484
  mp_size_t alloc_size, max_size, size, i, cumul_size;
Packit 5c3484
  mp_ptr s1, s2, dx, dy;
Packit 5c3484
  int s1_align, s2_align, d_align;
Packit 5c3484
  long pass, n_passes;
Packit 5c3484
  mp_limb_t cx, cy;
Packit 5c3484
Packit 5c3484
  max_size = SIZE;
Packit 5c3484
  n_passes = 1000000;
Packit 5c3484
Packit 5c3484
  argc--; argv++;
Packit 5c3484
  if (argc)
Packit 5c3484
    {
Packit 5c3484
      max_size = atol (*argv);
Packit 5c3484
      argc--; argv++;
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  alloc_size = max_size + 32;
Packit 5c3484
  s1 = malloc (alloc_size * GMP_LIMB_BYTES);
Packit 5c3484
  s2 = malloc (alloc_size * GMP_LIMB_BYTES);
Packit 5c3484
  dx = malloc (alloc_size * GMP_LIMB_BYTES);
Packit 5c3484
  dy = malloc (alloc_size * GMP_LIMB_BYTES);
Packit 5c3484
Packit 5c3484
  cumul_size = 0;
Packit 5c3484
  for (pass = 0; pass < n_passes; pass++)
Packit 5c3484
    {
Packit 5c3484
      size = random () % max_size + 1;
Packit 5c3484
Packit 5c3484
      cumul_size += size;
Packit 5c3484
      if (cumul_size >= 1000000)
Packit 5c3484
	{
Packit 5c3484
	  cumul_size -= 1000000;
Packit 5c3484
	  printf ("\r%ld", pass); fflush (stdout);
Packit 5c3484
	}
Packit 5c3484
      s1_align = random () % 32;
Packit 5c3484
      s2_align = random () % 32;
Packit 5c3484
      d_align = random () % 32;
Packit 5c3484
Packit 5c3484
      mpn_random2 (s1 + s1_align, size);
Packit 5c3484
      mpn_random2 (s2 + s2_align, size);
Packit 5c3484
Packit 5c3484
      for (i = 0; i < alloc_size; i++)
Packit 5c3484
	dx[i] = dy[i] = i + 0x9876500;
Packit 5c3484
Packit 5c3484
      cx = TESTCALL (dx + d_align, s1 + s1_align, s2 + s2_align, size);
Packit 5c3484
      cy = REFCALL (dy + d_align, s1 + s1_align, s2 + s2_align, size);
Packit 5c3484
Packit 5c3484
      if (cx != cy || mpn_cmp (dx, dy, alloc_size) != 0)
Packit 5c3484
	abort ();
Packit 5c3484
    }
Packit 5c3484
Packit 5c3484
  printf ("%ld passes OK\n", n_passes);
Packit 5c3484
  exit (0);
Packit 5c3484
}