From f36348b34b4513bc127d1b740e48b72b69f17c01 Mon Sep 17 00:00:00 2001 From: Oleg Endo Date: Sun, 13 Nov 2011 23:00:10 +0000 Subject: [PATCH] re PR target/50694 (SH Target: SH2A little endian does not actually work) PR target/50694 * config/sh/sh.h (IS_LITTLE_ENDIAN_OPTION, UNSUPPORTED_SH2A): New macros. (DRIVER_SELF_SPECS): Use new macros to filter out unsupported options taking the default configuration into account. * gcc.target/sh/pr21255-2-ml.c: Skip if -mb or -m5* is specified. Remove redundant runtime checks. * gcc.target/sh/20080410-1.c: Skip if -mb is specified. Allow for other than -m4. Fix typos in comments. From-SVN: r181340 --- gcc/ChangeLog | 9 +++++++++ gcc/config/sh/sh.h | 18 +++++++++++++++++- gcc/testsuite/ChangeLog | 7 +++++++ gcc/testsuite/gcc.target/sh/20080410-1.c | 5 +++-- gcc/testsuite/gcc.target/sh/pr21255-2-ml.c | 10 ++-------- 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2108c87aac3..e58ef3216b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-11-13 Oleg Endo + + PR target/50694 + * config/sh/sh.h (IS_LITTLE_ENDIAN_OPTION, UNSUPPORTED_SH2A): + New macros. + (DRIVER_SELF_SPECS): Use new macros to filter out + unsupported options taking the default configuration into + account. + 2011-11-13 Jonathan Wakely * doc/install.texi (Specific): Fix anchor for diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index cc26e05a764..1b98745866e 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -417,7 +417,23 @@ do { \ #define SH_DIV_STR_FOR_SIZE "call" #endif -#define DRIVER_SELF_SPECS "%{m2a:%{ml:%eSH2a does not support little-endian}}" +/* SH2A does not support little-endian. Catch such combinations + taking into account the default configuration. */ +#if TARGET_ENDIAN_DEFAULT == MASK_BIG_ENDIAN +#define IS_LITTLE_ENDIAN_OPTION "%{ml:" +#else +#define IS_LITTLE_ENDIAN_OPTION "%{!mb:" +#endif + +#if TARGET_CPU_DEFAULT & MASK_HARD_SH2A +#define UNSUPPORTED_SH2A IS_LITTLE_ENDIAN_OPTION \ +"%{m2a*|!m1:%{!m2*:%{!m3*:%{!m4*:{!m5*:%eSH2a does not support little-endian}}}}}}" +#else +#define UNSUPPORTED_SH2A IS_LITTLE_ENDIAN_OPTION \ +"%{m2a*:%eSH2a does not support little-endian}}" +#endif + +#define DRIVER_SELF_SPECS UNSUPPORTED_SH2A #define ASSEMBLER_DIALECT assembler_dialect diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4c4460310ef..7fa24e782bb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2011-11-13 Oleg Endo + + * gcc.target/sh/pr21255-2-ml.c: Skip if -mb or -m5* is + specified. Remove redundant runtime checks. + * gcc.target/sh/20080410-1.c: Skip if -mb is specified. + Allow for other than -m4. Fix typos in comments. + 2011-11-12 Jason Merrill PR c++/986 diff --git a/gcc/testsuite/gcc.target/sh/20080410-1.c b/gcc/testsuite/gcc.target/sh/20080410-1.c index 0ba7792c078..63e517e94d5 100644 --- a/gcc/testsuite/gcc.target/sh/20080410-1.c +++ b/gcc/testsuite/gcc.target/sh/20080410-1.c @@ -1,8 +1,9 @@ /* { dg-do compile { target "sh-*-*" } } */ -/* { dg-options "-O0 -m4 -ml" } */ +/* { dg-options "-O0" } */ +/* { dg-skip-if "" { "sh*-*-*" } "-mb" "" } */ /* { dg-final { scan-assembler-not "add\tr0,r0" } } */ -/* This test checks that chain reloads conflict. I they don't +/* This test checks chain reloads conflicts. If they don't conflict, the same hard register R0 is used for the both reloads but in this case the second reload needs an intermediate register (which is the reload register). As the result we have the diff --git a/gcc/testsuite/gcc.target/sh/pr21255-2-ml.c b/gcc/testsuite/gcc.target/sh/pr21255-2-ml.c index c63a573ea9d..570e7dd0b50 100644 --- a/gcc/testsuite/gcc.target/sh/pr21255-2-ml.c +++ b/gcc/testsuite/gcc.target/sh/pr21255-2-ml.c @@ -1,5 +1,6 @@ /* { dg-do compile { target "sh*-*-*" } } */ -/* { dg-options "-ml -O2 -fomit-frame-pointer" } */ +/* { dg-options "-O2 -fomit-frame-pointer" } */ +/* { dg-skip-if "" { "sh*-*-*" } { "-mb" && "-m5*"} { "" } } */ /* { dg-final { scan-assembler "mov @\\(4,r.\\),r.; mov @r.,r." } } */ double d; @@ -7,13 +8,6 @@ double f (void) { double r; - -/* If -mb from the target options is passed after -ml from dg-options, we - end up with th reverse endianness. */ -#if TARGET_SHMEDIA || defined (__BIG_ENDIAN__) - asm ("mov @(4,r1),r4; mov @r1,r3"); -#else asm ("mov %S1,%S0; mov %R1,%R0" : "=&r" (r) : "m" (d)); -#endif return r; }