(automata_option "w")
(include "itanium2.md")
+\f
+;; Mode iterators
+
+; Used for truncations from XFmode.
+(define_mode_iterator MODE_SDF [SF DF])
+(define_mode_attr suffix [
+ (SF ".s")
+ (DF ".d")
+ (XF "")
+ ])
\f
;; ::::::::::::::::::::
;; ::
"fmax %0 = %F1, %F2"
[(set_attr "itanium_class" "fmisc")])
-(define_insn "*maddsf4"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (plus:SF (mult:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:SF 3 "fr_reg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubsf4"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (minus:SF (mult:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:SF 3 "fr_reg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fms.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
(define_insn "*nmulsf3"
[(set (match_operand:SF 0 "fr_register_operand" "=f")
(neg:SF (mult:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
"fnmpy.s %0 = %F1, %F2"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*nmaddsf4"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (minus:SF (match_operand:SF 3 "fr_reg_or_fp01_operand" "fG")
- (mult:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:SF 2 "fr_reg_or_fp01_operand" "fG"))))]
- "TARGET_FUSED_MADD"
- "fnma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-;; Official C99 versions of the fmaf family of operations.
(define_insn "fmasf4"
[(set (match_operand:SF 0 "fr_register_operand" "=f")
(fma:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
"fma.s %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*fmssf4"
+(define_insn "fmssf4"
[(set (match_operand:SF 0 "fr_register_operand" "=f")
(fma:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")
(match_operand:SF 2 "fr_reg_or_fp01_operand" "fG")
"fms.s %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-;; This insn is officially "-(a * b) + c" which is "(-a * b) + c".
-(define_insn "*nfmasf4"
+(define_insn "fnmasf4"
[(set (match_operand:SF 0 "fr_register_operand" "=f")
(fma:SF (neg:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG"))
(match_operand:SF 2 "fr_reg_or_fp01_operand" "fG")
"fmax %0 = %F1, %F2"
[(set_attr "itanium_class" "fmisc")])
-(define_insn "*madddf4"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (plus:DF (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fma.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*madddf4_trunc"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (plus:DF (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubdf4"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (minus:DF (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fms.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubdf4_trunc"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (minus:DF (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG"))
- (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fms.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
(define_insn "*nmuldf3"
[(set (match_operand:DF 0 "fr_register_operand" "=f")
(neg:DF (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
"fnmpy.s %0 = %F1, %F2"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*nmadddf4"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (minus:DF (match_operand:DF 3 "fr_reg_or_fp01_operand" "fG")
- (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG"))))]
- "TARGET_FUSED_MADD"
- "fnma.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*nmadddf4_truncsf"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (minus:DF (match_operand:DF 3 "fr_reg_or_fp01_operand" "fG")
- (mult:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
- (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")))))]
- "TARGET_FUSED_MADD"
- "fnma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-;; Official C99 versions of the fma family of operations.
(define_insn "fmadf4"
[(set (match_operand:DF 0 "fr_register_operand" "=f")
(fma:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
"fma.d %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*fmsdf4"
+(define_insn "*fmadf_trunc_sf"
+ [(set (match_operand:SF 0 "fr_register_operand" "=f")
+ (float_truncate:SF
+ (fma:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
+ ""
+ "fma.s %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
+
+(define_insn "fmsdf4"
[(set (match_operand:DF 0 "fr_register_operand" "=f")
(fma:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
(match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")
"fms.d %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-;; See comment for nfmasf4.
-(define_insn "*nfmadf4"
+(define_insn "*fmsdf_trunc_sf"
+ [(set (match_operand:SF 0 "fr_register_operand" "=f")
+ (float_truncate:SF
+ (fma:DF
+ (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")
+ (neg:DF
+ (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ")))))]
+ ""
+ "fms.s %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
+
+(define_insn "fnmadf4"
[(set (match_operand:DF 0 "fr_register_operand" "=f")
(fma:DF (neg:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG"))
(match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")
""
"fnma.d %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
+
+(define_insn "*fnmadf_trunc_sf"
+ [(set (match_operand:SF 0 "fr_register_operand" "=f")
+ (float_truncate:SF
+ (fma:DF
+ (neg:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG"))
+ (match_operand:DF 2 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:DF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
+ ""
+ "fnma.s %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
\f
;; ::::::::::::::::::::
;; ::
"fmax %0 = %F1, %F2"
[(set_attr "itanium_class" "fmisc")])
-(define_insn "*maddxf4"
- [(set (match_operand:XF 0 "fr_register_operand" "=f")
- (plus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fma %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*maddxf4_truncsf"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (plus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*maddxf4_truncdf"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (float_truncate:DF
- (plus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fma.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubxf4"
- [(set (match_operand:XF 0 "fr_register_operand" "=f")
- (minus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ")))]
- "TARGET_FUSED_MADD"
- "fms %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubxf4_truncsf"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (minus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fms.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*msubxf4_truncdf"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (float_truncate:DF
- (minus:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG"))
- (match_operand:XF 3 "xfreg_or_signed_fp01_operand" "fZ"))))]
- "TARGET_FUSED_MADD"
- "fms.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
(define_insn "*nmulxf3"
[(set (match_operand:XF 0 "fr_register_operand" "=f")
(neg:XF (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
"fnmpy.d %0 = %F1, %F2"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*nmaddxf4"
- [(set (match_operand:XF 0 "fr_register_operand" "=f")
- (minus:XF (match_operand:XF 3 "xfreg_or_fp01_operand" "fG")
- (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG")
- )))]
- "TARGET_FUSED_MADD"
- "fnma %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*nmaddxf4_truncsf"
- [(set (match_operand:SF 0 "fr_register_operand" "=f")
- (float_truncate:SF
- (minus:XF (match_operand:XF 3 "xfreg_or_fp01_operand" "fG")
- (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG")
- ))))]
- "TARGET_FUSED_MADD"
- "fnma.s %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-(define_insn "*nmaddxf4_truncdf"
- [(set (match_operand:DF 0 "fr_register_operand" "=f")
- (float_truncate:DF
- (minus:XF (match_operand:XF 3 "xfreg_or_fp01_operand" "fG")
- (mult:XF (match_operand:XF 1 "xfreg_or_fp01_operand" "fG")
- (match_operand:XF 2 "xfreg_or_fp01_operand" "fG")
- ))))]
- "TARGET_FUSED_MADD"
- "fnma.d %0 = %F1, %F2, %F3"
- [(set_attr "itanium_class" "fmac")])
-
-;; Official C99 versions of the fmal family of operations.
(define_insn "fmaxf4"
[(set (match_operand:XF 0 "fr_register_operand" "=f")
(fma:XF (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG")
"fma %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*fmsxf4"
+(define_insn "*fmaxf_trunc_<mode>"
+ [(set (match_operand:MODE_SDF 0 "fr_register_operand" "=f")
+ (float_truncate:MODE_SDF
+ (fma:XF
+ (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:XF 2 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:XF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
+ ""
+ "fma<suffix> %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
+
+(define_insn "fmsxf4"
[(set (match_operand:XF 0 "fr_register_operand" "=f")
(fma:XF (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG")
(match_operand:XF 2 "fr_reg_or_fp01_operand" "fG")
"fms %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
-;; See comment for nfmasf4.
-(define_insn "*nfmaxf4"
+(define_insn "*fmsxf_trunc_<mode>"
+ [(set (match_operand:MODE_SDF 0 "fr_register_operand" "=f")
+ (float_truncate:MODE_SDF
+ (fma:XF
+ (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:XF 2 "fr_reg_or_fp01_operand" "fG")
+ (neg:XF
+ (match_operand:XF 3 "fr_reg_or_signed_fp01_operand" "fZ")))))]
+ ""
+ "fms<suffix> %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
+
+(define_insn "fnmaxf4"
[(set (match_operand:XF 0 "fr_register_operand" "=f")
(fma:XF (neg:XF (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG"))
(match_operand:XF 2 "fr_reg_or_fp01_operand" "fG")
""
"fnma %0 = %F1, %F2, %F3"
[(set_attr "itanium_class" "fmac")])
+
+(define_insn "*fnmaxf_trunc_<mode>"
+ [(set (match_operand:MODE_SDF 0 "fr_register_operand" "=f")
+ (float_truncate:MODE_SDF
+ (fma:XF
+ (neg:XF (match_operand:XF 1 "fr_reg_or_fp01_operand" "fG"))
+ (match_operand:XF 2 "fr_reg_or_fp01_operand" "fG")
+ (match_operand:XF 3 "fr_reg_or_signed_fp01_operand" "fZ"))))]
+ ""
+ "fnma<suffix> %0 = %F1, %F2, %F3"
+ [(set_attr "itanium_class" "fmac")])
\f
;; ::::::::::::::::::::
;; ::
"fpnegabs %0 = %1"
[(set_attr "itanium_class" "fmisc")])
-;; In order to convince combine to merge plus and mult to a useful fpma,
-;; we need a couple of extra patterns.
(define_expand "addv2sf3"
- [(parallel
- [(set (match_operand:V2SF 0 "fr_register_operand" "")
- (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "")
- (match_operand:V2SF 2 "fr_register_operand" "")))
- (use (match_dup 3))])]
+ [(set (match_operand:V2SF 0 "fr_register_operand" "")
+ (fma:V2SF (match_operand:V2SF 1 "fr_register_operand" "")
+ (match_dup 3)
+ (match_operand:V2SF 2 "fr_register_operand" "")))]
""
{
rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode));
operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v));
- if (!TARGET_FUSED_MADD)
- {
- emit_insn (gen_fpma (operands[0], operands[1], operands[3], operands[2]));
- DONE;
- }
})
-;; The split condition here could be combine_completed, if we had such.
-(define_insn_and_split "*addv2sf3_1"
- [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (plus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f")))
- (use (match_operand:V2SF 3 "fr_register_operand" "f"))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 0)
- (plus:V2SF
- (mult:V2SF (match_dup 1) (match_dup 3))
- (match_dup 2)))]
- "")
-
-(define_insn_and_split "*addv2sf3_2"
- [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (plus:V2SF
- (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f"))
- (match_operand:V2SF 3 "fr_register_operand" "f")))
- (use (match_operand:V2SF 4 "" "X"))]
- ""
- "#"
- ""
- [(set (match_dup 0)
- (plus:V2SF
- (mult:V2SF (match_dup 1) (match_dup 2))
- (match_dup 3)))]
- "")
-
-;; In order to convince combine to merge minus and mult to a useful fpms,
-;; we need a couple of extra patterns.
(define_expand "subv2sf3"
- [(parallel
- [(set (match_operand:V2SF 0 "fr_register_operand" "")
- (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "")
- (match_operand:V2SF 2 "fr_register_operand" "")))
- (use (match_dup 3))])]
+ [(set (match_operand:V2SF 0 "fr_register_operand" "")
+ (fma:V2SF
+ (match_operand:V2SF 1 "fr_register_operand" "")
+ (match_dup 3)
+ (neg:V2SF (match_operand:V2SF 2 "fr_register_operand" ""))))]
""
{
rtvec v = gen_rtvec (2, CONST1_RTX (SFmode), CONST1_RTX (SFmode));
operands[3] = force_reg (V2SFmode, gen_rtx_CONST_VECTOR (V2SFmode, v));
- if (!TARGET_FUSED_MADD)
- {
- emit_insn (gen_fpms (operands[0], operands[1], operands[3], operands[2]));
- DONE;
- }
})
-;; The split condition here could be combine_completed, if we had such.
-(define_insn_and_split "*subv2sf3_1"
- [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (minus:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f")))
- (use (match_operand:V2SF 3 "fr_register_operand" "f"))]
- ""
- "#"
- "reload_completed"
- [(set (match_dup 0)
- (minus:V2SF
- (mult:V2SF (match_dup 1) (match_dup 3))
- (match_dup 2)))]
- "")
-
-(define_insn_and_split "*subv2sf3_2"
- [(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (minus:V2SF
- (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f"))
- (match_operand:V2SF 3 "fr_register_operand" "f")))
- (use (match_operand:V2SF 4 "" "X"))]
- ""
- "#"
- ""
- [(set (match_dup 0)
- (minus:V2SF
- (mult:V2SF (match_dup 1) (match_dup 2))
- (match_dup 3)))]
- "")
-
(define_insn "mulv2sf3"
[(set (match_operand:V2SF 0 "fr_register_operand" "=f")
(mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
"fpmpy %0 = %1, %2"
[(set_attr "itanium_class" "fmac")])
-(define_insn "fpma"
+(define_insn "fmav2sf4"
[(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (plus:V2SF
- (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f"))
+ (fma:V2SF
+ (match_operand:V2SF 1 "fr_register_operand" "f")
+ (match_operand:V2SF 2 "fr_register_operand" "f")
(match_operand:V2SF 3 "fr_register_operand" "f")))]
""
"fpma %0 = %1, %2, %3"
[(set_attr "itanium_class" "fmac")])
-(define_insn "fpms"
+(define_insn "fmsv2sf4"
[(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (minus:V2SF
- (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f"))
- (match_operand:V2SF 3 "fr_register_operand" "f")))]
+ (fma:V2SF
+ (match_operand:V2SF 1 "fr_register_operand" "f")
+ (match_operand:V2SF 2 "fr_register_operand" "f")
+ (neg:V2SF (match_operand:V2SF 3 "fr_register_operand" "f"))))]
""
"fpms %0 = %1, %2, %3"
[(set_attr "itanium_class" "fmac")])
"fpnmpy %0 = %1, %2"
[(set_attr "itanium_class" "fmac")])
-(define_insn "*fpnma"
+(define_insn "fnmav2sf4"
[(set (match_operand:V2SF 0 "fr_register_operand" "=f")
- (plus:V2SF
- (neg:V2SF
- (mult:V2SF (match_operand:V2SF 1 "fr_register_operand" "f")
- (match_operand:V2SF 2 "fr_register_operand" "f")))
+ (fma:V2SF
+ (neg:V2SF (match_operand:V2SF 1 "fr_register_operand" "f"))
+ (match_operand:V2SF 2 "fr_register_operand" "f")
(match_operand:V2SF 3 "fr_register_operand" "f")))]
""
"fpnma %0 = %1, %2, %3"