(root)/
gcc-13.2.0/
gcc/
testsuite/
gcc.c-torture/
execute/
20020108-1.c
       1  /* This file tests shifts in various integral modes.  */
       2  
       3  #include <limits.h>
       4  
       5  #define CAT(A, B) A ## B
       6  
       7  #define REPEAT_8	\
       8  REPEAT_FN ( 0)		\
       9  REPEAT_FN ( 1)		\
      10  REPEAT_FN ( 2)		\
      11  REPEAT_FN ( 3)		\
      12  REPEAT_FN ( 4)		\
      13  REPEAT_FN ( 5)		\
      14  REPEAT_FN ( 6)		\
      15  REPEAT_FN ( 7)
      16  
      17  #define REPEAT_16	\
      18  REPEAT_8		\
      19  REPEAT_FN ( 8)		\
      20  REPEAT_FN ( 9)		\
      21  REPEAT_FN (10)		\
      22  REPEAT_FN (11)		\
      23  REPEAT_FN (12)		\
      24  REPEAT_FN (13)		\
      25  REPEAT_FN (14)		\
      26  REPEAT_FN (15)
      27  
      28  #define REPEAT_32	\
      29  REPEAT_16		\
      30  REPEAT_FN (16)		\
      31  REPEAT_FN (17)		\
      32  REPEAT_FN (18)		\
      33  REPEAT_FN (19)		\
      34  REPEAT_FN (20)		\
      35  REPEAT_FN (21)		\
      36  REPEAT_FN (22)		\
      37  REPEAT_FN (23)		\
      38  REPEAT_FN (24)		\
      39  REPEAT_FN (25)		\
      40  REPEAT_FN (26)		\
      41  REPEAT_FN (27)		\
      42  REPEAT_FN (28)		\
      43  REPEAT_FN (29)		\
      44  REPEAT_FN (30)		\
      45  REPEAT_FN (31)
      46  
      47  /* Define 8-bit shifts.  */
      48  #if CHAR_BIT == 8
      49  typedef unsigned int u8 __attribute__((mode(QI)));
      50  typedef signed int s8 __attribute__((mode(QI)));
      51  
      52  #define REPEAT_FN(COUNT) \
      53  u8 CAT (ashift_qi_, COUNT) (u8 n) { return n << COUNT; }
      54  REPEAT_8
      55  #undef REPEAT_FN
      56  
      57  #define REPEAT_FN(COUNT) \
      58  u8 CAT (lshiftrt_qi_, COUNT) (u8 n) { return n >> COUNT; }
      59  REPEAT_8
      60  #undef REPEAT_FN
      61  
      62  #define REPEAT_FN(COUNT) \
      63  s8 CAT (ashiftrt_qi_, COUNT) (s8 n) { return n >> COUNT; }
      64  REPEAT_8
      65  #undef REPEAT_FN
      66  #endif /* CHAR_BIT == 8 */
      67  
      68  /* Define 16-bit shifts.  */
      69  #if CHAR_BIT == 8 || CHAR_BIT == 16
      70  #if CHAR_BIT == 8
      71  typedef unsigned int u16 __attribute__((mode(HI)));
      72  typedef signed int s16 __attribute__((mode(HI)));
      73  #elif CHAR_BIT == 16
      74  typedef unsigned int u16 __attribute__((mode(QI)));
      75  typedef signed int s16 __attribute__((mode(QI)));
      76  #endif
      77  
      78  #define REPEAT_FN(COUNT) \
      79  u16 CAT (ashift_hi_, COUNT) (u16 n) { return n << COUNT; }
      80  REPEAT_16
      81  #undef REPEAT_FN
      82  
      83  #define REPEAT_FN(COUNT) \
      84  u16 CAT (lshiftrt_hi_, COUNT) (u16 n) { return n >> COUNT; }
      85  REPEAT_16
      86  #undef REPEAT_FN
      87  
      88  #define REPEAT_FN(COUNT) \
      89  s16 CAT (ashiftrt_hi_, COUNT) (s16 n) { return n >> COUNT; }
      90  REPEAT_16
      91  #undef REPEAT_FN
      92  #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */
      93  
      94  /* Define 32-bit shifts.  */
      95  #if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32
      96  #if CHAR_BIT == 8
      97  typedef unsigned int u32 __attribute__((mode(SI)));
      98  typedef signed int s32 __attribute__((mode(SI)));
      99  #elif CHAR_BIT == 16
     100  typedef unsigned int u32 __attribute__((mode(HI)));
     101  typedef signed int s32 __attribute__((mode(HI)));
     102  #elif CHAR_BIT == 32
     103  typedef unsigned int u32 __attribute__((mode(QI)));
     104  typedef signed int s32 __attribute__((mode(QI)));
     105  #endif
     106  
     107  #define REPEAT_FN(COUNT) \
     108  u32 CAT (ashift_si_, COUNT) (u32 n) { return n << COUNT; }
     109  REPEAT_32
     110  #undef REPEAT_FN
     111  
     112  #define REPEAT_FN(COUNT) \
     113  u32 CAT (lshiftrt_si_, COUNT) (u32 n) { return n >> COUNT; }
     114  REPEAT_32
     115  #undef REPEAT_FN
     116  
     117  #define REPEAT_FN(COUNT) \
     118  s32 CAT (ashiftrt_si_, COUNT) (s32 n) { return n >> COUNT; }
     119  REPEAT_32
     120  #undef REPEAT_FN
     121  #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */
     122  
     123  extern void abort (void);
     124  extern void exit (int);
     125  
     126  int
     127  main ()
     128  {
     129    /* Test 8-bit shifts.  */
     130  #if CHAR_BIT == 8
     131  # define REPEAT_FN(COUNT) \
     132    if (CAT (ashift_qi_, COUNT) (0xff) != (u8) ((u8)0xff << COUNT)) abort ();
     133    REPEAT_8;
     134  # undef REPEAT_FN
     135  
     136  # define REPEAT_FN(COUNT) \
     137    if (CAT (lshiftrt_qi_, COUNT) (0xff) != (u8) ((u8)0xff >> COUNT)) abort ();
     138    REPEAT_8;
     139  # undef REPEAT_FN
     140  
     141  # define REPEAT_FN(COUNT) \
     142    if (CAT (ashiftrt_qi_, COUNT) (-1) != -1) abort ();
     143    REPEAT_8;
     144  # undef REPEAT_FN
     145  
     146  # define REPEAT_FN(COUNT) \
     147    if (CAT (ashiftrt_qi_, COUNT) (0) != 0) abort ();
     148    REPEAT_8;
     149  # undef REPEAT_FN
     150  #endif /* CHAR_BIT == 8 */
     151  
     152    /* Test 16-bit shifts.  */
     153  #if CHAR_BIT == 8 || CHAR_BIT == 16
     154  # define REPEAT_FN(COUNT)			\
     155    if (CAT (ashift_hi_, COUNT) (0xffff)		\
     156        != (u16) ((u16) 0xffff << COUNT)) abort ();
     157    REPEAT_16;
     158  # undef REPEAT_FN
     159  
     160  # define REPEAT_FN(COUNT)			\
     161    if (CAT (lshiftrt_hi_, COUNT) (0xffff)	\
     162        != (u16) ((u16) 0xffff >> COUNT)) abort ();
     163    REPEAT_16;
     164  # undef REPEAT_FN
     165  
     166  # define REPEAT_FN(COUNT) \
     167    if (CAT (ashiftrt_hi_, COUNT) (-1) != -1) abort ();
     168    REPEAT_16;
     169  # undef REPEAT_FN
     170  
     171  # define REPEAT_FN(COUNT) \
     172    if (CAT (ashiftrt_hi_, COUNT) (0) != 0) abort ();
     173    REPEAT_16;
     174  # undef REPEAT_FN
     175  #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */
     176  
     177    /* Test 32-bit shifts.  */
     178  #if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32
     179  # define REPEAT_FN(COUNT)				\
     180    if (CAT (ashift_si_, COUNT) (0xffffffff)		\
     181        != (u32) ((u32) 0xffffffff << COUNT)) abort ();
     182    REPEAT_32;
     183  # undef REPEAT_FN
     184  
     185  # define REPEAT_FN(COUNT)				\
     186    if (CAT (lshiftrt_si_, COUNT) (0xffffffff)		\
     187        != (u32) ((u32) 0xffffffff >> COUNT)) abort ();
     188    REPEAT_32;
     189  # undef REPEAT_FN
     190  
     191  # define REPEAT_FN(COUNT) \
     192    if (CAT (ashiftrt_si_, COUNT) (-1) != -1) abort ();
     193    REPEAT_32;
     194  # undef REPEAT_FN
     195  
     196  # define REPEAT_FN(COUNT) \
     197    if (CAT (ashiftrt_si_, COUNT) (0) != 0) abort ();
     198    REPEAT_32;
     199  # undef REPEAT_FN
     200  #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */
     201  
     202    exit (0);
     203  }