(root)/
gcc-13.2.0/
gcc/
testsuite/
c-c++-common/
dfp/
func-vararg-alternate.h
       1  /* Simple test of vararg passing for problematic types with and without
       2     double values passed between them.  */
       3  
       4  #include "dfp-dbg.h"
       5  #include <stdarg.h>
       6  
       7  DTYPE a[10];
       8  double b[10];
       9  
      10  union U {
      11    DTYPE d;
      12    unsigned int i[INTS];
      13  };
      14  
      15  void
      16  compare (double r, double s, unsigned int *p, unsigned int *q, int n, int line)
      17  {
      18    int i;
      19  
      20    for (i = 0; i < n; i++)
      21      if (r != s || p[i] != q[i])
      22  #ifdef DBG
      23        {
      24  	int j;
      25  
      26  	failures++;
      27  	printf ("line %-3d", line);
      28  	for (j = 0; j < n; j++)
      29  	  printf ("  %08x", p[j]);
      30  	printf ("    %10.2g\n        ", r);
      31  	for (j = 0; j < n; j++)
      32  	  printf ("  %08x", q[j]);
      33  	printf ("    %10.2g\n\n", s);
      34  	    
      35  	return;
      36        }
      37  #else
      38        __builtin_abort ();
      39  #endif
      40  }
      41  
      42  void
      43  bar0 (int n, ...)
      44  {
      45    union U u;
      46    int j;
      47    va_list ap;
      48  
      49    va_start (ap, n);
      50    for (j = 0; j < n; j++)
      51      a[j] = va_arg (ap, DTYPE);
      52    va_end (ap);
      53  }
      54  
      55  void
      56  bar1 (int n, ...)
      57  {
      58    union U u;
      59    int j;
      60    va_list ap;
      61  
      62    va_start (ap, n);
      63    for (j = 0; j < n; j++)
      64      {
      65        a[j] = va_arg (ap, DTYPE);
      66        b[j] = va_arg (ap, double);
      67      }
      68    va_end (ap);
      69  }
      70  
      71  void
      72  bar2 (int n, ...)
      73  {
      74    union U u;
      75    int j;
      76    va_list ap;
      77  
      78    va_start (ap, n);
      79    for (j = 0; j < n; j++)
      80      {
      81        b[j] = va_arg (ap, double);
      82        a[j] = va_arg (ap, DTYPE);
      83      }
      84    va_end (ap);
      85  }
      86  
      87  void
      88  doit ()
      89  {
      90    DTYPE x, y, z;
      91    union U u1, u2;
      92  
      93    /* Sanity check that test setup is right, especially for long double
      94       which can be changed by command line option.  */
      95    if (INTS * 4 != sizeof (DTYPE))
      96      {
      97  #ifdef DBG
      98        printf ("test error: INTS = %d, sizeof (DTYPE) =  %d\n",
      99  	      INTS, sizeof (DTYPE));
     100  #endif
     101        __builtin_abort ();
     102      }
     103  
     104    x = ONE / THREE;
     105    y = ONE / SEVEN;
     106    z = ONE / ELEVEN;
     107  
     108    bar0 (1, x);
     109    u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     110  
     111    bar0 (2, x, y);
     112    u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     113    u1.d = y; u2.d = a[1]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     114  
     115    bar0 (3, x, y, z);
     116    u1.d = x; u2.d = a[0]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     117    u1.d = y; u2.d = a[1]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     118    u1.d = z; u2.d = a[2]; compare (0.0, 0.0, u1.i, u2.i, INTS, __LINE__);
     119  
     120    bar1 (1, x, 1.5);
     121    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     122  
     123    bar1 (2, x, 1.5, y, 2.5);
     124    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     125    u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);
     126  
     127    bar1 (3, x, 1.5, y, 2.5, z, 3.5);
     128    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     129    u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);
     130    u1.d = z; u2.d = a[2]; compare (3.5, b[2], u1.i, u2.i, INTS, __LINE__);
     131  
     132    bar2 (1, 1.5, x);
     133    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     134  
     135    bar2 (2, 1.5, x, 2.5, y);
     136    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     137    u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);
     138  
     139    bar2 (3, 1.5, x, 2.5, y, 3.5, z);
     140    u1.d = x; u2.d = a[0]; compare (1.5, b[0], u1.i, u2.i, INTS, __LINE__);
     141    u1.d = y; u2.d = a[1]; compare (2.5, b[1], u1.i, u2.i, INTS, __LINE__);
     142    u1.d = z; u2.d = a[2]; compare (3.5, b[2], u1.i, u2.i, INTS, __LINE__);
     143  }