AArch64: use canonical ordering for complex mul, fma and fms
authorTamar Christina <tamar.christina@arm.com>
Wed, 2 Feb 2022 10:51:38 +0000 (10:51 +0000)
committerTamar Christina <tamar.christina@arm.com>
Wed, 2 Feb 2022 10:51:38 +0000 (10:51 +0000)
After the first patch in the series this updates the optabs to expect the
canonical sequence.

gcc/ChangeLog:

PR tree-optimization/102819
PR tree-optimization/103169
* config/aarch64/aarch64-simd.md (cml<fcmac1><conj_op><mode>4): Use
canonical order.
* config/aarch64/aarch64-sve.md (cml<fcmac1><conj_op><mode>4): Likewise.

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

index 71c429f..13255be 100644 (file)
 ;; remainder.  Because of this, expand early.
 (define_expand "cml<fcmac1><conj_op><mode>4"
   [(set (match_operand:VHSDF 0 "register_operand")
-       (plus:VHSDF (match_operand:VHSDF 1 "register_operand")
-                   (unspec:VHSDF [(match_operand:VHSDF 2 "register_operand")
-                                  (match_operand:VHSDF 3 "register_operand")]
-                                  FCMLA_OP)))]
+       (plus:VHSDF (unspec:VHSDF [(match_operand:VHSDF 1 "register_operand")
+                                  (match_operand:VHSDF 2 "register_operand")]
+                                  FCMLA_OP)
+                   (match_operand:VHSDF 3 "register_operand")))]
   "TARGET_COMPLEX && !BYTES_BIG_ENDIAN"
 {
   rtx tmp = gen_reg_rtx (<MODE>mode);
-  emit_insn (gen_aarch64_fcmla<rotsplit1><mode> (tmp, operands[1],
-                                                operands[3], operands[2]));
+  emit_insn (gen_aarch64_fcmla<rotsplit1><mode> (tmp, operands[3],
+                                                operands[2], operands[1]));
   emit_insn (gen_aarch64_fcmla<rotsplit2><mode> (operands[0], tmp,
-                                                operands[3], operands[2]));
+                                                operands[2], operands[1]));
   DONE;
 })
 
index bd22fe5..bd60e65 100644 (file)
   rtx tmp = gen_reg_rtx (<MODE>mode);
   emit_insn
     (gen_aarch64_pred_fcmla<sve_rot1><mode> (tmp, operands[4],
-                                            operands[3], operands[2],
-                                            operands[1], operands[5]));
+                                            operands[2], operands[1],
+                                            operands[3], operands[5]));
   emit_insn
     (gen_aarch64_pred_fcmla<sve_rot2><mode> (operands[0], operands[4],
-                                            operands[3], operands[2],
+                                            operands[2], operands[1],
                                             tmp, operands[5]));
   DONE;
 })