Blame tests/tgeneric.c

Packit 80c72f
/* tgeneric.c -- File for generic tests.
Packit 80c72f
Packit 80c72f
Copyright (C) 2008, 2009, 2010, 2011, 2012 INRIA
Packit 80c72f
Packit 80c72f
This file is part of GNU MPC.
Packit 80c72f
Packit 80c72f
GNU MPC is free software; you can redistribute it and/or modify it under
Packit 80c72f
the terms of the GNU Lesser General Public License as published by the
Packit 80c72f
Free Software Foundation; either version 3 of the License, or (at your
Packit 80c72f
option) any later version.
Packit 80c72f
Packit 80c72f
GNU MPC is distributed in the hope that it will be useful, but WITHOUT ANY
Packit 80c72f
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit 80c72f
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
Packit 80c72f
more details.
Packit 80c72f
Packit 80c72f
You should have received a copy of the GNU Lesser General Public License
Packit 80c72f
along with this program. If not, see http://www.gnu.org/licenses/ .
Packit 80c72f
*/
Packit 80c72f
Packit 80c72f
#include "mpc-tests.h"
Packit 80c72f
Packit 80c72f
/* Warning: unlike the MPFR macro (defined in mpfr-impl.h), this one returns
Packit 80c72f
   true when b is singular */
Packit 80c72f
#define MPFR_CAN_ROUND(b,err,prec,rnd)                                  \
Packit 80c72f
  (mpfr_zero_p (b) || mpfr_inf_p (b)                                    \
Packit 80c72f
   || mpfr_can_round (b, (long)mpfr_get_prec (b) - (err), (rnd),        \
Packit 80c72f
                      GMP_RNDZ, (prec) + ((rnd)==GMP_RNDN)))
Packit 80c72f
Packit 80c72f
/* functions with one input, one output */
Packit 80c72f
static void
Packit 80c72f
tgeneric_cc (mpc_function *function, mpc_ptr op, mpc_ptr rop,
Packit 80c72f
             mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  /* We compute the result with four times the precision and check whether the
Packit 80c72f
     rounding is correct. Error reports in this part of the algorithm might
Packit 80c72f
     still be wrong, though, since there are two consecutive roundings (but we
Packit 80c72f
     try to avoid them).  */
Packit 80c72f
  function->pointer.CC (rop4, op, rnd);
Packit 80c72f
  function->pointer.CC (rop, op, rnd);
Packit 80c72f
Packit 80c72f
  /* can't use the mpfr_can_round function when argument is singular,
Packit 80c72f
     use a custom macro instead. */
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    /* avoid double rounding error */
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  /* rounding failed */
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op);
Packit 80c72f
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cc_c (mpc_function *function, mpc_ptr op, mpc_ptr rop1, mpc_ptr rop2,
Packit 80c72f
   mpc_ptr rop14, mpc_ptr rop24, mpc_ptr rop14rnd, mpc_ptr rop24rnd,
Packit 80c72f
   mpc_rnd_t rnd1, mpc_rnd_t rnd2)
Packit 80c72f
{
Packit 80c72f
   /* same as the previous function, but for mpc functions computing two
Packit 80c72f
      results from one argument                                          */
Packit 80c72f
   known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
   function->pointer.CC_C (rop14, rop24, op, rnd1, rnd2);
Packit 80c72f
   function->pointer.CC_C (rop1,  rop2,  op, rnd1, rnd2);
Packit 80c72f
Packit 80c72f
   if (   MPFR_CAN_ROUND (mpc_realref (rop14), 1, MPC_PREC_RE (rop1),
Packit 80c72f
                          MPC_RND_RE (rnd1))
Packit 80c72f
       && MPFR_CAN_ROUND (mpc_imagref (rop14), 1, MPC_PREC_IM (rop1),
Packit 80c72f
                          MPC_RND_IM (rnd1))
Packit 80c72f
       && MPFR_CAN_ROUND (mpc_realref (rop24), 1, MPC_PREC_RE (rop2),
Packit 80c72f
                          MPC_RND_RE (rnd2))
Packit 80c72f
       && MPFR_CAN_ROUND (mpc_imagref (rop24), 1, MPC_PREC_IM (rop2),
Packit 80c72f
                          MPC_RND_IM (rnd2))) {
Packit 80c72f
     mpc_set (rop14rnd, rop14, rnd1);
Packit 80c72f
     mpc_set (rop24rnd, rop24, rnd2);
Packit 80c72f
   }
Packit 80c72f
   else
Packit 80c72f
     return;
Packit 80c72f
Packit 80c72f
   if (!same_mpc_value (rop1, rop14rnd, ks)) {
Packit 80c72f
      /* rounding failed for first result */
Packit 80c72f
      printf ("Rounding might be incorrect for the first result of %s at\n", function->name);
Packit 80c72f
      MPC_OUT (op);
Packit 80c72f
      printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd1)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd1)));
