[AArch64][PATCH 1/2] Make AES unspecs commutative
authorAndre Vieira <andre.simoesdiasvieira@arm.com>
Thu, 21 Jun 2018 09:01:21 +0000 (09:01 +0000)
committerAndre Vieira <avieira@gcc.gnu.org>
Thu, 21 Jun 2018 09:01:21 +0000 (09:01 +0000)
gcc
2018-06-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>

* config/aarch64/aarch64-simd.md (aarch64_crypto_aes<aes_op>v16qi):
Make opernads of the unspec commutative.

gcc/testsuite
2018-06-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>

* gcc/gcc.target/aarch64/aes_2.c: New test.

From-SVN: r261835

gcc/ChangeLog
gcc/config/aarch64/aarch64-simd.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/aes_2.c [new file with mode: 0644]

index d9fbc0c1c55aca7d1079e64af3bad660abcc80cf..1731f5a05d2adef4d93497f2651d3c213c45b81a 100644 (file)
@@ -1,3 +1,8 @@
+2018-06-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+       * config/aarch64/aarch64-simd.md (aarch64_crypto_aes<aes_op>v16qi):
+       Make opernads of the unspec commutative.
+
 2018-06-21  Richard Biener  <rguenther@suse.de>
 
        * tree-data-ref.c (dr_step_indicator): Handle NULL DR_STEP.
index aac5fa146ed8dde4507a0eb4ad6a07ce78d2f0cd..7e9ae086b10c9bdd339b521c9444dc04b0d5b137 100644 (file)
 
 (define_insn "aarch64_crypto_aes<aes_op>v16qi"
   [(set (match_operand:V16QI 0 "register_operand" "=w")
-        (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "0")
+       (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "%0")
                       (match_operand:V16QI 2 "register_operand" "w")]
          CRYPTO_AES))]
   "TARGET_SIMD && TARGET_AES"
index 2e333b41109cc66b76dfe88a043b4a81dcf1f2de..e58afe59ab32e68228c03cbb5603a15a04c16602 100644 (file)
@@ -1,3 +1,7 @@
+2018-06-21  Andre Vieira  <andre.simoesdiasvieira@arm.com>
+
+       * gcc/gcc.target/aarch64/aes_2.c: New test.
+
 2018-06-20  Than McIntosh  <thanm@google.com>
 
        PR libgcc/86213
diff --git a/gcc/testsuite/gcc.target/aarch64/aes_2.c b/gcc/testsuite/gcc.target/aarch64/aes_2.c
new file mode 100644 (file)
index 0000000..70f113f
--- /dev/null
@@ -0,0 +1,79 @@
+
+/* { dg-do compile } */
+/* { dg-options "-O3 -march=armv8-a+crypto" } */
+
+#include "arm_neon.h"
+
+uint8x16_t
+test0 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaeseq_u8 (a, b);
+  result = vaeseq_u8 (result, a);
+  return result;
+}
+
+uint8x16_t
+test1 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaeseq_u8 (a, b);
+  result = vaeseq_u8 (a, result);
+  return result;
+}
+
+uint8x16_t
+test2 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaeseq_u8 (b, a);
+  result = vaeseq_u8 (result, b);
+  return result;
+}
+
+uint8x16_t
+test3 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaeseq_u8 (b, a);
+  result = vaeseq_u8 (b, result);
+  return result;
+}
+
+uint8x16_t
+test4 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaesdq_u8 (a, b);
+  result = vaesdq_u8 (result, a);
+  return result;
+}
+
+uint8x16_t
+test5 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaesdq_u8 (a, b);
+  result = vaesdq_u8 (a, result);
+  return result;
+}
+
+uint8x16_t
+test6 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaesdq_u8 (b, a);
+  result = vaesdq_u8 (result, b);
+  return result;
+}
+
+uint8x16_t
+test7 (uint8x16_t a, uint8x16_t b)
+{
+  uint8x16_t result;
+  result = vaesdq_u8 (b, a);
+  result = vaesdq_u8 (b, result);
+  return result;
+}
+/* { dg-final { scan-assembler-not "mov" } } */
+