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