aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c')
-rw-r--r--SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c203
1 files changed, 203 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c b/SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c
new file mode 100644
index 00000000..58f96673
--- /dev/null
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/20020108-1.c
@@ -0,0 +1,203 @@
+/* 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);
+}