aarch64-simd.md (vec_pack_trunc_<mode>, [...]): Swap source ops for big-endian.
authorTejas Belagod <tejas.belagod@arm.com>
Fri, 22 Nov 2013 15:31:57 +0000 (15:31 +0000)
committerTejas Belagod <belagod@gcc.gnu.org>
Fri, 22 Nov 2013 15:31:57 +0000 (15:31 +0000)
2013-11-22  Tejas Belagod  <tejas.belagod@arm.com>

gcc/
* config/aarch64/aarch64-simd.md (vec_pack_trunc_<mode>,
vec_pack_trunc_v2df, vec_pack_trunc_df): Swap source ops for big-endian.

From-SVN: r205268

gcc/ChangeLog
gcc/config/aarch64/aarch64-simd.md

index 00ccbbcaf067a35caa690b5eca1d7f047c7a2d5d..958f61b0b57bb7c3f37d5ed00de791ac5a12b45a 100644 (file)
@@ -1,3 +1,8 @@
+2013-11-22  Tejas Belagod  <tejas.belagod@arm.com>
+
+       * config/aarch64/aarch64-simd.md (vec_pack_trunc_<mode>,
+       vec_pack_trunc_v2df, vec_pack_trunc_df): Swap source ops for big-endian.
+
 2013-11-22  Tejas Belagod  <tejas.belagod@arm.com>
 
        * config/aarch64/aarch64-simd.md (aarch64_simd_vec_set<mode>): Adjust
index 2774ec251823ec1691c8485b2e6d933e3b9cd8de..bfd524c7c65852b06113ca10062fc041d0315406 100644 (file)
  "TARGET_SIMD"
 {
   rtx tempreg = gen_reg_rtx (<VDBL>mode);
+  int lo = BYTES_BIG_ENDIAN ? 2 : 1;
+  int hi = BYTES_BIG_ENDIAN ? 1 : 2;
 
-  emit_insn (gen_move_lo_quad_<Vdbl> (tempreg, operands[1]));
-  emit_insn (gen_move_hi_quad_<Vdbl> (tempreg, operands[2]));
+  emit_insn (gen_move_lo_quad_<Vdbl> (tempreg, operands[lo]));
+  emit_insn (gen_move_hi_quad_<Vdbl> (tempreg, operands[hi]));
   emit_insn (gen_aarch64_simd_vec_pack_trunc_<Vdbl> (operands[0], tempreg));
   DONE;
 })
         (truncate:<VNARROWQ> (match_operand:VQN 1 "register_operand" "w"))
         (truncate:<VNARROWQ> (match_operand:VQN 2 "register_operand" "w"))))]
  "TARGET_SIMD"
- "xtn\\t%0.<Vntype>, %1.<Vtype>\;xtn2\\t%0.<V2ntype>, %2.<Vtype>"
+ {
+   if (BYTES_BIG_ENDIAN)
+     return "xtn\\t%0.<Vntype>, %2.<Vtype>\;xtn2\\t%0.<V2ntype>, %1.<Vtype>";
+   else
+     return "xtn\\t%0.<Vntype>, %1.<Vtype>\;xtn2\\t%0.<V2ntype>, %2.<Vtype>";
+ }
   [(set_attr "type" "multiple")
    (set_attr "length" "8")]
 )
   "TARGET_SIMD"
   {
     rtx tmp = gen_reg_rtx (V2SFmode);
-    emit_insn (gen_aarch64_float_truncate_lo_v2sf (tmp, operands[1]));
+    int lo = BYTES_BIG_ENDIAN ? 2 : 1;
+    int hi = BYTES_BIG_ENDIAN ? 1 : 2;
+
+    emit_insn (gen_aarch64_float_truncate_lo_v2sf (tmp, operands[lo]));
     emit_insn (gen_aarch64_float_truncate_hi_v4sf (operands[0],
-                                                  tmp, operands[2]));
+                                                  tmp, operands[hi]));
     DONE;
   }
 )
   "TARGET_SIMD"
   {
     rtx tmp = gen_reg_rtx (V2SFmode);
-    emit_insn (gen_move_lo_quad_v2df (tmp, operands[1]));
-    emit_insn (gen_move_hi_quad_v2df (tmp, operands[2]));
+    int lo = BYTES_BIG_ENDIAN ? 2 : 1;
+    int hi = BYTES_BIG_ENDIAN ? 1 : 2;
+
+    emit_insn (gen_move_lo_quad_v2df (tmp, operands[lo]));
+    emit_insn (gen_move_hi_quad_v2df (tmp, operands[hi]));
     emit_insn (gen_aarch64_float_truncate_lo_v2sf (operands[0], tmp));
     DONE;
   }