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 
DEFTEST1(short fract,hr)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, 0x7f);
76   TEST2 (hr, 2, 0x70, 0x7f);
77   TEST2 (hr, 3, 0x78, 0x7f);
78   TEST2 (hr, 4, 0x7f, 0x7f);
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 
test2k(void)86 void test2k (void)
87 {
88   TEST2 (k, 1, 0x7fffff00, 0x7fffffff);
89   TEST2 (k, 2, 0x7ffffff0, 0x7fffffff);
90   TEST2 (k, 2, 0x7ffff000, 0x7fffffff);
91   TEST2 (k, 3, 0x7ffff000, 0x7ffff000);
92   TEST2 (k, 3, 0x7ffff800, 0x7fffffff);
93   TEST2 (k, 3, 0x7ffff7ff, 0x7ffff000);
94   TEST2 (k, 4, 0x7ffff7ff, 0x7ffff800);
95 
96   TEST2 (uk, 1, 0x7fffffff, 1ul << 31);
97   TEST2 (uk, 2, 0x7fffffff, 1ul << 31);
98   TEST2 (uk, 3, 0x7fffffff, 1ul << 31);
99   TEST2 (uk, 4, 0x7fffffff, 1ul << 31);
100 }
101 
102 #define DEFTEST3(FX, FBIT)                            \
103   void test3##FX (void)                               \
104   {                                                   \
105     TEST2 (FX, FBIT-1, 0b01100, 0b01100);             \
106     TEST2 (FX, FBIT-2, 0b01100, 0b01100);             \
107     TEST2 (FX, FBIT-3, 0b01100, 0b10000);             \
108     TEST2 (FX, FBIT-4, 0b01100, 0b10000);             \
109     TEST2 (FX, FBIT-5, 0b01100, 0);                   \
110                                                       \
111     if (FX##bits ((int_##FX##_t) -1) > 0)             \
112       return;                                         \
113                                                       \
114     TEST2 (FX, FBIT-1, -0b01100, -0b01100);           \
115     TEST2 (FX, FBIT-2, -0b01100, -0b01100);           \
116     TEST2 (FX, FBIT-3, -0b01100, -0b01000);           \
117     TEST2 (FX, FBIT-4, -0b01100, -0b10000);           \
118     TEST2 (FX, FBIT-5, -0b01100, -0b00000);           \
119     }
120 
DEFTEST3(hr,SFRACT_FBIT)121 DEFTEST3 (hr, SFRACT_FBIT)
122 DEFTEST3 (r, FRACT_FBIT)
123 DEFTEST3 (lr, LFRACT_FBIT)
124 
125 DEFTEST3 (uhr, USFRACT_FBIT)
126 DEFTEST3 (ur, UFRACT_FBIT)
127 DEFTEST3 (ulr, ULFRACT_FBIT)
128 
129 DEFTEST3 (hk, SACCUM_FBIT)
130 DEFTEST3 (k, ACCUM_FBIT)
131 DEFTEST3 (lk, LACCUM_FBIT)
132 DEFTEST3 (llk, LLACCUM_FBIT)
133 
134 DEFTEST3 (uhk, USACCUM_FBIT)
135 DEFTEST3 (uk, UACCUM_FBIT)
136 DEFTEST3 (ulk, ULACCUM_FBIT)
137 DEFTEST3 (ullk, ULLACCUM_FBIT)
138 
139 int main (void)
140 {
141   test2hr();
142   test2k();
143 
144   test3hr();
145   test3r();
146   test3lr();
147 
148   test3uhr();
149   test3ur();
150   test3ulr();
151 
152   test3hk();
153   test3k();
154   test3lk();
155   test3llk();
156 
157   test3uhk();
158   test3uk();
159   test3ulk();
160   test3ullk();
161 
162   return 0;
163 }
164 
165