[ARM] PR target/71270 fix neon_valid_immediate for big-endian
authorKyrylo Tkachov <kyrylo.tkachov@arm.com>
Fri, 20 Jan 2017 14:36:57 +0000 (14:36 +0000)
committerKyrylo Tkachov <ktkachov@gcc.gnu.org>
Fri, 20 Jan 2017 14:36:57 +0000 (14:36 +0000)
PR target/71270
* config/arm/arm.c (neon_valid_immediate): Reject vector constants
in big-endian mode when they are not a single duplicated value.

From-SVN: r244716

gcc/ChangeLog
gcc/config/arm/arm.c

index 6000e25c00a67bf94293cd1375f438d3cfe46297..760869e04c57c33f720839060f25c6a0134a497c 100644 (file)
@@ -1,3 +1,9 @@
+2017-01-20  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
+
+       PR target/71270
+       * config/arm/arm.c (neon_valid_immediate): Reject vector constants
+       in big-endian mode when they are not a single duplicated value.
+
 2017-01-20  Richard Biener  <rguenther@suse.de>
 
        * BASE-VER: Bump to 7.0.1.
index 96777f00137ea1047011719202c7eb4bb28cda2d..934f5d141f720d1c6c0a86c12eed1c62e8cbb983 100644 (file)
@@ -11667,6 +11667,12 @@ neon_valid_immediate (rtx op, machine_mode mode, int inverse,
        return 18;
     }
 
+  /* The tricks done in the code below apply for little-endian vector layout.
+     For big-endian vectors only allow vectors of the form { a, a, a..., a }.
+     FIXME: Implement logic for big-endian vectors.  */
+  if (BYTES_BIG_ENDIAN && vector && !const_vec_duplicate_p (op))
+    return -1;
+
   /* Splat vector constant out into a byte vector.  */
   for (i = 0; i < n_elts; i++)
     {