1 /* { dg-options "-std=gnu99" } */
2 /* { dg-do run } */
3 
4 #include <stdfix.h>
5 
6 extern void abort (void);
7 
test1_hr(short fract x)8 short fract test1_hr (short fract x)
9 {
10   return abshr (x);
11 }
12 
test1_r(fract x)13 fract test1_r (fract x)
14 {
15   return absr (x);
16 }
17 
test1_lr(long fract x)18 long fract test1_lr (long fract x)
19 {
20   return abslr (x);
21 }
22 
test1_llr(long long fract x)23 long long fract test1_llr (long long fract x)
24 {
25   return absllr (x);
26 }
27 
test1_hk(short accum x)28 short accum test1_hk (short accum x)
29 {
30   return abshk (x);
31 }
32 
test1_k(accum x)33 accum test1_k (accum x)
34 {
35   return absk (x);
36 }
37 
test1_lk(long accum x)38 long accum test1_lk (long accum x)
39 {
40   return abslk (x);
41 }
42 
test1_llk(long long accum x)43 long long accum test1_llk (long long accum x)
44 {
45   return absllk (x);
46 }
47 
48 
test2_hr(void)49 short fract test2_hr (void)
50 {
51   return abshr (-0.12hr);
52 }
53 
test2_r(void)54 fract test2_r (void)
55 {
56   return absr (-0.12r);
57 }
58 
test2_lr(void)59 long fract test2_lr (void)
60 {
61   return abslr (-0.12lr);
62 }
63 
test2_llr(void)64 long long fract test2_llr (void)
65 {
66   return absllr (-0.123456llr);
67 }
68 
test2_hk(void)69 short accum test2_hk (void)
70 {
71   return abshk (-221.12hk);
72 }
73 
test2_k(void)74 accum test2_k (void)
75 {
76   return absk (-4321.12k);
77 }
78 
test2_lk(void)79 long accum test2_lk (void)
80 {
81   return abslk (-4321.12lk);
82 }
83 
test2_llk(void)84 long long accum test2_llk (void)
85 {
86   return absllk (-4321.12llk);
87 }
88 
89 #define TEST1(VAL,FX)                                          \
90   if (abs ## FX (-VAL ## FX -v) != VAL ## FX + v)              \
91     abort();                                                   \
92   if (abs ## FX (-VAL ## FX -v) != abs ## FX (VAL ## FX + v))  \
93     abort();
94 
95 #define TEST2(VAL,FX)                                   \
96   if (abs ## FX (-VAL ## FX) != VAL ## FX)              \
97     abort();                                            \
98   if (abs ## FX (-VAL ## FX) != abs ## FX (VAL ## FX))  \
99     abort();
100 
101 const __flash short fract volatile v = 0.33hr;
102 const __flash short fract volatile z = 0hr;
103 
test1(void)104 void test1 (void)
105 {
106   TEST1 (0.123, hr);
107   TEST1 (0.123, r);
108   TEST1 (0.1234567, lr);
109   TEST1 (0.1234567, llr);
110 
111   TEST1 (223.123, hk);
112   TEST1 (12345.123, k);
113   TEST1 (12342345.123, lk);
114   TEST1 (12345.123, llk);
115 }
116 
117 
test2(void)118 void test2 (void)
119 {
120   TEST2 (0.123, hr);
121   TEST2 (0.123, r);
122   TEST2 (0.1234567, lr);
123   TEST2 (0.1234567, llr);
124 
125   TEST2 (223.123, hk);
126   TEST2 (12345.123, k);
127   TEST2 (12342345.123, lk);
128   TEST2 (12345.123, llk);
129 }
130 
131 #define MINMAX(T,FX)                                                    \
132   {                                                                     \
133     int_ ## FX ## _t imin                                               \
134       = (int_ ## FX ## _t) 1 << (8 * sizeof (int_ ## FX ## _t) -1);     \
135     int_ ## FX ## _t imax = ~imin;                                      \
136     T fmin =  FX ## bits (imin);                                        \
137     T fmax =  FX ## bits (imax);                                        \
138                                                                         \
139     if (abs ## FX (fmin) != fmax)                                       \
140       abort();                                                          \
141     if (abs ## FX (fmin) != abs ## FX (fmax))                           \
142       abort();                                                          \
143     if (abs ## FX (fmin + z) != fmax + z)                               \
144       abort();                                                          \
145     if (abs ## FX (fmin - z) != abs ## FX (fmax + z))                   \
146       abort();                                                          \
147   }
148 
test3(void)149 void test3 (void)
150 {
151   MINMAX (short fract, hr);
152   MINMAX (fract, r);
153   MINMAX (long fract, lr);
154   MINMAX (long long fract, llr);
155 
156   MINMAX (short accum, hk);
157   MINMAX (accum, k);
158   MINMAX (long accum, lk);
159   MINMAX (long long accum, llk);
160 }
161 
162 
main(void)163 int main (void)
164 {
165   test1();
166   test2();
167   test3();
168 
169   return 0;
170 }
171 
172