diff mbox

[SH] PR 50694 - SH2A little endian does not actually work

Message ID 1321202899.1806.62.camel@yam-132-YW-E178-FTW
State New
Headers show

Commit Message

Oleg Endo Nov. 13, 2011, 4:48 p.m. UTC
Hello,

the attached patch addresses PR 50694.
Tested against trunk rev 181301 with:

make -k check RUNTESTFLAGS="--target_board=sh-sim
\{-m2/-ml,-m2/-mb,-m2a-single/-mb,-m4-single/-ml,-m4-single/-mb,-m4a-single/-ml,-m4a-single/-mb}"

For -m2a* it introduces two new failures in:

gcc.target/sh/pr21255-2-ml.c
gcc.target/sh/20080410-1.c

...due to test case parameter handling.  The test cases were made for
little endian only but have not been skipped when ran with big endian
parameters.  The patch also fixes those two test cases.

Cheers,
Oleg

ChangeLog:

2011-11-13  Oleg Endo  <oleg.endo@t-online.de>

	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.

testsuite/ChangeLog:

2011-11-13  Oleg Endo  <oleg.endo@t-online.de>

	* 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.

Comments

Kaz Kojima Nov. 13, 2011, 11:04 p.m. UTC | #1
Oleg Endo <oleg.endo@t-online.de> wrote:
> the attached patch addresses PR 50694.
> Tested against trunk rev 181301 with:
> 
> make -k check RUNTESTFLAGS="--target_board=sh-sim
> \{-m2/-ml,-m2/-mb,-m2a-single/-mb,-m4-single/-ml,-m4-single/-mb,-m4a-single/-ml,-m4a-single/-mb}"
> 
> For -m2a* it introduces two new failures in:
> 
> gcc.target/sh/pr21255-2-ml.c
> gcc.target/sh/20080410-1.c
> 
> ...due to test case parameter handling.  The test cases were made for
> little endian only but have not been skipped when ran with big endian
> parameters.  The patch also fixes those two test cases.

The patch is Ok.  I've committed it as revision 181340.
Thanks!

Regards,
	kaz
diff mbox

Patch

Index: gcc/testsuite/gcc.target/sh/pr21255-2-ml.c
===================================================================
--- gcc/testsuite/gcc.target/sh/pr21255-2-ml.c	(revision 181301)
+++ gcc/testsuite/gcc.target/sh/pr21255-2-ml.c	(working copy)
@@ -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 @@ 
 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;
 }
Index: gcc/testsuite/gcc.target/sh/20080410-1.c
===================================================================
--- gcc/testsuite/gcc.target/sh/20080410-1.c	(revision 181301)
+++ gcc/testsuite/gcc.target/sh/20080410-1.c	(working copy)
@@ -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
Index: gcc/config/sh/sh.h
===================================================================
--- gcc/config/sh/sh.h	(revision 181301)
+++ gcc/config/sh/sh.h	(working copy)
@@ -417,8 +417,24 @@ 
 #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
 
 extern int assembler_dialect;