]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
[AArch64] Support for CLZ
authorVidya Praveen <vidyapraveen@arm.com>
Thu, 23 May 2013 13:36:41 +0000 (14:36 +0100)
committerMarcus Shawcroft <mshawcroft@gcc.gnu.org>
Thu, 23 May 2013 13:36:41 +0000 (13:36 +0000)
2013-05-23  Vidya Praveen <vidyapraveen@arm.com>

        * config/aarch64/aarch64-simd.md (clzv4si2): Support for CLZ
          instruction (AdvSIMD).
        * config/aarch64/aarch64-builtins.c
          (aarch64_builtin_vectorized_function): Handler for BUILT_IN_CLZ.
        * config/aarch64/aarch-simd-builtins.def: Entry for CLZ.

From-SVN: r199254

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

index a97a295a263b1672a9e8ddfcfe77e78a7517ec69..bee52a405a5985f1b3c713c2fddab41c8660539d 100644 (file)
@@ -1,3 +1,11 @@
+2013-05-23  Vidya Praveen <vidyapraveen@arm.com>
+
+       * config/aarch64/aarch64-simd.md (clzv4si2): Support for CLZ
+       instruction (AdvSIMD).
+       * config/aarch64/aarch64-builtins.c
+       (aarch64_builtin_vectorized_function): Handler for BUILT_IN_CLZ.
+       * config/aarch64/aarch-simd-builtins.def: Entry for CLZ.
+
 2013-05-22  Martin Jambor  <mjambor@suse.cz>
 
        PR middle-end/57347
index 4fdfe247a215708568494b29ae612b7ff2641590..2a0e5fdc39134cc562c8178e7161a25cc5754dc7 100644 (file)
@@ -1244,6 +1244,16 @@ aarch64_builtin_vectorized_function (tree fndecl, tree type_out, tree type_in)
        case BUILT_IN_SQRTF:
          return AARCH64_FIND_FRINT_VARIANT (sqrt);
 #undef AARCH64_CHECK_BUILTIN_MODE
+#define AARCH64_CHECK_BUILTIN_MODE(C, N) \
+  (out_mode == SImode && out_n == C \
+   && in_mode == N##Imode && in_n == C)
+        case BUILT_IN_CLZ:
+          {
+            if (AARCH64_CHECK_BUILTIN_MODE (4, S))
+              return aarch64_builtin_decls[AARCH64_SIMD_BUILTIN_clzv4si];
+            return NULL_TREE;
+          }
+#undef AARCH64_CHECK_BUILTIN_MODE
 #define AARCH64_CHECK_BUILTIN_MODE(C, N) \
   (out_mode == N##Imode && out_n == C \
    && in_mode == N##Fmode && in_n == C)
index e4201732bcd0a15657ea77101c9525e9ae544783..5134f9674bda99e64cf350f7c8d4fd7abbd7ff7a 100644 (file)
@@ -49,6 +49,7 @@
   BUILTIN_VDQF (UNOP, sqrt, 2)
   BUILTIN_VD_BHSI (BINOP, addp, 0)
   VAR1 (UNOP, addp, 0, di)
+  VAR1 (UNOP, clz, 2, v4si)
 
   BUILTIN_VD_RE (REINTERP, reinterpretdi, 0)
   BUILTIN_VDC (REINTERP, reinterpretv8qi, 0)
index f91cf814accdd681f09a7c06ed4e2242425f979c..04fbdbd58371d707743143e753a967c2ff41517f 100644 (file)
   DONE;
 })
 
+(define_insn "clz<mode>2"
+ [(set (match_operand:VDQ_BHSI 0 "register_operand" "=w")
+       (clz:VDQ_BHSI (match_operand:VDQ_BHSI 1 "register_operand" "w")))]
+ "TARGET_SIMD"
+ "clz\\t%0.<Vtype>, %1.<Vtype>"
+ [(set_attr "simd_type" "simd_cls")
+  (set_attr "simd_mode" "<MODE>")]
+)
+
 ;; 'across lanes' max and min ops.
 
 (define_insn "reduc_<maxmin_uns>_<mode>"
index b8e99a450112a4a38e726862e10d5d72c5cc4be0..50bb19bbd3e7fb0bc8fd16129fb43c72e57170f7 100644 (file)
@@ -1,3 +1,7 @@
+2013-05-23  Vidya Praveen <vidyapraveen@arm.com>
+
+       * gcc.target/aarch64/vect-clz.c: New file.
+
 2013-05-22  Martin Jambor  <mjambor@suse.cz>
 
        PR middle-end/57347
diff --git a/gcc/testsuite/gcc.target/aarch64/vect-clz.c b/gcc/testsuite/gcc.target/aarch64/vect-clz.c
new file mode 100644 (file)
index 0000000..8f1fe70
--- /dev/null
@@ -0,0 +1,35 @@
+/* { dg-do run } */
+/* { dg-options "-O3 -save-temps -fno-inline" } */
+
+extern void abort ();
+
+void
+count_lz_v4si (unsigned *__restrict a, int *__restrict b)
+{
+  int i;
+
+  for (i = 0; i < 4; i++)
+    b[i] = __builtin_clz (a[i]);
+}
+
+/* { dg-final { scan-assembler "clz\tv\[0-9\]+\.4s" } } */
+
+int
+main ()
+{
+  unsigned int x[4] = { 0x0, 0xFFFF, 0x1FFFF, 0xFFFFFFFF };
+  int r[4] = { 32, 16, 15, 0 };
+  int d[4], i;
+
+  count_lz_v4si (x, d);
+
+  for (i = 0; i < 4; i++)
+    {
+      if (d[i] != r[i])
+       abort ();
+    }
+
+  return 0;
+}
+
+/* { dg-final { cleanup-saved-temps } } */