neon.md (neon_vget_lanev2di): Handle big-endian targets.
authorChristophe Lyon <christophe.lyon@linaro.org>
Tue, 4 Aug 2015 13:24:26 +0000 (13:24 +0000)
committerChristophe Lyon <clyon@gcc.gnu.org>
Tue, 4 Aug 2015 13:24:26 +0000 (15:24 +0200)
2015-08-04  Christophe Lyon  <christophe.lyon@linaro.org>

* config/arm/neon.md (neon_vget_lanev2di): Handle big-endian
targets.

From-SVN: r226574

gcc/ChangeLog
gcc/config/arm/neon.md

index 41ccf74..49751a7 100644 (file)
@@ -1,3 +1,8 @@
+2015-08-04  Christophe Lyon  <christophe.lyon@linaro.org>
+
+       * config/arm/neon.md (neon_vget_lanev2di): Handle big-endian
+       targets.
+
 2015-08-04  Nathan Sidwell  <nathan@codesourcery.com>
 
        * config/nvptx/nvptx.h (struct nvptx_pseudo_info): Delete.
index 4af74ce..b1bf26a 100644 (file)
    (match_operand:SI 2 "immediate_operand" "")]
   "TARGET_NEON"
 {
-  int lane = INTVAL (operands[2]);
+  int lane;
+
+if (BYTES_BIG_ENDIAN)
+    {
+      /* The intrinsics are defined in terms of a model where the
+        element ordering in memory is vldm order, whereas the generic
+        RTL is defined in terms of a model where the element ordering
+        in memory is array order.  Convert the lane number to conform
+        to this model.  */
+      unsigned int elt = INTVAL (operands[2]);
+      unsigned int reg_nelts = 2;
+      elt ^= reg_nelts - 1;
+      operands[2] = GEN_INT (elt);
+    }
+
+  lane = INTVAL (operands[2]);
   gcc_assert ((lane ==0) || (lane == 1));
   emit_move_insn (operands[0], lane == 0
                                ? gen_lowpart (DImode, operands[1])