1 /* { dg-do run } */
2 /* { dg-options "-save-temps -O2 -fno-inline" } */
3
4 #define FUNC_DEFS(__a) \
5 float \
6 fsfoo##__a (int x) \
7 { \
8 return ((float) x)/(1lu << __a); \
9 } \
10 float \
11 fusfoo##__a (unsigned int x) \
12 { \
13 return ((float) x)/(1lu << __a); \
14 } \
15 float \
16 fslfoo##__a (long long x) \
17 { \
18 return ((float) x)/(1lu << __a); \
19 } \
20 float \
21 fulfoo##__a (unsigned long long x) \
22 { \
23 return ((float) x)/(1lu << __a); \
24 } \
25
26 #define FUNC_DEFD(__a) \
27 double \
28 dsfoo##__a (int x) \
29 { \
30 return ((double) x)/(1lu << __a); \
31 } \
32 double \
33 dusfoo##__a (unsigned int x) \
34 { \
35 return ((double) x)/(1lu << __a); \
36 } \
37 double \
38 dslfoo##__a (long long x) \
39 { \
40 return ((double) x)/(1lu << __a); \
41 } \
42 double \
43 dulfoo##__a (unsigned long long x) \
44 { \
45 return ((double) x)/(1lu << __a); \
46 }
47
48 FUNC_DEFS (4)
49 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], w\[0-9\]*.*#4" 1 } } */
50 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], w\[0-9\]*.*#4" 1 } } */
51 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], x\[0-9\]*.*#4" 1 } } */
52 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], x\[0-9\]*.*#4" 1 } } */
53
54 FUNC_DEFD (4)
55 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], w\[0-9\]*.*#4" 1 } } */
56 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], w\[0-9\]*.*#4" 1 } } */
57 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], x\[0-9\]*.*#4" 1 } } */
58 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], x\[0-9\]*.*#4" 1 } } */
59
60 FUNC_DEFS (8)
61 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], w\[0-9\]*.*#8" 1 } } */
62 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], w\[0-9\]*.*#8" 1 } } */
63 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], x\[0-9\]*.*#8" 1 } } */
64 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], x\[0-9\]*.*#8" 1 } } */
65
66 FUNC_DEFD (8)
67 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], w\[0-9\]*.*#8" 1 } } */
68 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], w\[0-9\]*.*#8" 1 } } */
69 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], x\[0-9\]*.*#8" 1 } } */
70 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], x\[0-9\]*.*#8" 1 } } */
71
72 FUNC_DEFS (16)
73 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], w\[0-9\]*.*#16" 1 } } */
74 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], w\[0-9\]*.*#16" 1 } } */
75 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], x\[0-9\]*.*#16" 1 } } */
76 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], x\[0-9\]*.*#16" 1 } } */
77
78 FUNC_DEFD (16)
79 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], w\[0-9\]*.*#16" 1 } } */
80 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], w\[0-9\]*.*#16" 1 } } */
81 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], x\[0-9\]*.*#16" 1 } } */
82 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], x\[0-9\]*.*#16" 1 } } */
83
84 FUNC_DEFS (32)
85 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], w\[0-9\]*.*#32" 1 } } */
86 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], w\[0-9\]*.*#32" 1 } } */
87 /* { dg-final { scan-assembler-times "scvtf\ts\[0-9\], x\[0-9\]*.*#32" 1 } } */
88 /* { dg-final { scan-assembler-times "ucvtf\ts\[0-9\], x\[0-9\]*.*#32" 1 } } */
89
90 FUNC_DEFD (32)
91 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], w\[0-9\]*.*#32" 1 } } */
92 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], w\[0-9\]*.*#32" 1 } } */
93 /* { dg-final { scan-assembler-times "scvtf\td\[0-9\], x\[0-9\]*.*#32" 1 } } */
94 /* { dg-final { scan-assembler-times "ucvtf\td\[0-9\], x\[0-9\]*.*#32" 1 } } */
95
96 #define FUNC_TESTS(__a, __b) \
97 do \
98 { \
99 if (fsfoo##__a (__b) != ((int) i) * (1.0f/(1lu << __a)) ) \
100 __builtin_abort (); \
101 if (fusfoo##__a (__b) != ((int) i) * (1.0f/(1lu << __a)) ) \
102 __builtin_abort (); \
103 if (fslfoo##__a (__b) != ((int) i) * (1.0f/(1lu << __a)) ) \
104 __builtin_abort (); \
105 if (fulfoo##__a (__b) != ((int) i) * (1.0f/(1lu << __a)) ) \
106 __builtin_abort (); \
107 } while (0)
108
109 #define FUNC_TESTD(__a, __b) \
110 do \
111 { \
112 if (dsfoo##__a (__b) != ((int) i) * (1.0d/(1lu << __a)) ) \
113 __builtin_abort (); \
114 if (dusfoo##__a (__b) != ((int) i) * (1.0d/(1lu << __a)) ) \
115 __builtin_abort (); \
116 if (dslfoo##__a (__b) != ((int) i) * (1.0d/(1lu << __a)) ) \
117 __builtin_abort (); \
118 if (dulfoo##__a (__b) != ((int) i) * (1.0d/(1lu << __a)) ) \
119 __builtin_abort (); \
120 } while (0)
121
122 int
123 main (void)
124 {
125 int i;
126
127 for (i = 0; i < 32; i ++)
128 {
129 FUNC_TESTS (4, i);
130 FUNC_TESTS (8, i);
131 FUNC_TESTS (16, i);
132 FUNC_TESTS (32, i);
133
134 FUNC_TESTD (4, i);
135 FUNC_TESTD (8, i);
136 FUNC_TESTD (16, i);
137 FUNC_TESTD (32, i);
138 }
139 return 0;
140 }