OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [testsuite/] [c-c++-common/] [dfp/] [func-vararg-alternate.h] - Blame information for rev 725

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 686 jeremybenn
/* 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
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.