Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / testsuite / gcc.target / avr / torture / builtins-4-roundfx.c
1 /* { dg-options "-std=gnu99" } */
2 /* { dg-do run } */
3
4 #include <stdfix.h>
5
6 extern void abort (void);
7
8 typedef short _Fract fx_hr_t;
9 typedef _Fract fx_r_t;
10 typedef long _Fract fx_lr_t;
11 typedef long long _Fract fx_llr_t;
12
13 typedef unsigned short _Fract fx_uhr_t;
14 typedef unsigned _Fract fx_ur_t;
15 typedef unsigned long _Fract fx_ulr_t;
16 typedef unsigned long long _Fract fx_ullr_t;
17
18 typedef short _Accum fx_hk_t;
19 typedef _Accum fx_k_t;
20 typedef long _Accum fx_lk_t;
21 typedef long long _Accum fx_llk_t;
22
23 typedef unsigned short _Accum fx_uhk_t;
24 typedef unsigned _Accum fx_uk_t;
25 typedef unsigned long _Accum fx_ulk_t;
26 typedef unsigned long long _Accum fx_ullk_t;
27
28
29 typedef unsigned char int_uhr_t;
30 typedef unsigned int int_ur_t;
31 typedef unsigned long int_ulr_t;
32 typedef unsigned long long int_ullr_t;
33
34 typedef unsigned int int_uhk_t;
35 typedef unsigned long int_uk_t;
36 typedef unsigned long long int_ulk_t;
37 typedef unsigned long long int_ullk_t;
38
39
40 #define DEFTEST1(T,FX)                              \
41   T test1_##FX (T x, int rp)                        \
42   {                                                 \
43     return round##FX (x, rp);                       \
44   }                                                 \
45                                                     \
46   unsigned T test1_u##FX (unsigned T x, int rp)     \
47   {                                                 \
48     return roundu##FX (x, rp);                      \
49   }
50
51 DEFTEST1 (short fract, hr)
52 DEFTEST1 (fract, r)
53 DEFTEST1 (long fract, lr)
54 DEFTEST1 (long long fract, llr)
55
56 DEFTEST1 (short accum, hk)
57 DEFTEST1 (accum, k)
58
59 DEFTEST1 (long accum, lk)
60 DEFTEST1 (long long accum, llk)
61
62
63 #define TEST2(FX, RP, VAL, ROUND)                                    \
64   {                                                                  \
65     if (round##FX (FX##bits (VAL), RP) != FX##bits (ROUND))          \
66       abort();                                                       \
67     fx_##FX##_t (*f)(fx_##FX##_t,int) = round##FX;                   \
68     asm ("" : "+r" (f));                                             \
69     if (f (FX##bits (VAL), RP) != FX##bits (ROUND))                  \
70       abort();                                                       \
71   }
72
73 static void test2hr (void)
74 {
75   TEST2 (hr, 1, 0x7f, 0x40);
76   TEST2 (hr, 2, 0x7f, 0b1100000);
77   TEST2 (hr, 3, 0x7f, 0b1110000);
78   TEST2 (hr, 4, 0x7f, 0b1111000);
79
80   TEST2 (uhr, 1, 0x7f, 0x80);
81   TEST2 (uhr, 2, 0x7f, 0x80);
82   TEST2 (uhr, 3, 0x7f, 0x80);
83   TEST2 (uhr, 4, 0x7f, 0x80);
84 }
85
86 void test2k (void)
87 {
88   TEST2 (k, 1, 0x7fffffff, 0x7fff8000 | 0b100000000000000);
89   TEST2 (k, 2, 0x7fffffff, 0x7fff8000 | 0b110000000000000);
90   TEST2 (k, 3, 0x7fffffff, 0x7fff8000 | 0b111000000000000);
91   TEST2 (k, 4, 0x7fffffff, 0x7fff8000 | 0b111100000000000);
92
93   TEST2 (uk, 1, 0x7fffffff, 1ul << 31);
94   TEST2 (uk, 2, 0x7fffffff, 1ul << 31);
95   TEST2 (uk, 3, 0x7fffffff, 1ul << 31);
96   TEST2 (uk, 4, 0x7fffffff, 1ul << 31);
97 }
98
99 #define DEFTEST3(FX, FBIT)                            \
100   void test3##FX (void)                               \
101   {                                                   \
102     TEST2 (FX, FBIT-1, 0b01100, 0b01100);             \
103     TEST2 (FX, FBIT-2, 0b01100, 0b01100);             \
104     TEST2 (FX, FBIT-3, 0b01100, 0b10000);             \
105     TEST2 (FX, FBIT-4, 0b01100, 0b10000);             \
106     TEST2 (FX, FBIT-5, 0b01100, 0);                   \
107                                                       \
108     if (FX##bits ((int_##FX##_t) -1) > 0)             \
109       return;                                         \
110                                                       \
111     TEST2 (FX, FBIT-1, -0b01100, -0b01100);           \
112     TEST2 (FX, FBIT-2, -0b01100, -0b01100);           \
113     TEST2 (FX, FBIT-3, -0b01100, -0b01000);           \
114     TEST2 (FX, FBIT-4, -0b01100, -0b10000);           \
115     TEST2 (FX, FBIT-5, -0b01100, -0b00000);           \
116     }
117
118 DEFTEST3 (hr, SFRACT_FBIT)
119 DEFTEST3 (r, FRACT_FBIT)
120 DEFTEST3 (lr, LFRACT_FBIT)
121
122 DEFTEST3 (uhr, USFRACT_FBIT)
123 DEFTEST3 (ur, UFRACT_FBIT)
124 DEFTEST3 (ulr, ULFRACT_FBIT)
125
126 DEFTEST3 (hk, SACCUM_FBIT)
127 DEFTEST3 (k, ACCUM_FBIT)
128 DEFTEST3 (lk, LACCUM_FBIT)
129 DEFTEST3 (llk, LLACCUM_FBIT)
130
131 DEFTEST3 (uhk, USACCUM_FBIT)
132 DEFTEST3 (uk, UACCUM_FBIT)
133 DEFTEST3 (ulk, ULACCUM_FBIT)
134 DEFTEST3 (ullk, ULLACCUM_FBIT)
135
136 int main (void)
137 {
138   test2hr();
139   test2k();
140
141   test3hr();
142   test3r();
143   test3lr();
144
145   test3uhr();
146   test3ur();
147   test3ulr();
148
149   test3hk();
150   test3k();
151   test3lk();
152   test3llk();
153
154   test3uhk();
155   test3uk();
156   test3ulk();
157   test3ullk();
158
159   return 0;
160 }
161