(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.target/
avr/
torture/
builtins-4-roundfx.c
       1  /* { dg-options "-std=gnu99" } */
       2  /* { dg-do run } */
       3  
       4  #include <stdfix.h>
       5  
       6  extern void abort (void);
       7  
       8  typedef short _Fract fx_hr_t;
       9  typedef _Fract fx_r_t;
      10  typedef long _Fract fx_lr_t;
      11  typedef long long _Fract fx_llr_t;
      12  
      13  typedef unsigned short _Fract fx_uhr_t;
      14  typedef unsigned _Fract fx_ur_t;
      15  typedef unsigned long _Fract fx_ulr_t;
      16  typedef unsigned long long _Fract fx_ullr_t;
      17  
      18  typedef short _Accum fx_hk_t;
      19  typedef _Accum fx_k_t;
      20  typedef long _Accum fx_lk_t;
      21  typedef long long _Accum fx_llk_t;
      22  
      23  typedef unsigned short _Accum fx_uhk_t;
      24  typedef unsigned _Accum fx_uk_t;
      25  typedef unsigned long _Accum fx_ulk_t;
      26  typedef unsigned long long _Accum fx_ullk_t;
      27  
      28  
      29  typedef unsigned char int_uhr_t;
      30  typedef unsigned int int_ur_t;
      31  typedef unsigned long int_ulr_t;
      32  typedef unsigned long long int_ullr_t;
      33  
      34  typedef unsigned int int_uhk_t;
      35  typedef unsigned long int_uk_t;
      36  typedef unsigned long long int_ulk_t;
      37  typedef unsigned long long int_ullk_t;
      38  
      39  
      40  #define DEFTEST1(T,FX)                              \
      41    T test1_##FX (T x, int rp)                        \
      42    {                                                 \
      43      return round##FX (x, rp);                       \
      44    }                                                 \
      45                                                      \
      46    unsigned T test1_u##FX (unsigned T x, int rp)     \
      47    {                                                 \
      48      return roundu##FX (x, rp);                      \
      49    }
      50  
      51  DEFTEST1 (short fract, hr)
      52  DEFTEST1 (fract, r)
      53  DEFTEST1 (long fract, lr)
      54  DEFTEST1 (long long fract, llr)
      55  
      56  DEFTEST1 (short accum, hk)
      57  DEFTEST1 (accum, k)
      58  
      59  DEFTEST1 (long accum, lk)
      60  DEFTEST1 (long long accum, llk)
      61  
      62  
      63  #define TEST2(FX, RP, VAL, ROUND)                                    \
      64    {                                                                  \
      65      if (round##FX (FX##bits (VAL), RP) != FX##bits (ROUND))          \
      66        abort();                                                       \
      67      fx_##FX##_t (*f)(fx_##FX##_t,int) = round##FX;                   \
      68      asm ("" : "+r" (f));                                             \
      69      if (f (FX##bits (VAL), RP) != FX##bits (ROUND))                  \
      70        abort();                                                       \
      71    }
      72  
      73  static void test2hr (void)
      74  {
      75    TEST2 (hr, 1, 0x7f, 0x7f);
      76    TEST2 (hr, 2, 0x70, 0x7f);
      77    TEST2 (hr, 3, 0x78, 0x7f);
      78    TEST2 (hr, 4, 0x7f, 0x7f);
      79   
      80    TEST2 (uhr, 1, 0x7f, 0x80);
      81    TEST2 (uhr, 2, 0x7f, 0x80);
      82    TEST2 (uhr, 3, 0x7f, 0x80);
      83    TEST2 (uhr, 4, 0x7f, 0x80);
      84  }
      85  
      86  void test2k (void)
      87  {
      88    TEST2 (k, 1, 0x7fffff00, 0x7fffffff);
      89    TEST2 (k, 2, 0x7ffffff0, 0x7fffffff);
      90    TEST2 (k, 2, 0x7ffff000, 0x7fffffff);
      91    TEST2 (k, 3, 0x7ffff000, 0x7ffff000);
      92    TEST2 (k, 3, 0x7ffff800, 0x7fffffff);
      93    TEST2 (k, 3, 0x7ffff7ff, 0x7ffff000);
      94    TEST2 (k, 4, 0x7ffff7ff, 0x7ffff800);
      95  
      96    TEST2 (uk, 1, 0x7fffffff, 1ul << 31);
      97    TEST2 (uk, 2, 0x7fffffff, 1ul << 31);
      98    TEST2 (uk, 3, 0x7fffffff, 1ul << 31);
      99    TEST2 (uk, 4, 0x7fffffff, 1ul << 31);
     100  }
     101  
     102  #define DEFTEST3(FX, FBIT)                            \
     103    void test3##FX (void)                               \
     104    {                                                   \
     105      TEST2 (FX, FBIT-1, 0b01100, 0b01100);             \
     106      TEST2 (FX, FBIT-2, 0b01100, 0b01100);             \
     107      TEST2 (FX, FBIT-3, 0b01100, 0b10000);             \
     108      TEST2 (FX, FBIT-4, 0b01100, 0b10000);             \
     109      TEST2 (FX, FBIT-5, 0b01100, 0);                   \
     110                                                        \
     111      if (FX##bits ((int_##FX##_t) -1) > 0)             \
     112        return;                                         \
     113                                                        \
     114      TEST2 (FX, FBIT-1, -0b01100, -0b01100);           \
     115      TEST2 (FX, FBIT-2, -0b01100, -0b01100);           \
     116      TEST2 (FX, FBIT-3, -0b01100, -0b01000);           \
     117      TEST2 (FX, FBIT-4, -0b01100, -0b10000);           \
     118      TEST2 (FX, FBIT-5, -0b01100, -0b00000);           \
     119      }
     120  
     121  DEFTEST3 (hr, SFRACT_FBIT)
     122  DEFTEST3 (r, FRACT_FBIT)
     123  DEFTEST3 (lr, LFRACT_FBIT)
     124  
     125  DEFTEST3 (uhr, USFRACT_FBIT)
     126  DEFTEST3 (ur, UFRACT_FBIT)
     127  DEFTEST3 (ulr, ULFRACT_FBIT)
     128  
     129  DEFTEST3 (hk, SACCUM_FBIT)
     130  DEFTEST3 (k, ACCUM_FBIT)
     131  DEFTEST3 (lk, LACCUM_FBIT)
     132  DEFTEST3 (llk, LLACCUM_FBIT)
     133  
     134  DEFTEST3 (uhk, USACCUM_FBIT)
     135  DEFTEST3 (uk, UACCUM_FBIT)
     136  DEFTEST3 (ulk, ULACCUM_FBIT)
     137  DEFTEST3 (ullk, ULLACCUM_FBIT)
     138  
     139  int main (void)
     140  {
     141    test2hr();
     142    test2k();
     143  
     144    test3hr();
     145    test3r();
     146    test3lr();
     147  
     148    test3uhr();
     149    test3ur();
     150    test3ulr();
     151  
     152    test3hk();
     153    test3k();
     154    test3lk();
     155    test3llk();
     156  
     157    test3uhk();
     158    test3uk();
     159    test3ulk();
     160    test3ullk();
     161  
     162    return 0;
     163  }
     164