re PR target/53568 (SH Target: Add support for bswap built-ins)
authorOleg Endo <olegendo@gcc.gnu.org>
Mon, 2 Jul 2012 22:59:59 +0000 (22:59 +0000)
committerOleg Endo <olegendo@gcc.gnu.org>
Mon, 2 Jul 2012 22:59:59 +0000 (22:59 +0000)
PR target/53568
* gcc.target/sh/pr53568-1.c: New.

From-SVN: r189181

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/sh/pr53568-1.c [new file with mode: 0644]

index 916fcfb..dead281 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-03  Oleg Endo  <olegendo@gcc.gnu.org>
+
+       PR target/53568
+       * gcc.target/sh/pr53568-1.c: New.
+
 2012-07-02  Oleg Endo  <olegendo@gcc.gnu.org>
 
        PR target/51244
diff --git a/gcc/testsuite/gcc.target/sh/pr53568-1.c b/gcc/testsuite/gcc.target/sh/pr53568-1.c
new file mode 100644 (file)
index 0000000..22f836e
--- /dev/null
@@ -0,0 +1,82 @@
+/* Check that the bswap32 pattern is generated as swap.b and swap.w
+   instructions.  */
+/* { dg-do compile { target "sh*-*-*" } } */
+/* { dg-options "-O2" } */
+/* { dg-skip-if "" { "sh*-*-*" } { "-m5*"} { "" } }  */
+/* { dg-final { scan-assembler-times "swap.w" 7 } } */
+/* { dg-final { scan-assembler-times "swap.b" 16 } } */
+/* { dg-final { scan-assembler-times "extu.w" 2 } } */
+/* { dg-final { scan-assembler-times "mov" 1 } } */
+/* { dg-final { scan-assembler-not "{shll8|shlr8|shld|shad}" } } */
+
+int
+test_func_00 (int a)
+{
+  /* 1x swap.w
+     2x swap.b  */
+  return __builtin_bswap32 (a);
+}
+
+unsigned int
+test_func_01 (unsigned int a)
+{
+  /* 1x swap.w
+     2x swap.b  */
+  return __builtin_bswap32 (a);
+}
+
+int
+test_func_02 (int a)
+{
+  /* 1x swap.w
+     2x swap.b  */
+  return (((a >> 0) & 0xFF) << 24)
+        | (((a >> 8) & 0xFF) << 16)
+        | (((a >> 16) & 0xFF) << 8)
+        | (((a >> 24) & 0xFF) << 0);
+}
+
+unsigned int
+test_func_03 (unsigned int a)
+{
+  /* 1x swap.w
+     2x swap.b  */
+  return (((a >> 0) & 0xFF) << 24)
+        | (((a >> 8) & 0xFF) << 16)
+        | (((a >> 16) & 0xFF) << 8)
+        | (((a >> 24) & 0xFF) << 0);
+}
+
+int
+test_func_04 (int a)
+{
+  /* 1x swap.b
+     1x extu.w  */
+  return __builtin_bswap32 (a) >> 16;
+}
+
+unsigned short
+test_func_05 (unsigned short a)
+{
+  /* 1x swap.b
+     1x extu.w  */
+  return __builtin_bswap32 (a) >> 16;
+}
+
+long long
+test_func_06 (long long a)
+{
+  /* 2x swap.w
+     4x swap.b  */
+  return __builtin_bswap64 (a);
+}
+
+long long
+test_func_07 (long long a)
+{
+  /* 1x swap.w
+     2x swap.b
+     1x mov #0,Rn  */
+  return __builtin_bswap64 (a) >> 32;
+}
+