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