1/* { dg-options "-std=gnu99" } */
2/* { dg-do run } */
3
4#include <stdfix.h>
5
6extern void abort (void);
7
8short fract test1_hr (short fract x)
9{
10  return abshr (x);
11}
12
13fract test1_r (fract x)
14{
15  return absr (x);
16}
17
18long fract test1_lr (long fract x)
19{
20  return abslr (x);
21}
22
23long long fract test1_llr (long long fract x)
24{
25  return absllr (x);
26}
27
28short accum test1_hk (short accum x)
29{
30  return abshk (x);
31}
32
33accum test1_k (accum x)
34{
35  return absk (x);
36}
37
38long accum test1_lk (long accum x)
39{
40  return abslk (x);
41}
42
43long long accum test1_llk (long long accum x)
44{
45  return absllk (x);
46}
47
48
49short fract test2_hr (void)
50{
51  return abshr (-0.12hr);
52}
53
54fract test2_r (void)
55{
56  return absr (-0.12r);
57}
58
59long fract test2_lr (void)
60{
61  return abslr (-0.12lr);
62}
63
64long long fract test2_llr (void)
65{
66  return absllr (-0.123456llr);
67}
68
69short accum test2_hk (void)
70{
71  return abshk (-221.12hk);
72}
73
74accum test2_k (void)
75{
76  return absk (-4321.12k);
77}
78
79long accum test2_lk (void)
80{
81  return abslk (-4321.12lk);
82}
83
84long 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
101const __flash short fract volatile v = 0.33hr;
102const __flash short fract volatile z = 0hr;
103
104void 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
118void 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
149void 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
163int main (void)
164{
165  test1();
166  test2();
167  test3();
168
169  return 0;
170}
171
172