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 #ifndef __FLASH
102 #define __flash /* empty */
103 #endif
104 
105 const __flash short fract volatile v = 0.33hr;
106 const __flash short fract volatile z = 0hr;
107 
test1(void)108 void test1 (void)
109 {
110   TEST1 (0.123, hr);
111   TEST1 (0.123, r);
112   TEST1 (0.1234567, lr);
113   TEST1 (0.1234567, llr);
114 
115   TEST1 (223.123, hk);
116   TEST1 (12345.123, k);
117   TEST1 (12342345.123, lk);
118   TEST1 (12345.123, llk);
119 }
120 
121 
test2(void)122 void test2 (void)
123 {
124   TEST2 (0.123, hr);
125   TEST2 (0.123, r);
126   TEST2 (0.1234567, lr);
127   TEST2 (0.1234567, llr);
128 
129   TEST2 (223.123, hk);
130   TEST2 (12345.123, k);
131   TEST2 (12342345.123, lk);
132   TEST2 (12345.123, llk);
133 }
134 
135 #define MINMAX(T,FX)                                                    \
136   {                                                                     \
137     int_ ## FX ## _t imin                                               \
138       = (int_ ## FX ## _t) 1 << (8 * sizeof (int_ ## FX ## _t) -1);     \
139     int_ ## FX ## _t imax = ~imin;                                      \
140     T fmin =  FX ## bits (imin);                                        \
141     T fmax =  FX ## bits (imax);                                        \
142                                                                         \
143     if (abs ## FX (fmin) != fmax)                                       \
144       abort();                                                          \
145     if (abs ## FX (fmin) != abs ## FX (fmax))                           \
146       abort();                                                          \
147     if (abs ## FX (fmin + z) != fmax + z)                               \
148       abort();                                                          \
149     if (abs ## FX (fmin - z) != abs ## FX (fmax + z))                   \
150       abort();                                                          \
151   }
152 
test3(void)153 void test3 (void)
154 {
155   MINMAX (short fract, hr);
156   MINMAX (fract, r);
157   MINMAX (long fract, lr);
158   MINMAX (long long fract, llr);
159 
160   MINMAX (short accum, hk);
161   MINMAX (accum, k);
162   MINMAX (long accum, lk);
163   MINMAX (long long accum, llk);
164 }
165 
166 
main(void)167 int main (void)
168 {
169   test1();
170   test2();
171   test3();
172 
173   return 0;
174 }
175 
176