;; "11" specifies MEMMODEL_ACQUIRE.
(define_attr "sync_memmodel" "" (const_int 10))
+;; Accumulator operand for madd patterns.
+(define_attr "accum_in" "none,0,1,2,3,4,5" (const_string "none"))
;; Classification of each insn.
;; branch conditional branch
madd\t%1,%2
#"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "SI")
(set_attr "length" "4,8")])
madd\t%0,%1,%2
#"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "SI")
(set_attr "length" "4,4,8")])
return "%[macc\t%@,%1,%2%]";
}
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "SI")])
(define_insn "*msac"
return "msac\t$0,%2,%3";
}
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "SI")])
;; An msac-like instruction implemented using negation and a macc.
(clobber (match_dup 4))])]
""
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "1")
(set_attr "length" "8")])
;; Patterns generated by the define_peephole2 below.
"ISA_HAS_MACC && reload_completed"
"macc\t%3,%1,%2"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "0")
(set_attr "mode" "SI")])
(define_insn "*msac2"
"ISA_HAS_MSAC && reload_completed"
"msac\t%3,%1,%2"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "0")
(set_attr "mode" "SI")])
;; Convert macc $0,<r1>,<r2> & mflo <r3> into macc <r3>,<r1>,<r2>
msub\t%2,%3
#"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "SI")
(set_attr "length" "4,8")])
return "msac<u>\t$0,%1,%2";
}
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "SI")])
;; _highpart patterns
"TARGET_MAD"
"mad\t%1,%2"
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "0")
(set_attr "mode" "SI")])
;; See the comment above <u>msubsidi4 for the relationship between
return "%[macc<u>\t%@,%1,%2%]";
}
[(set_attr "type" "imadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "SI")])
;; Floating point multiply accumulate instructions.
"ISA_HAS_FP_MADD4_MSUB4 && TARGET_FUSED_MADD"
"madd.<fmt>\t%0,%3,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*madd3<mode>"
"ISA_HAS_FP_MADD3_MSUB3 && TARGET_FUSED_MADD"
"madd.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*msub4<mode>"
"ISA_HAS_FP_MADD4_MSUB4 && TARGET_FUSED_MADD"
"msub.<fmt>\t%0,%3,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*msub3<mode>"
"ISA_HAS_FP_MADD3_MSUB3 && TARGET_FUSED_MADD"
"msub.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmadd4<mode>"
&& !HONOR_NANS (<MODE>mode)"
"nmadd.<fmt>\t%0,%3,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmadd3<mode>"
&& !HONOR_NANS (<MODE>mode)"
"nmadd.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmadd4<mode>_fastmath"
&& !HONOR_NANS (<MODE>mode)"
"nmadd.<fmt>\t%0,%3,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmadd3<mode>_fastmath"
&& !HONOR_NANS (<MODE>mode)"
"nmadd.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "3")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmsub4<mode>"
&& !HONOR_NANS (<MODE>mode)"
"nmsub.<fmt>\t%0,%1,%2,%3"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmsub3<mode>"
&& !HONOR_NANS (<MODE>mode)"
"nmsub.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmsub4<mode>_fastmath"
&& !HONOR_NANS (<MODE>mode)"
"nmsub.<fmt>\t%0,%1,%2,%3"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "<UNITMODE>")])
(define_insn "*nmsub3<mode>_fastmath"
&& !HONOR_NANS (<MODE>mode)"
"nmsub.<fmt>\t%0,%1,%2"
[(set_attr "type" "fmadd")
+ (set_attr "accum_in" "1")
(set_attr "mode" "<UNITMODE>")])
;;