aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/20031201-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/20031201-1.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20031201-1.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/20031201-1.c b/gcc/testsuite/gcc.c-torture/execute/20031201-1.c
new file mode 100644
index 00000000000..7c8e0ea290f
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20031201-1.c
@@ -0,0 +1,76 @@
+/* Copyright (C) 2003 Free Software Foundation.
+ PR target/13256
+ STRICT_LOW_PART was handled incorrectly in delay slots.
+ Origin: Hans-Peter Nilsson. */
+
+typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s1;
+typedef struct { unsigned int e0 : 16; unsigned int e1 : 16; } s2;
+typedef struct { s1 i12; s2 i16; } io;
+static int test_length = 2;
+static io *i;
+static int m = 1;
+static int d = 1;
+static unsigned long test_t0;
+static unsigned long test_t1;
+void test(void) __attribute__ ((__noinline__));
+extern int f1 (void *port) __attribute__ ((__noinline__));
+extern void f0 (void) __attribute__ ((__noinline__));
+int
+f1 (void *port)
+{
+ int fail_count = 0;
+ unsigned long tlen;
+ s1 x0 = {0};
+ s2 x1 = {0};
+
+ i = port;
+ x0.e0 = x1.e0 = 32;
+ i->i12 = x0;
+ i->i16 = x1;
+ do f0(); while (test_t1);
+ x0.e0 = x1.e0 = 8;
+ i->i12 = x0;
+ i->i16 = x1;
+ test ();
+ if (m)
+ {
+ unsigned long e = 1000000000 / 460800 * test_length;
+ tlen = test_t1 - test_t0;
+ if (((tlen-e) & 0x7FFFFFFF) > 1000)
+ f0();
+ }
+ if (d)
+ {
+ unsigned long e = 1000000000 / 460800 * test_length;
+ tlen = test_t1 - test_t0;
+ if (((tlen - e) & 0x7FFFFFFF) > 1000)
+ f0();
+ }
+ return fail_count != 0 ? 1 : 0;
+}
+
+int
+main ()
+{
+ io io0;
+ f1 (&io0);
+ abort ();
+}
+
+void
+test (void)
+{
+ io *iop = i;
+ if (iop->i12.e0 != 8 || iop->i16.e0 != 8)
+ abort ();
+ exit (0);
+}
+
+void
+f0 (void)
+{
+ static int washere = 0;
+ io *iop = i;
+ if (washere++ || iop->i12.e0 != 32 || iop->i16.e0 != 32)
+ abort ();
+}