;; - FSUB
;; -------------------------------------------------------------------------
+;; Split a predicated instruction whose predicate is unused into an
+;; unpredicated instruction.
+(define_split
+ [(set (match_operand:SVE_FULL_F 0 "register_operand")
+ (unspec:SVE_FULL_F
+ [(match_operand:<VPRED> 1 "register_operand")
+ (match_operand:SI 4 "aarch64_sve_gp_strictness")
+ (match_operand:SVE_FULL_F 2 "register_operand")
+ (match_operand:SVE_FULL_F 3 "register_operand")]
+ <SVE_COND_FP>))]
+ "TARGET_SVE
+ && reload_completed
+ && INTVAL (operands[4]) == SVE_RELAXED_GP"
+ [(set (match_dup 0)
+ (SVE_UNPRED_FP_BINARY:SVE_FULL_F (match_dup 2) (match_dup 3)))]
+)
+
;; Unpredicated floating-point binary operations (post-RA only).
-;; These are generated by splitting a predicated instruction whose
-;; predicate is unused.
+;; These are generated by the split above.
(define_insn "*post_ra_<sve_fp_op><mode>3"
[(set (match_operand:SVE_FULL_F 0 "register_operand" "=w")
(SVE_UNPRED_FP_BINARY:SVE_FULL_F
;; -------------------------------------------------------------------------
;; Predicated floating-point addition.
-(define_insn_and_split "@aarch64_pred_<optab><mode>"
+(define_insn "@aarch64_pred_<optab><mode>"
[(set (match_operand:SVE_FULL_F 0 "register_operand")
(unspec:SVE_FULL_F
[(match_operand:<VPRED> 1 "register_operand")
[ ?&w , Upl , w , vsN , i ; yes ] movprfx\t%0, %2\;fsub\t%0.<Vetype>, %1/m, %0.<Vetype>, #%N3
[ ?&w , Upl , w , w , Ui1 ; yes ] movprfx\t%0, %2\;fadd\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
}
- ; Split the unpredicated form after reload, so that we don't have
- ; the unnecessary PTRUE.
- "&& reload_completed
- && register_operand (operands[3], <MODE>mode)
- && INTVAL (operands[4]) == SVE_RELAXED_GP"
- [(set (match_dup 0) (plus:SVE_FULL_F (match_dup 2) (match_dup 3)))]
- ""
)
;; Predicated floating-point addition of a constant, merging with the
;; -------------------------------------------------------------------------
;; Predicated floating-point subtraction.
-(define_insn_and_split "@aarch64_pred_<optab><mode>"
+(define_insn "@aarch64_pred_<optab><mode>"
[(set (match_operand:SVE_FULL_F 0 "register_operand")
(unspec:SVE_FULL_F
[(match_operand:<VPRED> 1 "register_operand")
[ ?&w , Upl , vsA , w , i ; yes ] movprfx\t%0, %3\;fsubr\t%0.<Vetype>, %1/m, %0.<Vetype>, #%2
[ ?&w , Upl , w , w , Ui1 ; yes ] movprfx\t%0, %2\;fsub\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
}
- ; Split the unpredicated form after reload, so that we don't have
- ; the unnecessary PTRUE.
- "&& reload_completed
- && register_operand (operands[2], <MODE>mode)
- && INTVAL (operands[4]) == SVE_RELAXED_GP"
- [(set (match_dup 0) (minus:SVE_FULL_F (match_dup 2) (match_dup 3)))]
- ""
)
;; Predicated floating-point subtraction from a constant, merging with the
;; -------------------------------------------------------------------------
;; Predicated floating-point multiplication.
-(define_insn_and_split "@aarch64_pred_<optab><mode>"
+(define_insn "@aarch64_pred_<optab><mode>"
[(set (match_operand:SVE_FULL_F 0 "register_operand")
(unspec:SVE_FULL_F
[(match_operand:<VPRED> 1 "register_operand")
[ ?&w , Upl , w , vsM , i ; yes ] movprfx\t%0, %2\;fmul\t%0.<Vetype>, %1/m, %0.<Vetype>, #%3
[ ?&w , Upl , w , w , Ui1 ; yes ] movprfx\t%0, %2\;fmul\t%0.<Vetype>, %1/m, %0.<Vetype>, %3.<Vetype>
}
- ; Split the unpredicated form after reload, so that we don't have
- ; the unnecessary PTRUE.
- "&& reload_completed
- && register_operand (operands[3], <MODE>mode)
- && INTVAL (operands[4]) == SVE_RELAXED_GP"
- [(set (match_dup 0) (mult:SVE_FULL_F (match_dup 2) (match_dup 3)))]
- ""
)
;; Merging forms are handled through SVE_COND_FP_BINARY and