| /* This file tests shifts in various integral modes. */ |
| |
| #include <limits.h> |
| |
| #define CAT(A, B) A ## B |
| |
| #define REPEAT_8 \ |
| REPEAT_FN ( 0) \ |
| REPEAT_FN ( 1) \ |
| REPEAT_FN ( 2) \ |
| REPEAT_FN ( 3) \ |
| REPEAT_FN ( 4) \ |
| REPEAT_FN ( 5) \ |
| REPEAT_FN ( 6) \ |
| REPEAT_FN ( 7) |
| |
| #define REPEAT_16 \ |
| REPEAT_8 \ |
| REPEAT_FN ( 8) \ |
| REPEAT_FN ( 9) \ |
| REPEAT_FN (10) \ |
| REPEAT_FN (11) \ |
| REPEAT_FN (12) \ |
| REPEAT_FN (13) \ |
| REPEAT_FN (14) \ |
| REPEAT_FN (15) |
| |
| #define REPEAT_32 \ |
| REPEAT_16 \ |
| REPEAT_FN (16) \ |
| REPEAT_FN (17) \ |
| REPEAT_FN (18) \ |
| REPEAT_FN (19) \ |
| REPEAT_FN (20) \ |
| REPEAT_FN (21) \ |
| REPEAT_FN (22) \ |
| REPEAT_FN (23) \ |
| REPEAT_FN (24) \ |
| REPEAT_FN (25) \ |
| REPEAT_FN (26) \ |
| REPEAT_FN (27) \ |
| REPEAT_FN (28) \ |
| REPEAT_FN (29) \ |
| REPEAT_FN (30) \ |
| REPEAT_FN (31) |
| |
| /* Define 8-bit shifts. */ |
| #if CHAR_BIT == 8 |
| typedef unsigned int u8 __attribute__((mode(QI))); |
| typedef signed int s8 __attribute__((mode(QI))); |
| |
| #define REPEAT_FN(COUNT) \ |
| u8 CAT (ashift_qi_, COUNT) (u8 n) { return n << COUNT; } |
| REPEAT_8 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| u8 CAT (lshiftrt_qi_, COUNT) (u8 n) { return n >> COUNT; } |
| REPEAT_8 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| s8 CAT (ashiftrt_qi_, COUNT) (s8 n) { return n >> COUNT; } |
| REPEAT_8 |
| #undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 */ |
| |
| /* Define 16-bit shifts. */ |
| #if CHAR_BIT == 8 || CHAR_BIT == 16 |
| #if CHAR_BIT == 8 |
| typedef unsigned int u16 __attribute__((mode(HI))); |
| typedef signed int s16 __attribute__((mode(HI))); |
| #elif CHAR_BIT == 16 |
| typedef unsigned int u16 __attribute__((mode(QI))); |
| typedef signed int s16 __attribute__((mode(QI))); |
| #endif |
| |
| #define REPEAT_FN(COUNT) \ |
| u16 CAT (ashift_hi_, COUNT) (u16 n) { return n << COUNT; } |
| REPEAT_16 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| u16 CAT (lshiftrt_hi_, COUNT) (u16 n) { return n >> COUNT; } |
| REPEAT_16 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| s16 CAT (ashiftrt_hi_, COUNT) (s16 n) { return n >> COUNT; } |
| REPEAT_16 |
| #undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */ |
| |
| /* Define 32-bit shifts. */ |
| #if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 |
| #if CHAR_BIT == 8 |
| typedef unsigned int u32 __attribute__((mode(SI))); |
| typedef signed int s32 __attribute__((mode(SI))); |
| #elif CHAR_BIT == 16 |
| typedef unsigned int u32 __attribute__((mode(HI))); |
| typedef signed int s32 __attribute__((mode(HI))); |
| #elif CHAR_BIT == 32 |
| typedef unsigned int u32 __attribute__((mode(QI))); |
| typedef signed int s32 __attribute__((mode(QI))); |
| #endif |
| |
| #define REPEAT_FN(COUNT) \ |
| u32 CAT (ashift_si_, COUNT) (u32 n) { return n << COUNT; } |
| REPEAT_32 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| u32 CAT (lshiftrt_si_, COUNT) (u32 n) { return n >> COUNT; } |
| REPEAT_32 |
| #undef REPEAT_FN |
| |
| #define REPEAT_FN(COUNT) \ |
| s32 CAT (ashiftrt_si_, COUNT) (s32 n) { return n >> COUNT; } |
| REPEAT_32 |
| #undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */ |
| |
| extern void abort (void); |
| extern void exit (int); |
| |
| int |
| main () |
| { |
| /* Test 8-bit shifts. */ |
| #if CHAR_BIT == 8 |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashift_qi_, COUNT) (0xff) != (u8) ((u8)0xff << COUNT)) abort (); |
| REPEAT_8; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (lshiftrt_qi_, COUNT) (0xff) != (u8) ((u8)0xff >> COUNT)) abort (); |
| REPEAT_8; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_qi_, COUNT) (-1) != -1) abort (); |
| REPEAT_8; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_qi_, COUNT) (0) != 0) abort (); |
| REPEAT_8; |
| # undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 */ |
| |
| /* Test 16-bit shifts. */ |
| #if CHAR_BIT == 8 || CHAR_BIT == 16 |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashift_hi_, COUNT) (0xffff) \ |
| != (u16) ((u16) 0xffff << COUNT)) abort (); |
| REPEAT_16; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (lshiftrt_hi_, COUNT) (0xffff) \ |
| != (u16) ((u16) 0xffff >> COUNT)) abort (); |
| REPEAT_16; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_hi_, COUNT) (-1) != -1) abort (); |
| REPEAT_16; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_hi_, COUNT) (0) != 0) abort (); |
| REPEAT_16; |
| # undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 */ |
| |
| /* Test 32-bit shifts. */ |
| #if CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashift_si_, COUNT) (0xffffffff) \ |
| != (u32) ((u32) 0xffffffff << COUNT)) abort (); |
| REPEAT_32; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (lshiftrt_si_, COUNT) (0xffffffff) \ |
| != (u32) ((u32) 0xffffffff >> COUNT)) abort (); |
| REPEAT_32; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_si_, COUNT) (-1) != -1) abort (); |
| REPEAT_32; |
| # undef REPEAT_FN |
| |
| # define REPEAT_FN(COUNT) \ |
| if (CAT (ashiftrt_si_, COUNT) (0) != 0) abort (); |
| REPEAT_32; |
| # undef REPEAT_FN |
| #endif /* CHAR_BIT == 8 || CHAR_BIT == 16 || CHAR_BIT == 32 */ |
| |
| exit (0); |
| } |