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