aboutsummaryrefslogtreecommitdiffstats
path: root/gcc-4.9/gcc/testsuite/gcc.target/m68k
diff options
context:
space:
mode:
authorBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
committerBen Cheng <bccheng@google.com>2014-03-25 22:37:19 -0700
commit1bc5aee63eb72b341f506ad058502cd0361f0d10 (patch)
treec607e8252f3405424ff15bc2d00aa38dadbb2518 /gcc-4.9/gcc/testsuite/gcc.target/m68k
parent283a0bf58fcf333c58a2a92c3ebbc41fb9eb1fdb (diff)
downloadtoolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.gz
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.tar.bz2
toolchain_gcc-1bc5aee63eb72b341f506ad058502cd0361f0d10.zip
Initial checkin of GCC 4.9.0 from trunk (r208799).
Change-Id: I48a3c08bb98542aa215912a75f03c0890e497dba
Diffstat (limited to 'gcc-4.9/gcc/testsuite/gcc.target/m68k')
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/20090709-1.c20
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/20100512-1.c16
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/crash1.c42
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-1.c24
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-2.c22
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-1.c43
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-2.c23
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-3.c7
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/m68k.exp41
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pic-1.c18
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr35018.c31
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36133.c16
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36134.c28
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr41302.c14
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr45015.c26
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr52573.c157
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/pr54041.c10
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/slp-ice.c15
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/stack-limit-1.c6
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c14
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c14
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c14
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld.c14
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le.c13
-rw-r--r--gcc-4.9/gcc/testsuite/gcc.target/m68k/xgot-1.c11
30 files changed, 704 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/20090709-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/20090709-1.c
new file mode 100644
index 000000000..fda05b756
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/20090709-1.c
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* There should be 3 occurrences of .LC0 in the code:
+ one for the definition of "0",
+ one for use in test1() and
+ one for use in test2().
+ FIXME: At the moment m68k GCC does not optimize test1() to nop
+ for some reason. */
+/* { dg-final { scan-assembler-times ".LC0" 3 } } */
+
+void dummy(char *arg);
+
+void test1(void)
+{
+ char tmp[2] = "0";
+}
+
+void test2(void)
+{
+ dummy("0");
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/20100512-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/20100512-1.c
new file mode 100644
index 000000000..d07bb519a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/20100512-1.c
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fstack-protector" } */
+/* { dg-require-effective-target fstack_protector } */
+/* There should be 2 references to __stack_chk_guard in every function. */
+/* { dg-final { scan-assembler-times "__stack_chk_guard" 4 } } */
+
+#include <stdlib.h>
+#include <string.h>
+void doTest1(void) {
+ volatile char foo[10];
+ memset((void *)foo, 1, 100);
+}
+void doTest2(void) {
+ volatile char foo[10];
+ memset((void *)foo, 1, 100);
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/crash1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/crash1.c
new file mode 100644
index 000000000..fdd737ab2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/crash1.c
@@ -0,0 +1,42 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -fomit-frame-pointer" } */
+
+/* Caused an ICE because of forgotten auto increment. */
+
+register void *current __asm__("%a2");
+
+struct kernel_stat
+{
+ long long user;
+ long long nice;
+ long long system;
+ long long idle;
+ long long steal;
+ unsigned irqs[256];
+};
+extern struct kernel_stat per_cpu__kstat;
+
+void show_stat(void)
+{
+ int i;
+ long long user, nice, system, idle, steal;
+ long long sum = 0;
+
+ user = nice = system = idle = steal = 0;
+ for (i = 0; i < 1; i++)
+ {
+ int j;
+ user = user + per_cpu__kstat.user;
+ nice = nice + per_cpu__kstat.nice;
+ system = system + per_cpu__kstat.system;
+ idle = idle + per_cpu__kstat.idle;
+ steal = steal + per_cpu__kstat.steal;
+
+ for (j = 0 ; j < 256 ; j++)
+ sum += per_cpu__kstat.irqs[j];
+ }
+ seq_printf(user, nice, system, idle, steal);
+ seq_printf(sum);
+ for (i = 0; i < 256; i++)
+ seq_printf (i);
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-1.c
new file mode 100644
index 000000000..443c13b46
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "j(ra|mp)\[ \t\]*interrupt_sibcall" } } */
+/* { dg-final { scan-assembler "j(b|)sr\[ \t\]*interrupt_call" } } */
+/* { dg-final { scan-assembler "j(ra|mp)\[ \t\]*normal_sibcall" } } */
+
+void normal_sibcall (void);
+void interrupt_call (void);
+void __attribute ((interrupt)) interrupt_sibcall (void);
+
+void normal (void)
+{
+ normal_sibcall ();
+}
+
+void __attribute ((interrupt)) interrupt (void)
+{
+ interrupt_call ();
+}
+
+void __attribute ((interrupt)) interrupt_2 (void)
+{
+ interrupt_sibcall ();
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-2.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-2.c
new file mode 100644
index 000000000..7d4cb68c1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt-2.c
@@ -0,0 +1,22 @@
+/* { dg-do compile } */
+int x;
+volatile unsigned int y;
+
+#define REPEAT10(X, Y) \
+ X(Y##0); X(Y##1); X(Y##2); X(Y##3); X(Y##4); \
+ X(Y##5); X(Y##6); X(Y##7); X(Y##8); X(Y##9)
+
+#define REPEAT30(X) REPEAT10 (X, 0); REPEAT10 (X, 1); REPEAT10 (X, 2)
+#define IN(X) unsigned int x##X = y
+#define OUT(X) y = x##X
+
+void __attribute__ ((interrupt_handler)) f1 (void)
+{
+ x = y + 11;
+}
+
+void __attribute__ ((interrupt_handler)) f2 (void)
+{
+ REPEAT30 (IN);
+ REPEAT30 (OUT);
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-1.c
new file mode 100644
index 000000000..ee7179cd4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-1.c
@@ -0,0 +1,43 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=fidoa -O2 -fomit-frame-pointer" } */
+
+/* Check that interrupt_thread attribute works. */
+
+#ifdef __mfido__
+extern void foo (void) __attribute__ ((interrupt_thread));
+
+int a, b, c, d;
+
+void bar (void);
+
+void
+foo (void)
+{
+ int w, x, y, z;
+
+ w = a;
+ x = b;
+ y = c;
+ z = d;
+
+ bar ();
+
+ a = w;
+ b = x;
+ c = y;
+ d = z;
+}
+#else
+/* If the current mutilib is, say, -mcpu=5485, the compiler gets
+ -mcpu=fidoa -mcpu=5485, where -mcpu=fidoa is overridden. In that
+ case, we just print out "sleep" in the assembly file and pretend
+ that everything is all right. */
+asm ("sleep");
+#endif
+
+/* "sleep" should be generated in place of "rts". */
+/* { dg-final { scan-assembler-times "sleep" 1 } } */
+/* { dg-final { scan-assembler-times "rts" 0 } } */
+
+/* There should be no stack adjustment. */
+/* { dg-final { scan-assembler-times "sp" 0 } } */
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-2.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-2.c
new file mode 100644
index 000000000..1518bece5
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-2.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=fidoa" } */
+
+/* Check that an error is issued for using more than one
+ interrupt_attribute at the same time. */
+
+/* If the current mutilib is, say, -mcpu=5485, the compiler gets
+ -mcpu=fidoa -mcpu=5485, where -mcpu=fidoa is overridden. In that
+ case, we just use two interrupt_handler attributes and expect the
+ same error. */
+#ifdef __mfido___
+#define IH interrupt_thread
+#else
+#define IH interrupt_handler
+#endif
+
+extern void f1 (void) __attribute__((interrupt_handler, interrupt_handler)); /* { dg-error "multiple interrupt attributes not allowed" } */
+
+extern void f2 (void) __attribute__((interrupt_handler, IH)); /* { dg-error "multiple interrupt attributes not allowed" } */
+
+extern void f3 (void) __attribute__((IH, interrupt_handler)); /* { dg-error "multiple interrupt attributes not allowed" } */
+
+extern void f4 (void) __attribute__((IH, IH)); /* { dg-error "multiple interrupt attributes not allowed" } */
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-3.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-3.c
new file mode 100644
index 000000000..be83edb5f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/interrupt_thread-3.c
@@ -0,0 +1,7 @@
+/* { dg-do compile } */
+/* { dg-options "-mcpu=cpu32" } */
+
+/* Check that interrupt_thread is rejected on CPUs other than
+ fido. */
+
+extern void foo (void) __attribute__((interrupt_thread)); /* { dg-error "interrupt_thread is available only on fido" } */
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/m68k.exp b/gcc-4.9/gcc/testsuite/gcc.target/m68k/m68k.exp
new file mode 100644
index 000000000..a917898ab
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/m68k.exp
@@ -0,0 +1,41 @@
+# Copyright (C) 1997-2014 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3. If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+# Exit immediately if this isn't an m68k target.
+if { ![istarget m68k*-*-*] && ![istarget fido*-*-*] } then {
+ return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# If a testcase doesn't have special options, use these.
+global DEFAULT_CFLAGS
+if ![info exists DEFAULT_CFLAGS] then {
+ set DEFAULT_CFLAGS " -ansi -pedantic-errors"
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]] \
+ "" $DEFAULT_CFLAGS
+
+# All done.
+dg-finish
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pic-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pic-1.c
new file mode 100644
index 000000000..b8d3fe81a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pic-1.c
@@ -0,0 +1,18 @@
+/* { dg-do compile { target m68k-*-* fido-*-* } } */
+/* { dg-options "-O2 -fpic" } */
+
+extern void Foo (void *);
+
+char *ary[] = {"a", "b", "c", "d", "e"};
+
+void Bar (void)
+{
+ int cnt = 0;
+
+ for (cnt = 0; cnt < 4; ++cnt)
+ {
+ char *ptr = ary[cnt];
+
+ Foo (&ptr);
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr35018.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr35018.c
new file mode 100644
index 000000000..fadea8620
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr35018.c
@@ -0,0 +1,31 @@
+/* { dg-do compile } */
+/* { dg-options "-Os -mcpu=5249" } */
+
+static inline void vect_add(int *x, int *y, int n)
+{
+ asm volatile ("nop;"
+ : [n] "+d" (n), [x] "+a" (x), [y] "+a" (y)
+ : : "%d0", "%d1", "%d2", "%d3", "%a0", "%a1", "%a2", "%a3",
+ "cc", "memory");
+}
+
+extern void vect_copy (int *, int *, int);
+
+void vorbis_synthesis_blockin(int *blocksizes)
+{
+ int j, *pcm, *p;
+
+ int n=blocksizes[*p]/2;
+ int n0=blocksizes[0]/2;
+ int n1=blocksizes[1]/2;
+
+ for(j=0;j<*p;j++)
+ {
+ vect_add(p, pcm, n1);
+ vect_add(pcm, p, n0);
+ vect_add(p, pcm, n0);
+ vect_add(p, pcm, n0);
+ vect_copy(pcm, p, n);
+ }
+}
+
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36133.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36133.c
new file mode 100644
index 000000000..25237a860
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36133.c
@@ -0,0 +1,16 @@
+/* pr36133.c
+
+ This test ensures that conditional branches can use the condition codes
+ written by shift instructions, without the need for an extra TST. */
+
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "tst" } } */
+
+void
+f (unsigned int a)
+{
+ if (a >> 4)
+ asm volatile ("nop");
+ asm volatile ("nop");
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36134.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36134.c
new file mode 100644
index 000000000..c91956b5c
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr36134.c
@@ -0,0 +1,28 @@
+/* pr36134.c
+
+ This test ensures that the shorter LEA instruction is used in preference
+ to the longer ADD instruction.
+
+ This preference is applicable to ColdFire only. On CPU32, we can
+ use a sequence of two ADDQ instructions, which is faster than the
+ LEA instruction. */
+
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "-mcpu=*" } { "-mcpu=5208" } } */
+/* { dg-options "-O2 -mcpu=5208" } */
+/* { dg-final { scan-assembler "lea" } } */
+/* { dg-final { scan-assembler-not "add" } } */
+
+int *a, *b;
+
+void
+f ()
+{
+ while (a > b)
+ {
+ *a++ = *b++;
+ *a++ = *b++;
+ *a++ = *b++;
+ *a++ = *b++;
+ }
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr41302.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr41302.c
new file mode 100644
index 000000000..c3679923e
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr41302.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "move.l \%d0,\%a0" { target *-*-*linux* } } } */
+
+struct pts {
+ int c;
+};
+
+unsigned int bar (struct pts *a, int b);
+
+struct pts * foo (struct pts *a, int b)
+{
+ return (struct pts *) bar (a, b);
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr45015.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr45015.c
new file mode 100644
index 000000000..fba9550e9
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr45015.c
@@ -0,0 +1,26 @@
+/* PR debug/45015 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -g" } */
+
+unsigned int
+foo (unsigned int *x, const unsigned int *y, int z, unsigned int w)
+{
+ unsigned int a, b, c, s;
+ int j;
+ j = -z;
+ x -= j;
+ y -= j;
+ a = 0;
+ do
+ {
+ __asm__ ("move.l %2, %0; move.l %3, %1" : "=d" (b), "=d" (c) : "g<>" (y[j]), "d" (w));
+ c += a;
+ a = (c < a) + b;
+ s = x[j];
+ c = s + c;
+ a += (c < s);
+ x[j] = c;
+ }
+ while (++j != 0);
+ return a;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr52573.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr52573.c
new file mode 100644
index 000000000..df4119b0f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr52573.c
@@ -0,0 +1,157 @@
+
+/* { dg-options "-w -O3 -funroll-loops" } */
+/* { dg-final { scan-assembler-not "%d0:%d0" } } */
+/* { dg-final { scan-assembler-not "%d1:%d1" } } */
+/* { dg-final { scan-assembler-not "%d2:%d2" } } */
+/* { dg-final { scan-assembler-not "%d3:%d3" } } */
+/* { dg-final { scan-assembler-not "%d4:%d4" } } */
+/* { dg-final { scan-assembler-not "%d5:%d5" } } */
+/* { dg-final { scan-assembler-not "%d6:%d6" } } */
+/* { dg-final { scan-assembler-not "%d7:%d7" } } */
+/* Test arithmetics on bitfields. */
+
+extern void abort (void);
+extern void exit (int);
+
+unsigned int
+myrnd (void)
+{
+ static unsigned int s = 1388815473;
+ s *= 1103515245;
+ s += 12345;
+ return (s / 65536) % 2048;
+}
+
+#define T(S) \
+struct S s##S; \
+struct S retme##S (struct S x) \
+{ \
+ return x; \
+} \
+ \
+unsigned int fn1##S (unsigned int x) \
+{ \
+ struct S y = s##S; \
+ y.k += x; \
+ y = retme##S (y); \
+ return y.k; \
+} \
+ \
+unsigned int fn2##S (unsigned int x) \
+{ \
+ struct S y = s##S; \
+ y.k += x; \
+ y.k %= 15; \
+ return y.k; \
+} \
+ \
+unsigned int retit##S (void) \
+{ \
+ return s##S.k; \
+} \
+ \
+unsigned int fn3##S (unsigned int x) \
+{ \
+ s##S.k += x; \
+ return retit##S (); \
+} \
+ \
+void test##S (void) \
+{ \
+ int i; \
+ unsigned int mask, v, a, r; \
+ struct S x; \
+ char *p = (char *) &s##S; \
+ for (i = 0; i < sizeof (s##S); ++i) \
+ *p++ = myrnd (); \
+ if (__builtin_classify_type (s##S.l) == 8) \
+ s##S.l = 5.25; \
+ s##S.k = -1; \
+ mask = s##S.k; \
+ v = myrnd (); \
+ a = myrnd (); \
+ s##S.k = v; \
+ x = s##S; \
+ r = fn1##S (a); \
+ if (x.i != s##S.i || x.j != s##S.j \
+ || x.k != s##S.k || x.l != s##S.l \
+ || ((v + a) & mask) != r) \
+ abort (); \
+ v = myrnd (); \
+ a = myrnd (); \
+ s##S.k = v; \
+ x = s##S; \
+ r = fn2##S (a); \
+ if (x.i != s##S.i || x.j != s##S.j \
+ || x.k != s##S.k || x.l != s##S.l \
+ || ((((v + a) & mask) % 15) & mask) != r) \
+ abort (); \
+ v = myrnd (); \
+ a = myrnd (); \
+ s##S.k = v; \
+ x = s##S; \
+ r = fn3##S (a); \
+ if (x.i != s##S.i || x.j != s##S.j \
+ || s##S.k != r || x.l != s##S.l \
+ || ((v + a) & mask) != r) \
+ abort (); \
+}
+
+struct A { unsigned int i : 6, l : 1, j : 10, k : 15; }; T(A)
+struct B { unsigned int i : 6, j : 11, k : 15; unsigned int l; }; T(B)
+struct C { unsigned int l; unsigned int i : 6, j : 11, k : 15; }; T(C)
+struct D { unsigned long long l : 6, i : 6, j : 23, k : 29; }; T(D)
+struct E { unsigned long long l, i : 12, j : 23, k : 29; }; T(E)
+struct F { unsigned long long i : 12, j : 23, k : 29, l; }; T(F)
+struct G { unsigned int i : 12, j : 13, k : 7; unsigned long long l; }; T(G)
+struct H { unsigned int i : 12, j : 11, k : 9; unsigned long long l; }; T(H)
+struct I { unsigned short i : 1, j : 6, k : 9; unsigned long long l; }; T(I)
+struct J { unsigned short i : 1, j : 8, k : 7; unsigned short l; }; T(J)
+struct K { unsigned int k : 6, l : 1, j : 10, i : 15; }; T(K)
+struct L { unsigned int k : 6, j : 11, i : 15; unsigned int l; }; T(L)
+struct M { unsigned int l; unsigned int k : 6, j : 11, i : 15; }; T(M)
+struct N { unsigned long long l : 6, k : 6, j : 23, i : 29; }; T(N)
+struct O { unsigned long long l, k : 12, j : 23, i : 29; }; T(O)
+struct P { unsigned long long k : 12, j : 23, i : 29, l; }; T(P)
+struct Q { unsigned int k : 12, j : 13, i : 7; unsigned long long l; }; T(Q)
+struct R { unsigned int k : 12, j : 11, i : 9; unsigned long long l; }; T(R)
+struct S { unsigned short k : 1, j : 6, i : 9; unsigned long long l; }; T(S)
+struct T { unsigned short k : 1, j : 8, i : 7; unsigned short l; }; T(T)
+struct U { unsigned short j : 6, k : 1, i : 9; unsigned long long l; }; T(U)
+struct V { unsigned short j : 8, k : 1, i : 7; unsigned short l; }; T(V)
+struct W { long double l; unsigned int k : 12, j : 13, i : 7; }; T(W)
+struct X { unsigned int k : 12, j : 13, i : 7; long double l; }; T(X)
+struct Y { unsigned int k : 12, j : 11, i : 9; long double l; }; T(Y)
+struct Z { long double l; unsigned int j : 13, i : 7, k : 12; }; T(Z)
+
+int
+main (void)
+{
+ testA ();
+ testB ();
+ testC ();
+ testD ();
+ testE ();
+ testF ();
+ testG ();
+ testH ();
+ testI ();
+ testJ ();
+ testK ();
+ testL ();
+ testM ();
+ testN ();
+ testO ();
+ testP ();
+ testQ ();
+ testR ();
+ testS ();
+ testT ();
+ testU ();
+ testV ();
+ testW ();
+ testX ();
+ testY ();
+ testZ ();
+ exit (0);
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr54041.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr54041.c
new file mode 100644
index 000000000..645cb6d23
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/pr54041.c
@@ -0,0 +1,10 @@
+/* { dg-do compile } */
+/* { dg-options "-O -mshort" } */
+
+extern int r[];
+
+int *fn(int i)
+{
+ return &r[i];
+}
+
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/slp-ice.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/slp-ice.c
new file mode 100644
index 000000000..61c7f9df3
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/slp-ice.c
@@ -0,0 +1,15 @@
+/* From PR 7872, test for optabs segfault when strict low part is present. */
+/* { dg-do compile { target m68k-*-* } } */
+/* { dg-options "-O0" } */
+extern void (**table)(void);
+
+typedef unsigned short uw16;
+typedef unsigned int gshort;
+
+register uw16 *pc asm("%a4");
+register gshort code asm("%d6");
+
+void QMExecuteLoop(uw16 *oldPC)
+{
+ table[code=(*(uw16*)(pc++))]();
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/stack-limit-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/stack-limit-1.c
new file mode 100644
index 000000000..b1e9b99b2
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/stack-limit-1.c
@@ -0,0 +1,6 @@
+/* -fstack-limit- should be ignored without an ICE if not supported. */
+/* { dg-do compile } */
+/* { dg-options "-fstack-limit-symbol=_stack_limit -m68000" } */
+/* { dg-warning "not supported" "" { target *-*-* } 1 } */
+
+void dummy (void) { }
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c
new file mode 100644
index 000000000..2a4900b5a
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd-xgot.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic -mxgot" } */
+/* { dg-final { scan-assembler "#foo@TLSGD,\%\[ad\]\[0-7\]" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+
+extern int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd.c
new file mode 100644
index 000000000..2b69fbdc1
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-gd.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic" } */
+/* { dg-final { scan-assembler "foo@TLSGD\\(\%a5\\)" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+
+extern int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c
new file mode 100644
index 000000000..d3fbfdaa4
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie-xgot.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -mxgot" } */
+/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
+/* { dg-final { scan-assembler "#foo@TLSIE,\%\[ad\]\[0-7\]" } } */
+
+extern int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie.c
new file mode 100644
index 000000000..2661f9fc0
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ie.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
+/* { dg-final { scan-assembler "foo@TLSIE\\(\%a5\\)" } } */
+
+extern int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c
new file mode 100644
index 000000000..4817de01d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot-xtls.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic -mxgot -mxtls" } */
+/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c
new file mode 100644
index 000000000..f95f71928
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xgot.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic -mxgot" } */
+/* { dg-final { scan-assembler "#foo@TLSLDM,\%\[ad\]\[0-7\]" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c
new file mode 100644
index 000000000..1bc3eaf7d
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld-xtls.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic -mxtls" } */
+/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+/* { dg-final { scan-assembler "#foo@TLSLDO,\%\[ad\]\[0-7\]" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld.c
new file mode 100644
index 000000000..556a11718
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-ld.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -fpic" } */
+/* { dg-final { scan-assembler "foo@TLSLDM\\(\%a5\\)" } } */
+/* { dg-final { scan-assembler "bsr.l __tls_get_addr@PLTPC" } } */
+/* { dg-final { scan-assembler "lea \\(foo@TLSLDO,\%a0\\)" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c
new file mode 100644
index 000000000..90061153f
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le-xtls.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2 -mxtls" } */
+/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
+/* { dg-final { scan-assembler "#foo@TLSLE,\%\[ad\]\[0-7\]" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le.c
new file mode 100644
index 000000000..1c0eab238
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/tls-le.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { ! *-linux-* } { "*" } { "" } } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "jsr __m68k_read_tp" } } */
+/* { dg-final { scan-assembler "lea \\(foo@TLSLE,\%a0\\)" } } */
+
+static int __thread foo;
+
+int *
+bar (void)
+{
+ return &foo;
+}
diff --git a/gcc-4.9/gcc/testsuite/gcc.target/m68k/xgot-1.c b/gcc-4.9/gcc/testsuite/gcc.target/m68k/xgot-1.c
new file mode 100644
index 000000000..6794241a8
--- /dev/null
+++ b/gcc-4.9/gcc/testsuite/gcc.target/m68k/xgot-1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fpic -mxgot -mcpu=5206" } */
+/* { dg-final { scan-assembler "foo@GOT,\%\[ad\]\[0-7\]" } } */
+
+extern int foo;
+
+int
+bar (void)
+{
+ return foo;
+}