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