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 \ 8REPEAT_FN ( 0) \ 9REPEAT_FN ( 1) \ 10REPEAT_FN ( 2) \ 11REPEAT_FN ( 3) \ 12REPEAT_FN ( 4) \ 13REPEAT_FN ( 5) \ 14REPEAT_FN ( 6) \ 15REPEAT_FN ( 7) 16 17#define REPEAT_16 \ 18REPEAT_8 \ 19REPEAT_FN ( 8) \ 20REPEAT_FN ( 9) \ 21REPEAT_FN (10) \ 22REPEAT_FN (11) \ 23REPEAT_FN (12) \ 24REPEAT_FN (13) \ 25REPEAT_FN (14) \ 26REPEAT_FN (15) 27 28#define REPEAT_32 \ 29REPEAT_16 \ 30REPEAT_FN (16) \ 31REPEAT_FN (17) \ 32REPEAT_FN (18) \ 33REPEAT_FN (19) \ 34REPEAT_FN (20) \ 35REPEAT_FN (21) \ 36REPEAT_FN (22) \ 37REPEAT_FN (23) \ 38REPEAT_FN (24) \ 39REPEAT_FN (25) \ 40REPEAT_FN (26) \ 41REPEAT_FN (27) \ 42REPEAT_FN (28) \ 43REPEAT_FN (29) \ 44REPEAT_FN (30) \ 45REPEAT_FN (31) 46 47/* Define 8-bit shifts. */ 48#if CHAR_BIT == 8 49typedef unsigned int u8 __attribute__((mode(QI))); 50typedef signed int s8 __attribute__((mode(QI))); 51 52#define REPEAT_FN(COUNT) \ 53u8 CAT (ashift_qi_, COUNT) (u8 n) { return n << COUNT; } 54REPEAT_8 55#undef REPEAT_FN 56 57#define REPEAT_FN(COUNT) \ 58u8 CAT (lshiftrt_qi_, COUNT) (u8 n) { return n >> COUNT; } 59REPEAT_8 60#undef REPEAT_FN 61 62#define REPEAT_FN(COUNT) \ 63s8 CAT (ashiftrt_qi_, COUNT) (s8 n) { return n >> COUNT; } 64REPEAT_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 71typedef unsigned int u16 __attribute__((mode(HI))); 72typedef signed int s16 __attribute__((mode(HI))); 73#elif CHAR_BIT == 16 74typedef unsigned int u16 __attribute__((mode(QI))); 75typedef signed int s16 __attribute__((mode(QI))); 76#endif 77 78#define REPEAT_FN(COUNT) \ 79u16 CAT (ashift_hi_, COUNT) (u16 n) { return n << COUNT; } 80REPEAT_16 81#undef REPEAT_FN 82 83#define REPEAT_FN(COUNT) \ 84u16 CAT (lshiftrt_hi_, COUNT) (u16 n) { return n >> COUNT; } 85REPEAT_16 86#undef REPEAT_FN 87 88#define REPEAT_FN(COUNT) \ 89s16 CAT (ashiftrt_hi_, COUNT) (s16 n) { return n >> COUNT; } 90REPEAT_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 97typedef unsigned int u32 __attribute__((mode(SI))); 98typedef signed int s32 __attribute__((mode(SI))); 99#elif CHAR_BIT == 16 100typedef unsigned int u32 __attribute__((mode(HI))); 101typedef signed int s32 __attribute__((mode(HI))); 102#elif CHAR_BIT == 32 103typedef unsigned int u32 __attribute__((mode(QI))); 104typedef signed int s32 __attribute__((mode(QI))); 105#endif 106 107#define REPEAT_FN(COUNT) \ 108u32 CAT (ashift_si_, COUNT) (u32 n) { return n << COUNT; } 109REPEAT_32 110#undef REPEAT_FN 111 112#define REPEAT_FN(COUNT) \ 113u32 CAT (lshiftrt_si_, COUNT) (u32 n) { return n >> COUNT; } 114REPEAT_32 115#undef REPEAT_FN 116 117#define REPEAT_FN(COUNT) \ 118s32 CAT (ashiftrt_si_, COUNT) (s32 n) { return n >> COUNT; } 119REPEAT_32 120#undef REPEAT_FN 121#endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */ 122 123extern void abort (void); 124extern void exit (int); 125 126int 127main () 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} 204