This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix up _mm_f{,n}m{add,sub}_s{s,d} (PR target/54564)


On Thu, Sep 13, 2012 at 07:42:17PM +0200, Uros Bizjak wrote:
> Can we introduce additional "*fmai_fmadd_<mode>_1" pattern (and
> others) that would cover missing 231 alternative?

Here is the patch for that.  But, I don't see how it would ever match
(unless perhaps x is equal to z, but then the other insns could do the right
job too).

2012-09-13  Jakub Jelinek  <jakub@redhat.com>

	PR target/54564
	* config/i386/sse.md (*fmai_fmadd_<mode>_1, *fmai_fmsub_<mode>_1,
	*fmai_fnmadd_<mode>_1, *fmai_fnmsub_<mode>_1): New patterns.

--- gcc/config/i386/sse.md.jj	2012-09-13 19:58:42.000000000 +0200
+++ gcc/config/i386/sse.md	2012-09-13 20:07:15.181214004 +0200
@@ -2092,6 +2092,20 @@ (define_insn "*fmai_fmadd_<mode>"
   [(set_attr "type" "ssemuladd")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fmai_fmadd_<mode>_1"
+  [(set (match_operand:VF_128 0 "register_operand" "=x")
+        (vec_merge:VF_128
+	  (fma:VF_128
+	    (match_operand:VF_128 1 "nonimmediate_operand" "%x")
+	    (match_operand:VF_128 2 "nonimmediate_operand" "xm")
+	    (match_operand:VF_128 3 "nonimmediate_operand" " 0"))
+	  (match_dup 3)
+	  (const_int 1)))]
+  "TARGET_FMA"
+  "vfmadd231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "ssemuladd")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fmai_fmsub_<mode>"
   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
         (vec_merge:VF_128
@@ -2109,6 +2123,21 @@ (define_insn "*fmai_fmsub_<mode>"
   [(set_attr "type" "ssemuladd")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fmai_fmsub_<mode>_1"
+  [(set (match_operand:VF_128 0 "register_operand" "=x")
+        (vec_merge:VF_128
+	  (fma:VF_128
+	    (match_operand:VF_128   1 "nonimmediate_operand" "%x")
+	    (match_operand:VF_128   2 "nonimmediate_operand" "xm")
+	    (neg:VF_128
+	      (match_operand:VF_128 3 "nonimmediate_operand" " 0")))
+	  (match_dup 3)
+	  (const_int 1)))]
+  "TARGET_FMA"
+  "vfmsub231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "ssemuladd")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fmai_fnmadd_<mode>"
   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
         (vec_merge:VF_128
@@ -2126,6 +2155,21 @@ (define_insn "*fmai_fnmadd_<mode>"
   [(set_attr "type" "ssemuladd")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fmai_fnmadd_<mode>_1"
+  [(set (match_operand:VF_128 0 "register_operand" "=x")
+        (vec_merge:VF_128
+	  (fma:VF_128
+	    (neg:VF_128
+	      (match_operand:VF_128 1 "nonimmediate_operand" "%x"))
+	    (match_operand:VF_128   2 "nonimmediate_operand" "xm")
+	    (match_operand:VF_128   3 "nonimmediate_operand" " 0"))
+	  (match_dup 3)
+	  (const_int 1)))]
+  "TARGET_FMA"
+  "vfnmadd231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "ssemuladd")
+   (set_attr "mode" "<MODE>")])
+
 (define_insn "*fmai_fnmsub_<mode>"
   [(set (match_operand:VF_128 0 "register_operand" "=x,x")
         (vec_merge:VF_128
@@ -2144,6 +2188,22 @@ (define_insn "*fmai_fnmsub_<mode>"
   [(set_attr "type" "ssemuladd")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "*fmai_fnmsub_<mode>_1"
+  [(set (match_operand:VF_128 0 "register_operand" "=x")
+        (vec_merge:VF_128
+	  (fma:VF_128
+	    (neg:VF_128
+	      (match_operand:VF_128 1 "nonimmediate_operand" "%x"))
+	    (match_operand:VF_128   2 "nonimmediate_operand" "xm")
+	    (neg:VF_128
+	      (match_operand:VF_128 3 "nonimmediate_operand" " 0")))
+	  (match_dup 3)
+	  (const_int 1)))]
+  "TARGET_FMA"
+  "vfnmsub231<ssescalarmodesuffix>\t{%2, %1, %0|%0, %1, %2}"
+  [(set_attr "type" "ssemuladd")
+   (set_attr "mode" "<MODE>")])
+
 ;; FMA4 floating point scalar intrinsics.  These write the
 ;; entire destination register, with the high-order elements zeroed.
 


	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]