(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.dg/
vect/
vect-shift-2.c
       1  /* { dg-additional-options "-Wno-shift-overflow" } */
       2  /* { dg-require-effective-target vect_shift } */
       3  /* { dg-require-effective-target vect_int } */
       4  /* Check the standard integer types for left and right shifts to see if the
       5     compiler replaced a scalar instruction with a vector instruction whether the
       6     correct value is generated.  */
       7  
       8  #ifdef TRACE
       9  #endif
      10  
      11  #include <stdarg.h>
      12  #include "tree-vect.h"
      13  
      14  #ifndef ALIGN
      15  #define ALIGN __attribute__((__aligned__(__BIGGEST_ALIGNMENT__)))
      16  #endif
      17  
      18  #ifndef NOINLINE
      19  #define NOINLINE __attribute__((__noinline__))
      20  #endif
      21  
      22  #ifdef TRACE
      23  #define TRACE_FUNC(PREFIX, NAME) printf (#PREFIX #NAME "\n")
      24  #define TRACE_DONE()  printf ("done!\n")
      25  #define TRACE_ABORT(I,E,G)						\
      26  do {									\
      27    printf ("Element %d, expected 0x%lx, got 0x%lx\n",			\
      28  	  I, (long)(E), (long)(G));					\
      29    abort ();								\
      30  } while (0)
      31  
      32  #else
      33  #define TRACE_FUNC(PREFIX, A)
      34  #define TRACE_DONE()
      35  #define TRACE_ABORT(I,E,G) abort ()
      36  #endif
      37  
      38  #define NAME(A,B) A ## B
      39  
      40  #define VECT_TESTS(PREFIX, TYPE, N)					\
      41   /* Restrict the optimizer from optimizing the setup loops.  */		\
      42  volatile TYPE NAME (PREFIX, zero) = 0;					\
      43  									\
      44  TYPE NAME (PREFIX, a)[N] ALIGN;						\
      45  TYPE NAME (PREFIX, b)[N] ALIGN;						\
      46  TYPE NAME (PREFIX, c)[N] ALIGN;						\
      47  TYPE NAME (PREFIX, d)[N] ALIGN;						\
      48  									\
      49  static void NOINLINE							\
      50  NAME (PREFIX, lshift_2) (void)						\
      51  {									\
      52    int i;								\
      53  									\
      54    TRACE_FUNC (PREFIX, lshift_2);					\
      55    for (i = 0; i < N; i++)						\
      56      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << 2;			\
      57  }									\
      58  									\
      59  static void NOINLINE							\
      60  NAME (PREFIX, lshift_var) (int shift)					\
      61  {									\
      62    int i;								\
      63  									\
      64    TRACE_FUNC (PREFIX, lshift_var);					\
      65    for (i = 0; i < N; i++)						\
      66      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << shift;			\
      67  }									\
      68  									\
      69  static void NOINLINE							\
      70  NAME (PREFIX, lshift_vect) (void)					\
      71  {									\
      72    int i;								\
      73  									\
      74    TRACE_FUNC (PREFIX, lshift_vect);					\
      75    for (i = 0; i < N; i++)						\
      76      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] << NAME (PREFIX, c)[i];	\
      77  }									\
      78  									\
      79  static void NOINLINE							\
      80  NAME (PREFIX, rshift_2) (void)						\
      81  {									\
      82    int i;								\
      83  									\
      84    TRACE_FUNC (PREFIX, rshift_2);					\
      85    for (i = 0; i < N; i++)						\
      86      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> 2;			\
      87  }									\
      88  									\
      89  static void NOINLINE							\
      90  NAME (PREFIX, rshift_var) (int shift)					\
      91  {									\
      92    int i;								\
      93  									\
      94    TRACE_FUNC (PREFIX, rshift_var);					\
      95    for (i = 0; i < N; i++)						\
      96      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> shift;			\
      97  }									\
      98  									\
      99  static void NOINLINE							\
     100  NAME (PREFIX, rshift_vect) (void)					\
     101  {									\
     102    int i;								\
     103  									\
     104    TRACE_FUNC (PREFIX, rshift_vect);					\
     105    for (i = 0; i < N; i++)						\
     106      NAME (PREFIX, a)[i] = NAME (PREFIX, b)[i] >> NAME (PREFIX, c)[i];	\
     107  }									\
     108  									\
     109  static void NOINLINE							\
     110  NAME (PREFIX, check) (void)						\
     111  {									\
     112    int i;								\
     113  									\
     114    TRACE_FUNC (PREFIX, check);						\
     115    for (i = 0; i < N; i++)						\
     116      if (NAME (PREFIX, a)[i] != NAME (PREFIX, d)[i])			\
     117        TRACE_ABORT (i, NAME (PREFIX, d)[i], NAME (PREFIX, a)[i]);	\
     118  }									\
     119  									\
     120  static void NOINLINE							\
     121  NAME (PREFIX, tests) (void)						\
     122  {									\
     123    int i;								\
     124  									\
     125    TRACE_FUNC (PREFIX, tests);						\
     126    for (i = 0; i < N; i++)						\
     127      {									\
     128        NAME (PREFIX, b)[i] = (i + NAME (PREFIX, zero));			\
     129        NAME (PREFIX, c)[i] = 2;						\
     130        NAME (PREFIX, d)[i] = (i + NAME (PREFIX, zero)) << 2;		\
     131      }									\
     132  									\
     133    NAME (PREFIX, lshift_2) ();						\
     134    NAME (PREFIX, check) ();						\
     135  									\
     136    NAME (PREFIX, lshift_var) (2);					\
     137    NAME (PREFIX, check) ();						\
     138  									\
     139    NAME (PREFIX, lshift_vect) ();					\
     140    NAME (PREFIX, check) ();						\
     141  									\
     142    for (i = 0; i < N; i++)						\
     143      {									\
     144        NAME (PREFIX, b)[i] = ((i + NAME (PREFIX, zero)) << 4)		\
     145  	| (((TYPE)0x80) << ((sizeof (TYPE) * 8) - 8));			\
     146        NAME (PREFIX, c)[i] = 2;						\
     147        NAME (PREFIX, d)[i] = (TYPE)((NAME (PREFIX, b)[i]			\
     148  				    + NAME (PREFIX, zero)) >> 2);	\
     149      }									\
     150  									\
     151    NAME (PREFIX, rshift_2) ();						\
     152    NAME (PREFIX, check) ();						\
     153  									\
     154    NAME (PREFIX, rshift_var) (2);					\
     155    NAME (PREFIX, check) ();						\
     156  									\
     157    NAME (PREFIX, rshift_vect) ();					\
     158    NAME (PREFIX, check) ();						\
     159  }
     160  
     161  VECT_TESTS(uc_, unsigned char,  16)
     162  VECT_TESTS(us_, unsigned short, 32)
     163  VECT_TESTS(ui_, unsigned int,   32)
     164  VECT_TESTS(ul_, unsigned long,  32)
     165  
     166  VECT_TESTS(sc_, signed char,    16)
     167  VECT_TESTS(ss_, short,          32)
     168  VECT_TESTS(si_, int,            32)
     169  VECT_TESTS(sl_, long,           32)
     170  
     171  int main ()
     172  {
     173    int i;
     174  
     175    check_vect ();
     176  
     177    uc_tests ();
     178    us_tests ();
     179    ui_tests ();
     180    ul_tests ();
     181  
     182    sc_tests ();
     183    ss_tests ();
     184    si_tests ();
     185    sl_tests ();
     186  
     187    TRACE_DONE ();
     188    return 0;
     189  }
     190