Packit 80c72f
      printf ("\n%s                     gives ", function->name);
Packit 80c72f
      MPC_OUT (rop1);
Packit 80c72f
      printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
      MPC_OUT (rop14);
Packit 80c72f
      printf ("and is rounded to                  ");
Packit 80c72f
      MPC_OUT (rop14rnd);
Packit 80c72f
      exit (1);
Packit 80c72f
   }
Packit 80c72f
   else if (!same_mpc_value (rop2, rop24rnd, ks)) {
Packit 80c72f
      /* rounding failed for second result */
Packit 80c72f
      printf ("Rounding might be incorrect for the second result of %s at\n", function->name);
Packit 80c72f
      MPC_OUT (op);
Packit 80c72f
      printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd2)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd2)));
Packit 80c72f
      printf ("\n%s                     gives ", function->name);
Packit 80c72f
      MPC_OUT (rop2);
Packit 80c72f
      printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
      MPC_OUT (rop24);
Packit 80c72f
      printf ("and is rounded to                  ");
Packit 80c72f
      MPC_OUT (rop24rnd);
Packit 80c72f
      exit (1);
Packit 80c72f
   }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_fc (mpc_function *function, mpc_ptr op, mpfr_ptr rop,
Packit 80c72f
             mpfr_ptr rop4, mpfr_ptr rop4rnd, mpfr_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  function->pointer.FC (rop4, op, rnd);
Packit 80c72f
  function->pointer.FC (rop, op, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (rop4, 1, mpfr_get_prec (rop), rnd))
Packit 80c72f
    mpfr_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpfr_value (rop, rop4rnd, 1))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op);
