Hello! As pointed out by Richi in PR56253 [1], we should enable standard vector-mode FMA patterns also for !TARGET_SSE_MATH, otherwise various transformations (convert_mult_to_fma) can't convert to a vectorized FMA.
2013-02-08 Uros Bizjak <ubiz...@gmail.com> * config/i386/sse.md (FMAMODEM): New mode iterator. (fma<mode>4, fms<mode>4, fnma<mode>4, fnms<mode>4): Use FMAMODEM mode iterator. Do not use TARGET_SSE_MATH in insn constraint. Tested on x86_64-pc-linux-gnu {,-m32}, committed to mainline SVN. Will be committed to 4.7 branch. [1] http://gcc.gnu.org/bugzilla/show_bug.cgi?id=56253 Uros.
Index: config/i386/sse.md =================================================================== --- config/i386/sse.md (revision 195894) +++ config/i386/sse.md (working copy) @@ -2037,42 +2037,46 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define_mode_iterator FMAMODE [SF DF V4SF V2DF V8SF V4DF]) +;; The standard names for scalar FMA are only available with SSE math enabled. +(define_mode_iterator FMAMODEM [(SF "TARGET_SSE_MATH") + (DF "TARGET_SSE_MATH") + V4SF V2DF V8SF V4DF]) -;; The standard names for fma is only available with SSE math enabled. (define_expand "fma<mode>4" - [(set (match_operand:FMAMODE 0 "register_operand") - (fma:FMAMODE - (match_operand:FMAMODE 1 "nonimmediate_operand") - (match_operand:FMAMODE 2 "nonimmediate_operand") - (match_operand:FMAMODE 3 "nonimmediate_operand")))] - "(TARGET_FMA || TARGET_FMA4) && TARGET_SSE_MATH") + [(set (match_operand:FMAMODEM 0 "register_operand") + (fma:FMAMODEM + (match_operand:FMAMODEM 1 "nonimmediate_operand") + (match_operand:FMAMODEM 2 "nonimmediate_operand") + (match_operand:FMAMODEM 3 "nonimmediate_operand")))] + "TARGET_FMA || TARGET_FMA4") (define_expand "fms<mode>4" - [(set (match_operand:FMAMODE 0 "register_operand") - (fma:FMAMODE - (match_operand:FMAMODE 1 "nonimmediate_operand") - (match_operand:FMAMODE 2 "nonimmediate_operand") - (neg:FMAMODE (match_operand:FMAMODE 3 "nonimmediate_operand"))))] - "(TARGET_FMA || TARGET_FMA4) && TARGET_SSE_MATH") + [(set (match_operand:FMAMODEM 0 "register_operand") + (fma:FMAMODEM + (match_operand:FMAMODEM 1 "nonimmediate_operand") + (match_operand:FMAMODEM 2 "nonimmediate_operand") + (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))] + "TARGET_FMA || TARGET_FMA4") (define_expand "fnma<mode>4" - [(set (match_operand:FMAMODE 0 "register_operand") - (fma:FMAMODE - (neg:FMAMODE (match_operand:FMAMODE 1 "nonimmediate_operand")) - (match_operand:FMAMODE 2 "nonimmediate_operand") - (match_operand:FMAMODE 3 "nonimmediate_operand")))] - "(TARGET_FMA || TARGET_FMA4) && TARGET_SSE_MATH") + [(set (match_operand:FMAMODEM 0 "register_operand") + (fma:FMAMODEM + (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand")) + (match_operand:FMAMODEM 2 "nonimmediate_operand") + (match_operand:FMAMODEM 3 "nonimmediate_operand")))] + "TARGET_FMA || TARGET_FMA4") (define_expand "fnms<mode>4" - [(set (match_operand:FMAMODE 0 "register_operand") - (fma:FMAMODE - (neg:FMAMODE (match_operand:FMAMODE 1 "nonimmediate_operand")) - (match_operand:FMAMODE 2 "nonimmediate_operand") - (neg:FMAMODE (match_operand:FMAMODE 3 "nonimmediate_operand"))))] - "(TARGET_FMA || TARGET_FMA4) && TARGET_SSE_MATH") + [(set (match_operand:FMAMODEM 0 "register_operand") + (fma:FMAMODEM + (neg:FMAMODEM (match_operand:FMAMODEM 1 "nonimmediate_operand")) + (match_operand:FMAMODEM 2 "nonimmediate_operand") + (neg:FMAMODEM (match_operand:FMAMODEM 3 "nonimmediate_operand"))))] + "TARGET_FMA || TARGET_FMA4") -;; The builtin for intrinsics is not constrained by SSE math enabled. +;; The builtins for intrinsics are not constrained by SSE math enabled. +(define_mode_iterator FMAMODE [SF DF V4SF V2DF V8SF V4DF]) + (define_expand "fma4i_fmadd_<mode>" [(set (match_operand:FMAMODE 0 "register_operand") (fma:FMAMODE