------- Comment #1 from rguenth at gcc dot gnu dot org 2010-01-19 13:08 ------- Playing with patterns like
(define_insn "*fma4_fmadd<mode>4_1" [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x") (plus:SSEMODEF4 (mult:SSEMODEF4 (match_operand:SSEMODEF4 2 "nonimmediate_operand" "%x,x") (match_operand:SSEMODEF4 3 "nonimmediate_operand" "x,m")) (match_operand:SSEMODEF4 4 "nonimmediate_operand" "xm,x"))) (set (match_operand:SSEMODEF4 1 "register_operand" "=x,x") (mult:SSEMODEF4 (match_dup 2) (match_dup 3)))] "TARGET_FMA4 && TARGET_FUSED_MADD" "vmul<ssemodesuffixf4>\t{%3, %2, %1|%1, %2, %3}\n vadd<ssemodesuffixf4>\t{%4, %1, %0|%0, %1, %4}" [(set_attr "type" "ssemuladd") (set_attr "mode" "<MODE>")]) and trying to exploit combine doesn't work as while it combines the multiplication and the addition into the above the subtraction isn't combined into (of course - the separate multiplication is already gone). Another idea would be to use fwprop for this, instead of propagating single-uses only propagate also if propagation into all uses is possible. -- rguenth at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Ever Confirmed|0 |1 Last reconfirmed|0000-00-00 00:00:00 |2010-01-19 13:08:16 date| | http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42802