PR target/13256
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Dec 2003 11:58:20 +0000 (11:58 +0000)
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Dec 2003 11:58:20 +0000 (11:58 +0000)
* gcc.c-torture/execute/20031201-1.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@74329 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20031201-1.c [new file with mode: 0644]

index 100d058..5a00a7a 100644 (file)
@@ -1,3 +1,8 @@
+2003-12-05  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR target/13256
+       * gcc.c-torture/execute/20031201-1.c: New test.
+
 2003-12-05  Arnaud Charlet  <charlet@act-europe.fr>
 
        * ada/acats/run_acats: Add checks against missing gnatlib/gnattools.
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 (file)
index 0000000..7c8e0ea
--- /dev/null
@@ -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 ();
+}