Implement bswaphi2 with rev16 (AArch64)
authorIan Bolton <ian.bolton@arm.com>
Thu, 22 Nov 2012 15:50:30 +0000 (15:50 +0000)
committerIan Bolton <ibolton@gcc.gnu.org>
Thu, 22 Nov 2012 15:50:30 +0000 (15:50 +0000)
From-SVN: r193729

gcc/ChangeLog
gcc/config/aarch64/aarch64.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/builtin-bswap-1.c [new file with mode: 0644]
gcc/testsuite/gcc.target/aarch64/builtin-bswap-2.c [new file with mode: 0644]

index 63cb4f5cc2ba5cffe6ce87e2890ff001ef2652d3..d0ede900e09ed8a9a6f13245762fd6c61c483b64 100644 (file)
@@ -1,3 +1,7 @@
+2012-11-22  Ian Bolton  <ian.bolton@arm.com>
+
+       * config/aarch64/aarch64.md (bswaphi2): New pattern.
+
 2012-11-22  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR sanitizer/55379
index 5c96c8925da36e335796376e128da4af887d09b3..17f024fa40f46cee2ce63b40ea67a7269c1e482e 100644 (file)
    (set_attr "mode" "<MODE>")]
 )
 
+(define_insn "bswaphi2"
+  [(set (match_operand:HI 0 "register_operand" "=r")
+        (bswap:HI (match_operand:HI 1 "register_operand" "r")))]
+  ""
+  "rev16\\t%w0, %w1"
+  [(set_attr "v8type" "rev")
+   (set_attr "mode" "HI")]
+)
+
 ;; -------------------------------------------------------------------
 ;; Floating-point intrinsics
 ;; -------------------------------------------------------------------
index 382affd8d12b960633f6082dceec9dfcd6180f31..788266ffcee2102aa369f328e8c9c06fc5d02e6f 100644 (file)
@@ -1,3 +1,8 @@
+2012-11-22  Ian Bolton  <ian.bolton@arm.com>
+
+       * gcc.target/aarch64/builtin-bswap-1.c: New test.
+       * gcc.target/aarch64/builtin-bswap-2.c: New test.
+
 2012-11-22  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/55432
diff --git a/gcc/testsuite/gcc.target/aarch64/builtin-bswap-1.c b/gcc/testsuite/gcc.target/aarch64/builtin-bswap-1.c
new file mode 100644 (file)
index 0000000..a6706e6
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* { dg-final { scan-assembler-times "rev16\\t" 2 } }  */
+
+/* rev16 */
+short
+swaps16 (short x)
+{
+  return __builtin_bswap16 (x);
+}
+
+/* rev16 */
+unsigned short
+swapu16 (unsigned short x)
+{
+  return __builtin_bswap16 (x);
+}
diff --git a/gcc/testsuite/gcc.target/aarch64/builtin-bswap-2.c b/gcc/testsuite/gcc.target/aarch64/builtin-bswap-2.c
new file mode 100644 (file)
index 0000000..6018b48
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+/* { dg-final { scan-assembler-times "rev16\\t" 2 } }  */
+
+/* rev16 */
+unsigned short
+swapu16_1 (unsigned short x)
+{
+  return (x << 8) | (x >> 8);
+}
+
+/* rev16 */
+unsigned short
+swapu16_2 (unsigned short x)
+{
+  return (x >> 8) | (x << 8);
+}