Packit 80c72f
  printf ("with rounding mode %s", mpfr_print_rnd_mode (rnd));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPFR_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPFR_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPFR_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cfc (mpc_function *function, mpfr_ptr op1, mpc_ptr op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CFC (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CFC (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPFR_OUT (op1);
Packit 80c72f
  MPC_OUT (op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_ccf (mpc_function *function, mpc_ptr op1, mpfr_ptr op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CCF (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CCF (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  MPFR_OUT (op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
/* for functions with one mpc_t output, two mpc_t inputs */
Packit 80c72f
static void
Packit 80c72f
tgeneric_c_cc (mpc_function *function, mpc_ptr op1, mpc_ptr op2,
Packit 80c72f
	       mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  /* We compute the result with four times the precision and check whether the
Packit 80c72f
     rounding is correct. Error reports in this part of the algorithm might
Packit 80c72f
     still be wrong, though, since there are two consecutive roundings (but we
Packit 80c72f
     try to avoid them).  */
Packit 80c72f
  function->pointer.C_CC (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.C_CC (rop, op1, op2, rnd);
Packit 80c72f
Packit 80c72f
  /* can't use mpfr_can_round when argument is singular */
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    /* avoid double rounding error */
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  /* rounding failed */
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  MPC_OUT (op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cccc (mpc_function *function, mpc_ptr op1, mpc_ptr op2, mpc_ptr op3,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  /* We compute the result with four times the precision and check whether the
Packit 80c72f
     rounding is correct. Error reports in this part of the algorithm might
Packit 80c72f
     still be wrong, though, since there are two consecutive roundings (but we
Packit 80c72f
     try to avoid them).  */
Packit 80c72f
  function->pointer.CCCC (rop4, op1, op2, op3, rnd);
Packit 80c72f
  function->pointer.CCCC (rop, op1, op2, op3, rnd);
Packit 80c72f
Packit 80c72f
  /* can't use mpfr_can_round when argument is singular */
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    /* avoid double rounding error */
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  /* rounding failed */
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  MPC_OUT (op2);
Packit 80c72f
  MPC_OUT (op3);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_ccu (mpc_function *function, mpc_ptr op1, unsigned long int op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CCU (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CCU (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  printf ("op2=%lu\n", op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cuc (mpc_function *function, unsigned long int op1, mpc_ptr op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CUC (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CUC (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  printf ("op1=%lu\n", op1);
Packit 80c72f
  MPC_OUT (op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_ccs (mpc_function *function, mpc_ptr op1, long int op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CCS (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CCS (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  printf ("op2=%ld\n", op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cci (mpc_function *function, mpc_ptr op1, int op2,
Packit 80c72f
              mpc_ptr rop, mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CCI (rop4, op1, op2, rnd);
Packit 80c72f
  function->pointer.CCI (rop, op1, op2, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  MPC_OUT (op1);
Packit 80c72f
  printf ("op2=%d\n", op2);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
tgeneric_cuuc (mpc_function *function, unsigned long int op1,
Packit 80c72f
               unsigned long int op2, mpc_ptr op3, mpc_ptr rop,
Packit 80c72f
               mpc_ptr rop4, mpc_ptr rop4rnd, mpc_rnd_t rnd)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  function->pointer.CUUC (rop4, op1, op2, op3, rnd);
Packit 80c72f
  function->pointer.CUUC (rop, op1, op2, op3, rnd);
Packit 80c72f
  if (MPFR_CAN_ROUND (mpc_realref (rop4), 1, MPC_PREC_RE (rop),
Packit 80c72f
                      MPC_RND_RE (rnd))
Packit 80c72f
      && MPFR_CAN_ROUND (mpc_imagref (rop4), 1, MPC_PREC_IM (rop),
Packit 80c72f
                         MPC_RND_IM (rnd)))
Packit 80c72f
    mpc_set (rop4rnd, rop4, rnd);
Packit 80c72f
  else
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  if (same_mpc_value (rop, rop4rnd, ks))
Packit 80c72f
    return;
Packit 80c72f
Packit 80c72f
  printf ("Rounding in %s might be incorrect for\n", function->name);
Packit 80c72f
  printf ("op1=%lu\n", op1);
Packit 80c72f
  printf ("op2=%lu\n", op2);
Packit 80c72f
  MPC_OUT (op3);
Packit 80c72f
  printf ("with rounding mode (%s, %s)",
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_RE (rnd)),
Packit 80c72f
          mpfr_print_rnd_mode (MPC_RND_IM (rnd)));
Packit 80c72f
Packit 80c72f
  printf ("\n%s                     gives ", function->name);
Packit 80c72f
  MPC_OUT (rop);
Packit 80c72f
  printf ("%s quadruple precision gives ", function->name);
Packit 80c72f
  MPC_OUT (rop4);
Packit 80c72f
  printf ("and is rounded to                  ");
Packit 80c72f
  MPC_OUT (rop4rnd);
Packit 80c72f
Packit 80c72f
  exit (1);
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
Packit 80c72f
/* Test parameter reuse: the function should not use its output parameter in
Packit 80c72f
   internal computations. */
Packit 80c72f
static void
Packit 80c72f
reuse_cc (mpc_function* function, mpc_srcptr z, mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CC (expected, z, MPC_RNDNN);
Packit 80c72f
  function->pointer.CC (got, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cc_c (mpc_function* function, mpc_srcptr z, mpc_ptr got1, mpc_ptr got2,
Packit 80c72f
            mpc_ptr exp1, mpc_ptr exp2)
Packit 80c72f
{
Packit 80c72f
   known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
   function->pointer.CC_C (exp1, exp2, z, MPC_RNDNN, MPC_RNDNN);
Packit 80c72f
   mpc_set (got1, z, MPC_RNDNN); /* exact */
Packit 80c72f
   function->pointer.CC_C (got1, got2, got1, MPC_RNDNN, MPC_RNDNN);
Packit 80c72f
   if (   !same_mpc_value (got1, exp1, ks)
Packit 80c72f
       || !same_mpc_value (got2, exp2, ks)) {
Packit 80c72f
      printf ("Reuse error in first result of %s for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (exp1);
Packit 80c72f
      MPC_OUT (got1);
Packit 80c72f
      MPC_OUT (exp2);
Packit 80c72f
      MPC_OUT (got2);
Packit 80c72f
      exit (1);
Packit 80c72f
   }
Packit 80c72f
   mpc_set (got2, z, MPC_RNDNN); /* exact */
Packit 80c72f
   function->pointer.CC_C (got1, got2, got2, MPC_RNDNN, MPC_RNDNN);
Packit 80c72f
   if (   !same_mpc_value (got1, exp1, ks)
Packit 80c72f
       || !same_mpc_value (got2, exp2, ks)) {
Packit 80c72f
      printf ("Reuse error in second result of %s for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (exp1);
Packit 80c72f
      MPC_OUT (got1);
Packit 80c72f
      MPC_OUT (exp2);
Packit 80c72f
      MPC_OUT (got2);
Packit 80c72f
      exit (1);
Packit 80c72f
   }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_fc (mpc_function* function, mpc_ptr z, mpc_ptr x, mpfr_ptr expected)
Packit 80c72f
{
Packit 80c72f
  mpc_set (x, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.FC (expected, z, GMP_RNDN);
Packit 80c72f
  function->pointer.FC (mpc_realref (x), x, GMP_RNDN);
Packit 80c72f
  if (!same_mpfr_value (mpc_realref (x), expected, 1))
Packit 80c72f
    {
Packit 80c72f
      mpfr_t got;
Packit 80c72f
      got[0] = mpc_realref(x)[0]; /* display sensible name */
Packit 80c72f
      printf ("Reuse error for %s(mpc_realref(z), z) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPFR_OUT (expected);
Packit 80c72f
      MPFR_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
  mpc_set (x, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.FC (mpc_imagref (x), x, GMP_RNDN);
Packit 80c72f
  if (!same_mpfr_value (mpc_imagref (x), expected, 1))
Packit 80c72f
    {
Packit 80c72f
      mpfr_t got;
Packit 80c72f
      got[0] = mpc_imagref(x)[0]; /* display sensible name */
Packit 80c72f
      printf ("Reuse error for %s(mpc_imagref(z), z) for \n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPFR_OUT (expected);
Packit 80c72f
      MPFR_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cfc (mpc_function* function, mpc_srcptr z, mpfr_srcptr x, mpc_ptr got,
Packit 80c72f
           mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CFC (expected, x, z, MPC_RNDNN);
Packit 80c72f
  function->pointer.CFC (got, x, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, x, z) for\n", function->name);
Packit 80c72f
      MPFR_OUT (x);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_ccf (mpc_function* function, mpc_srcptr z, mpfr_srcptr x, mpc_ptr got,
Packit 80c72f
           mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCF (expected, z, x, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCF (got, got, x, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, x, RNDNN) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPFR_OUT (x);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
/* for functions with one mpc_t output, two mpc_t inputs */
Packit 80c72f
static void
Packit 80c72f
reuse_c_cc (mpc_function* function, mpc_srcptr z, mpc_srcptr x,
Packit 80c72f
           mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.C_CC (expected, z, x, MPC_RNDNN);
Packit 80c72f
  function->pointer.C_CC (got, got, x, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, x) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
  mpc_set (got, x, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.C_CC (expected, z, x, MPC_RNDNN);
Packit 80c72f
  function->pointer.C_CC (got, z, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(x, z, x) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
  mpc_set (got, x, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.C_CC (expected, x, x, MPC_RNDNN);
Packit 80c72f
  function->pointer.C_CC (got, got, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(x, x, x) for\n", function->name);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cccc (mpc_function* function, mpc_srcptr z, mpc_srcptr x, mpc_srcptr y,
Packit 80c72f
	    mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCCC (expected, z, x, y, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCCC (got, got, x, y, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, x, y) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (y);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
Packit 80c72f
  mpc_set (got, x, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCCC (expected, z, x, y, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCCC (got, z, got, y, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(x, z, x, y) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (y);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
Packit 80c72f
  mpc_set (got, y, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCCC (expected, z, x, y, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCCC (got, z, x, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(y, z, x, y) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (y);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
Packit 80c72f
  mpc_set (got, x, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCCC (expected, x, x, x, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCCC (got, got, got, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(x, x, x, x) for\n", function->name);
Packit 80c72f
      MPC_OUT (x);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_ccu (mpc_function* function, mpc_srcptr z, unsigned long ul,
Packit 80c72f
           mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCU (expected, z, ul, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCU (got, got, ul, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, n) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      printf ("n=%lu\n", ul);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cuc (mpc_function* function, unsigned long ul, mpc_srcptr z,
Packit 80c72f
           mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CUC (expected, ul, z,MPC_RNDNN);
Packit 80c72f
  function->pointer.CUC (got, ul, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, n, z) for\n", function->name);
Packit 80c72f
      printf ("n=%lu\n", ul);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_ccs (mpc_function* function, mpc_srcptr z, long lo,
Packit 80c72f
           mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCS (expected, z, lo, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCS (got, got, lo, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, n) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      printf ("n=%ld\n", lo);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cci (mpc_function* function, mpc_srcptr z, int i,
Packit 80c72f
           mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CCI (expected, z, i, MPC_RNDNN);
Packit 80c72f
  function->pointer.CCI (got, got, i, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, z, n) for\n", function->name);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      printf ("n=%d\n", i);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static void
Packit 80c72f
reuse_cuuc (mpc_function* function, unsigned long ul1, unsigned long ul2,
Packit 80c72f
            mpc_srcptr z, mpc_ptr got, mpc_ptr expected)
Packit 80c72f
{
Packit 80c72f
  known_signs_t ks = {1, 1};
Packit 80c72f
Packit 80c72f
  mpc_set (got, z, MPC_RNDNN); /* exact */
Packit 80c72f
  function->pointer.CUUC (expected, ul1, ul2, z,MPC_RNDNN);
Packit 80c72f
  function->pointer.CUUC (got, ul1, ul2, got, MPC_RNDNN);
Packit 80c72f
  if (!same_mpc_value (got, expected, ks))
Packit 80c72f
    {
Packit 80c72f
      printf ("Reuse error for %s(z, m, n, z) for\n", function->name);
Packit 80c72f
      printf ("m=%lu\n", ul1);
Packit 80c72f
      printf ("n=%lu\n", ul2);
Packit 80c72f
      MPC_OUT (z);
Packit 80c72f
      MPC_OUT (expected);
Packit 80c72f
      MPC_OUT (got);
Packit 80c72f
Packit 80c72f
      exit (1);
Packit 80c72f
    }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
Packit 80c72f
/* helper functions for iterating over mpfr rounding modes */
Packit 80c72f
static mpfr_rnd_t
Packit 80c72f
first_rnd_mode (void)
Packit 80c72f
{
Packit 80c72f
   return GMP_RNDN;
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static mpfr_rnd_t
Packit 80c72f
next_rnd_mode (mpfr_rnd_t curr)
Packit 80c72f
   /* assumes that all rounding modes are non-negative, and returns -1
Packit 80c72f
      when curr is the last rounding mode                              */
Packit 80c72f
{
Packit 80c72f
   switch (curr) {
Packit 80c72f
      case GMP_RNDN:
Packit 80c72f
         return GMP_RNDZ;
Packit 80c72f
      case GMP_RNDZ:
Packit 80c72f
         return GMP_RNDU;
Packit 80c72f
      case GMP_RNDU:
Packit 80c72f
         return GMP_RNDD;
Packit 80c72f
      default:
Packit 80c72f
         /* return invalid guard value in mpfr_rnd_t */
Packit 80c72f
#if MPFR_VERSION_MAJOR < 3
Packit 80c72f
         return GMP_RNDNA;
Packit 80c72f
#else
Packit 80c72f
         return MPFR_RNDA; /* valid rounding type, but not (yet) used in mpc */
Packit 80c72f
#endif
Packit 80c72f
   }
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
static int
Packit 80c72f
is_valid_rnd_mode (mpfr_rnd_t curr)
Packit 80c72f
   /* returns 1 if curr is a valid rounding mode, and 0otherwise */
Packit 80c72f
{
Packit 80c72f
   if (   curr == GMP_RNDN || curr == GMP_RNDZ
Packit 80c72f
       || curr == GMP_RNDU || curr == GMP_RNDD)
Packit 80c72f
      return 1;
Packit 80c72f
   else
Packit 80c72f
      return 0;
Packit 80c72f
}
Packit 80c72f
Packit 80c72f
/* tgeneric(prec_min, prec_max, step, exp_max) checks rounding with random
Packit 80c72f
   numbers:
Packit 80c72f
   - with precision ranging from prec_min to prec_max with an increment of
Packit 80c72f
   step,
Packit 80c72f
   - with exponent between -exp_max and exp_max.
Packit 80c72f
Packit 80c72f
   It also checks parameter reuse (it is assumed here that either two mpc_t
Packit 80c72f
   variables are equal or they are different, in the sense that the real part
Packit 80c72f
   of one of them cannot be the imaginary part of the other). */
Packit 80c72f
void
Packit 80c72f
tgeneric (mpc_function function, mpfr_prec_t prec_min,
Packit 80c72f
          mpfr_prec_t prec_max, mpfr_prec_t step, mpfr_exp_t exp_max)
Packit 80c72f
{
Packit 80c72f
  unsigned long ul1 = 0, ul2 = 0;
Packit 80c72f
  long lo = 0;
Packit 80c72f
  int i = 0;
Packit 80c72f
  mpfr_t x1, x2, xxxx;
Packit 80c72f
  mpc_t  z1, z2, z3, z4, z5, zzzz, zzzz2;
Packit 80c72f
Packit 80c72f
  mpfr_rnd_t rnd_re, rnd_im, rnd2_re, rnd2_im;
Packit 80c72f
  mpfr_prec_t prec;
Packit 80c72f
  mpfr_exp_t exp_min;
Packit 80c72f
  int special, special_cases;
Packit 80c72f
Packit 80c72f
  mpc_init2 (z1, prec_max);
Packit 80c72f
  switch (function.type)
Packit 80c72f
    {
Packit 80c72f
    case C_CC:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (z4, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 8;
Packit 80c72f
      break;
Packit 80c72f
    case CCCC:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (z4, prec_max);
Packit 80c72f
      mpc_init2 (z5, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 8;
Packit 80c72f
      break;
Packit 80c72f
    case FC:
Packit 80c72f
      mpfr_init2 (x1, prec_max);
Packit 80c72f
      mpfr_init2 (x2, prec_max);
Packit 80c72f
      mpfr_init2 (xxxx, 4*prec_max);
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      special_cases = 4;
Packit 80c72f
      break;
Packit 80c72f
    case CCF: case CFC:
Packit 80c72f
      mpfr_init2 (x1, prec_max);
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 6;
Packit 80c72f
      break;
Packit 80c72f
    case CCI: case CCS:
Packit 80c72f
    case CCU: case CUC:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 5;
Packit 80c72f
      break;
Packit 80c72f
    case CUUC:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 6;
Packit 80c72f
      break;
Packit 80c72f
    case CC_C:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (z4, prec_max);
Packit 80c72f
      mpc_init2 (z5, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      mpc_init2 (zzzz2, 4*prec_max);
Packit 80c72f
      special_cases = 4;
Packit 80c72f
      break;
Packit 80c72f
    case CC:
Packit 80c72f
    default:
Packit 80c72f
      mpc_init2 (z2, prec_max);
Packit 80c72f
      mpc_init2 (z3, prec_max);
Packit 80c72f
      mpc_init2 (zzzz, 4*prec_max);
Packit 80c72f
      special_cases = 4;
Packit 80c72f
    }
Packit 80c72f
Packit 80c72f
  exp_min = mpfr_get_emin ();
Packit 80c72f
  if (exp_max <= 0 || exp_max > mpfr_get_emax ())
Packit 80c72f
    exp_max = mpfr_get_emax();
Packit 80c72f
  if (-exp_max > exp_min)
Packit 80c72f
    exp_min = - exp_max;
Packit 80c72f
Packit 80c72f
  if (step < 1)
Packit 80c72f
    step = 1;
Packit 80c72f
Packit 80c72f
  for (prec = prec_min, special = 0;
Packit 80c72f
       prec <= prec_max || special <= special_cases;
Packit 80c72f
       prec+=step, special += (prec > prec_max ? 1 : 0)) {
Packit 80c72f
       /* In the end, test functions in special cases of purely real, purely
Packit 80c72f
          imaginary or infinite arguments. */
Packit 80c72f
Packit 80c72f
      /* probability of one zero part in 256th (25 is almost 10%) */
Packit 80c72f
      const unsigned int zero_probability = special != 0 ? 0 : 25;
Packit 80c72f
Packit 80c72f
      mpc_set_prec (z1, prec);
Packit 80c72f
      test_default_random (z1, exp_min, exp_max, 128, zero_probability);
Packit 80c72f
Packit 80c72f
      switch (function.type)
Packit 80c72f
        {
Packit 80c72f
        case C_CC:
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          test_default_random (z2, exp_min, exp_max, 128, zero_probability);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (z4, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z2), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 6:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z2), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 7:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z2), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 8:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z2), +1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CCCC:
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          test_default_random (z2, exp_min, exp_max, 128, zero_probability);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (z4, prec);
Packit 80c72f
          mpc_set_prec (z5, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z2), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 6:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z2), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 7:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z2), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 8:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z2), +1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case FC:
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpfr_set_prec (x1, prec);
Packit 80c72f
          mpfr_set_prec (x2, prec);
Packit 80c72f
          mpfr_set_prec (xxxx, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CCU: case CUC:
Packit 80c72f
          mpc_set_prec (z2, 128);
Packit 80c72f
          do {
Packit 80c72f
            test_default_random (z2, 0, 64, 128, zero_probability);
Packit 80c72f
          } while (!mpfr_fits_ulong_p (mpc_realref (z2), GMP_RNDN));
Packit 80c72f
          ul1 = mpfr_get_ui (mpc_realref(z2), GMP_RNDN);
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              ul1 = 0;
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CUUC:
Packit 80c72f
          mpc_set_prec (z2, 128);
Packit 80c72f
          do {
Packit 80c72f
            test_default_random (z2, 0, 64, 128, zero_probability);
Packit 80c72f
          } while (!mpfr_fits_ulong_p (mpc_realref (z2), GMP_RNDN)
Packit 80c72f
                   ||!mpfr_fits_ulong_p (mpc_imagref (z2), GMP_RNDN));
Packit 80c72f
          ul1 = mpfr_get_ui (mpc_realref(z2), GMP_RNDN);
Packit 80c72f
          ul2 = mpfr_get_ui (mpc_imagref(z2), GMP_RNDN);
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              ul1 = 0;
Packit 80c72f
              break;
Packit 80c72f
            case 6:
Packit 80c72f
              ul2 = 0;
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CCS:
Packit 80c72f
          mpc_set_prec (z2, 128);
Packit 80c72f
          do {
Packit 80c72f
            test_default_random (z2, 0, 64, 128, zero_probability);
Packit 80c72f
          } while (!mpfr_fits_slong_p (mpc_realref (z2), GMP_RNDN));
Packit 80c72f
          lo = mpfr_get_si (mpc_realref(z2), GMP_RNDN);
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              lo = 0;
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CCI:
Packit 80c72f
          mpc_set_prec (z2, 128);
Packit 80c72f
          do {
Packit 80c72f
            test_default_random (z2, 0, 64, 128, zero_probability);
Packit 80c72f
          } while (!mpfr_fits_slong_p (mpc_realref (z2), GMP_RNDN));
Packit 80c72f
          i = (int)mpfr_get_si (mpc_realref(z2), GMP_RNDN);
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              i = 0;
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CCF: case CFC:
Packit 80c72f
          mpfr_set_prec (x1, prec);
Packit 80c72f
          mpfr_set (x1, mpc_realref (z1), GMP_RNDN);
Packit 80c72f
          test_default_random (z1, exp_min, exp_max, 128, zero_probability);
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            case 5:
Packit 80c72f
              mpfr_set_ui (x1, 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 6:
Packit 80c72f
              mpfr_set_inf (x1, +1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CC_C:
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (z4, prec);
Packit 80c72f
          mpc_set_prec (z5, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          mpc_set_prec (zzzz2, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
          break;
Packit 80c72f
        case CC:
Packit 80c72f
        default:
Packit 80c72f
          mpc_set_prec (z2, prec);
Packit 80c72f
          mpc_set_prec (z3, prec);
Packit 80c72f
          mpc_set_prec (zzzz, 4*prec);
Packit 80c72f
          switch (special)
Packit 80c72f
            {
Packit 80c72f
            case 1:
Packit 80c72f
              mpfr_set_ui (mpc_realref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 2:
Packit 80c72f
              mpfr_set_inf (mpc_realref (z1), +1);
Packit 80c72f
              break;
Packit 80c72f
            case 3:
Packit 80c72f
              mpfr_set_ui (mpc_imagref (z1), 0, GMP_RNDN);
Packit 80c72f
              break;
Packit 80c72f
            case 4:
Packit 80c72f
              mpfr_set_inf (mpc_imagref (z1), -1);
Packit 80c72f
              break;
Packit 80c72f
            }
Packit 80c72f
        }
Packit 80c72f
Packit 80c72f
      for (rnd_re = first_rnd_mode (); is_valid_rnd_mode (rnd_re); rnd_re = next_rnd_mode (rnd_re))
Packit 80c72f
        switch (function.type)
Packit 80c72f
          {
Packit 80c72f
          case C_CC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_c_cc (&function, z1, z2, z3, zzzz, z4,
Packit 80c72f
			     MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_c_cc (&function, z1, z2, z3, z4);
Packit 80c72f
            break;
Packit 80c72f
          case CCCC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cccc (&function, z1, z2, z3, z4, zzzz, z5,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cccc (&function, z1, z2, z3, z4, z5);
Packit 80c72f
            break;
Packit 80c72f
          case FC:
Packit 80c72f
            tgeneric_fc (&function, z1, x1, xxxx, x2, rnd_re);
Packit 80c72f
            reuse_fc (&function, z1, z2, x1);
Packit 80c72f
            break;
Packit 80c72f
          case CC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cc (&function, z1, z2, zzzz, z3,
Packit 80c72f
                           MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cc (&function, z1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CC_C:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
               for (rnd2_re = first_rnd_mode (); is_valid_rnd_mode (rnd2_re); rnd2_re = next_rnd_mode (rnd2_re))
Packit 80c72f
                  for (rnd2_im = first_rnd_mode (); is_valid_rnd_mode (rnd2_im); rnd2_im = next_rnd_mode (rnd2_im))
Packit 80c72f
                     tgeneric_cc_c (&function, z1, z2, z3, zzzz, zzzz2, z4, z5,
Packit 80c72f
                           MPC_RND (rnd_re, rnd_im), MPC_RND (rnd2_re, rnd2_im));
Packit 80c72f
             reuse_cc_c (&function, z1, z2, z3, z4, z5);
Packit 80c72f
            break;
Packit 80c72f
          case CFC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cfc (&function, x1, z1, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cfc (&function, z1, x1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CCF:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_ccf (&function, z1, x1, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_ccf (&function, z1, x1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CCU:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_ccu (&function, z1, ul1, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_ccu (&function, z1, ul1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CUC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cuc (&function, ul1, z1, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cuc (&function, ul1, z1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CCS:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_ccs (&function, z1, lo, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_ccs (&function, z1, lo, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CCI:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cci (&function, z1, i, z2, zzzz, z3,
Packit 80c72f
                            MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cci (&function, z1, i, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          case CUUC:
Packit 80c72f
            for (rnd_im = first_rnd_mode (); is_valid_rnd_mode (rnd_im); rnd_im = next_rnd_mode (rnd_im))
Packit 80c72f
              tgeneric_cuuc (&function, ul1, ul2, z1, z2, zzzz, z3,
Packit 80c72f
                             MPC_RND (rnd_re, rnd_im));
Packit 80c72f
            reuse_cuuc (&function, ul1, ul2, z1, z2, z3);
Packit 80c72f
            break;
Packit 80c72f
          default:
Packit 80c72f
            printf ("tgeneric not yet implemented for this kind of"
Packit 80c72f
                    "function\n");
Packit 80c72f
            exit (1);
Packit 80c72f
          }
Packit 80c72f
    }
Packit 80c72f
Packit 80c72f
  mpc_clear (z1);
Packit 80c72f
  switch (function.type)
Packit 80c72f
    {
Packit 80c72f
    case C_CC:
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpc_clear (z3);
Packit 80c72f
      mpc_clear (z4);
Packit 80c72f
      mpc_clear (zzzz);
Packit 80c72f
      break;
Packit 80c72f
    case CCCC:
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpc_clear (z3);
Packit 80c72f
      mpc_clear (z4);
Packit 80c72f
      mpc_clear (z5);
Packit 80c72f
      mpc_clear (zzzz);
Packit 80c72f
      break;
Packit 80c72f
    case FC:
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpfr_clear (x1);
Packit 80c72f
      mpfr_clear (x2);
Packit 80c72f
      mpfr_clear (xxxx);
Packit 80c72f
      break;
Packit 80c72f
    case CCF: case CFC:
Packit 80c72f
      mpfr_clear (x1);
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpc_clear (z3);
Packit 80c72f
      mpc_clear (zzzz);
Packit 80c72f
      break;
Packit 80c72f
    case CC_C:
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpc_clear (z3);
Packit 80c72f
      mpc_clear (z4);
Packit 80c72f
      mpc_clear (z5);
Packit 80c72f
      mpc_clear (zzzz);
Packit 80c72f
      mpc_clear (zzzz2);
Packit 80c72f
      break;
Packit 80c72f
    case CUUC:
Packit 80c72f
    case CCI: case CCS:
Packit 80c72f
    case CCU: case CUC:
Packit 80c72f
    case CC:
Packit 80c72f
    default:
Packit 80c72f
      mpc_clear (z2);
Packit 80c72f
      mpc_clear (z3);
Packit 80c72f
      mpc_clear (zzzz);
Packit 80c72f
    }
Packit 80c72f
}