1/* { dg-do run } */
2/* This test is too big for small targets.  */
3/* { dg-require-effective-target size32plus } */
4
5#include <stdlib.h>
6
7#define N 1024
8signed char sc[N];
9short ss[N];
10int si[N];
11long long sl[N];
12unsigned char uc[N];
13unsigned short us[N];
14unsigned int ui[N];
15unsigned long long ul[N];
16float f[N];
17double d[N];
18
19#define FN1(from, to) \
20__attribute__((noinline, noclone)) void		\
21from##2##to (void)				\
22{						\
23  int i;					\
24  for (i = 0; i < N; i++)			\
25    to[i] = from[i];				\
26}
27#define FN(intt, fltt) FN1 (intt, fltt) FN1 (fltt, intt)
28
29FN (sc, f)
30FN (ss, f)
31FN (si, f)
32FN (sl, f)
33FN (uc, f)
34FN (us, f)
35FN (ui, f)
36FN (ul, f)
37FN (sc, d)
38FN (ss, d)
39FN (si, d)
40FN (sl, d)
41FN (uc, d)
42FN (us, d)
43FN (ui, d)
44FN (ul, d)
45
46#define FLTTEST(min, max, intt) \
47__attribute__((noinline, noclone)) void					\
48flttointtest##intt (void)						\
49{									\
50  int i;								\
51  volatile float fltmin, fltmax, vf, vf2;				\
52  volatile double dblmin, dblmax, vd, vd2;				\
53  if (min == 0)								\
54    fltmin = 0.0f;							\
55  else									\
56    {									\
57      vf2 = fltmin = min - 1.0f;					\
58      for (vf = 1.0f; (fltmin = vf2 + vf) == vf2; vf = vf * 2.0f)	\
59	;								\
60    }									\
61  vf2 = fltmax = max + 1.0f;						\
62  for (vf = 1.0f; (fltmax = vf2 - vf) == vf2; vf = vf * 2.0f)		\
63    ;									\
64  if (min == 0)								\
65    dblmin = 0.0;							\
66  else									\
67    {									\
68      vd2 = dblmin = min - 1.0;						\
69      for (vd = 1.0; (dblmin = vd2 + vd) == vd2; vd = vd * 2.0)		\
70	;								\
71    }									\
72  vd2 = dblmax = max + 1.0;						\
73  for (vd = 1.0; (dblmax = vd2 - vd) == vd2; vd = vd * 2.0)		\
74    ;									\
75  for (i = 0; i < N; i++)						\
76    {									\
77      asm ("");								\
78      if (i == 0)							\
79	f[i] = fltmin;							\
80      else if (i < N / 4)						\
81	f[i] = fltmin + i + 0.25f;					\
82      else if (i < 3 * N / 4)						\
83	f[i] = (fltmax + fltmin) / 2.0 - N * 8 + 16.0f * i;		\
84      else								\
85	f[i] = fltmax - N + 1 + i;					\
86      if (f[i] < fltmin) f[i] = fltmin;					\
87      if (f[i] > fltmax) f[i] = fltmax;					\
88      if (i == 0)							\
89	d[i] = dblmin;							\
90      else if (i < N / 4)						\
91	d[i] = dblmin + i + 0.25f;					\
92      else if (i < 3 * N / 4)						\
93	d[i] = (dblmax + dblmin) / 2.0 - N * 8 + 16.0f * i;		\
94      else								\
95	d[i] = dblmax - N + 1 + i;					\
96      if (d[i] < dblmin) d[i] = dblmin;					\
97      if (d[i] > dblmax) d[i] = dblmax;					\
98    }									\
99  f2##intt ();								\
100  for (i = 0; i < N; i++)						\
101    if (intt[i] != (__typeof (intt[0])) f[i])				\
102      abort ();								\
103  d2##intt ();								\
104  for (i = 0; i < N; i++)						\
105    if (intt[i] != (__typeof (intt[0])) d[i])				\
106      abort ();								\
107  for (i = 0; i < N; i++)						\
108    {									\
109      unsigned long long r = rand ();					\
110      r = (r << 21) ^ (unsigned) rand ();				\
111      r = (r << 21) ^ (unsigned) rand ();				\
112      asm ("");								\
113      f[i] = (r >> 59) / 32.0f + (__typeof (intt[0])) r;		\
114      if (f[i] < fltmin) f[i] = fltmin;					\
115      if (f[i] > fltmax) f[i] = fltmax;					\
116      d[i] = (r >> 59) / 32.0 + (__typeof (intt[0])) r;			\
117      if (d[i] < dblmin) f[i] = dblmin;					\
118      if (d[i] > dblmax) f[i] = dblmax;					\
119    }									\
120  f2##intt ();								\
121  for (i = 0; i < N; i++)						\
122    if (intt[i] != (__typeof (intt[0])) f[i])				\
123      abort ();								\
124  d2##intt ();								\
125  for (i = 0; i < N; i++)						\
126    if (intt[i] != (__typeof (intt[0])) d[i])				\
127      abort ();								\
128}									\
129									\
130__attribute__((noinline, noclone)) void					\
131inttoflttest##intt (void)						\
132{									\
133  int i;								\
134  volatile float vf;							\
135  volatile double vd;							\
136  for (i = 0; i < N; i++)						\
137    {									\
138      asm ("");								\
139      if (i < N / 4)							\
140	intt[i] = min + i;						\
141      else if (i < 3 * N / 4)						\
142	intt[i] = (max + min) / 2 - N * 8 + 16 * i;			\
143      else								\
144	intt[i] = max - N + 1 + i;					\
145    }									\
146  intt##2f ();								\
147  for (i = 0; i < N; i++)						\
148    {									\
149      vf = intt[i];							\
150      if (f[i] != vf)							\
151	abort ();							\
152    }									\
153  intt##2d ();								\
154  for (i = 0; i < N; i++)						\
155    {									\
156      vd = intt[i];							\
157      if (d[i] != vd)							\
158	abort ();							\
159    }									\
160  for (i = 0; i < N; i++)						\
161    {									\
162      unsigned long long r = rand ();					\
163      r = (r << 21) ^ (unsigned) rand ();				\
164      r = (r << 21) ^ (unsigned) rand ();				\
165      asm ("");								\
166      intt[i] = r;							\
167    }									\
168  intt##2f ();								\
169  for (i = 0; i < N; i++)						\
170    {									\
171      vf = intt[i];							\
172      if (f[i] != vf)							\
173	abort ();							\
174    }									\
175  intt##2d ();								\
176  for (i = 0; i < N; i++)						\
177    {									\
178      vd = intt[i];							\
179      if (d[i] != vd)							\
180	abort ();							\
181    }									\
182}
183
184FLTTEST (- __SCHAR_MAX__ - 1, __SCHAR_MAX__, sc)
185FLTTEST (- __SHRT_MAX__ - 1, __SHRT_MAX__, ss)
186FLTTEST (- __INT_MAX__ - 1, __INT_MAX__, si)
187FLTTEST (- __LONG_LONG_MAX__ - 1LL, __LONG_LONG_MAX__, sl)
188FLTTEST (0, 2U * __SCHAR_MAX__ + 1, uc)
189FLTTEST (0, 2U * __SHRT_MAX__ + 1, us)
190FLTTEST (0, 2U * __INT_MAX__ + 1, ui)
191FLTTEST (0, 2ULL * __LONG_LONG_MAX__ + 1, ul)
192
193int
194main ()
195{
196  flttointtestsc ();
197  flttointtestss ();
198  flttointtestsi ();
199  flttointtestsl ();
200  flttointtestuc ();
201  flttointtestus ();
202  flttointtestui ();
203  flttointtestul ();
204  inttoflttestsc ();
205  inttoflttestss ();
206  inttoflttestsi ();
207  inttoflttestsl ();
208  inttoflttestuc ();
209  inttoflttestus ();
210  inttoflttestui ();
211  inttoflttestul ();
212  return 0;
213}
214