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