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: Vector permutation support for x86


On Wed, Dec 2, 2009 at 16:57, Sebastian Pop <sebpop@gmail.com> wrote:
> On Wed, Dec 2, 2009 at 16:23, Richard Henderson <rth@redhat.com> wrote:
>>> @@ -2030,11 +2020,10 @@
>>> ÃÂ ÃÂ ÃÂ ÃÂ(minus:SSEMODEF4
>>> ÃÂ ÃÂ ÃÂ ÃÂ (mult:SSEMODEF4
>>> ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ(neg:SSEMODEF4
>>> - ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ(match_operand:SSEMODEF4 1 "nonimmediate_operand" "x,x"))
>>> - ÃÂ ÃÂ ÃÂ ÃÂ (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,xm"))
>>> + ÃÂ ÃÂ ÃÂ ÃÂ ÃÂ(match_operand:SSEMODEF4 1 "register_operand" "%x,x"))
>>> + ÃÂ ÃÂ ÃÂ ÃÂ (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
>>> ÃÂ ÃÂ ÃÂ ÃÂ (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
>>
>> Careful -- these with NEG are not commutative. ÃÂFive instances.
>
> This escaped me.
>
> But there is another problem: in the spec src1 and src2 are part
> of a multiplication and so op1 and op2 *are* commutative.
> For instance, in the XOP manual we have
>
> VFNMSUBPD dest, src1, src2, src3
>
> with the semantics: "dest = - (src1 * src2) - src3"
>
> that means that the above patterns are just wrong wrt. the XOP manual:
> the pattern as implemented in sse.md is "dest = (-src1) * src2 - src3
>
> I should go over the semantics of all these insns.
>

Fixed like this.

Sebastian
From cd5b475525fe364e99675f366f80bb872d5db9cd Mon Sep 17 00:00:00 2001
From: Sebastian Pop <sebpop@gmail.com>
Date: Wed, 2 Dec 2009 17:09:51 -0600
Subject: [PATCH] Fix VFNMSUB insns.

---
 gcc/config/i386/sse.md |   64 ++++++++++++++++++++++++------------------------
 1 files changed, 32 insertions(+), 32 deletions(-)

diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 7bb4802..e222143 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -1816,10 +1816,10 @@
 (define_insn "fma4_fnmsub<mode>4256"
   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
 	(minus:FMA4MODEF4
-	 (mult:FMA4MODEF4
-	  (neg:FMA4MODEF4
-	   (match_operand:FMA4MODEF4 1 "register_operand" "%x,x"))
-	  (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
+	 (neg:FMA4MODEF4
+	  (mult:FMA4MODEF4
+	   (match_operand:FMA4MODEF4 1 "register_operand" "%x,x")
+	   (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))
 	 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x")))]
   "TARGET_FMA4 && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
@@ -1830,10 +1830,10 @@
 (define_split
   [(set (match_operand:FMA4MODEF4 0 "register_operand" "")
 	(minus:FMA4MODEF4
-	 (mult:FMA4MODEF4
-	  (neg:FMA4MODEF4
-	   (match_operand:FMA4MODEF4 1 "nonimmediate_operand" ""))
-	  (match_operand:FMA4MODEF4 2 "nonimmediate_operand" ""))
+	 (neg:FMA4MODEF4
+	  (mult:FMA4MODEF4
+	   (match_operand:FMA4MODEF4 1 "nonimmediate_operand" "")
+	   (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "")))
 	 (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "")))]
   "TARGET_FMA4
    && MEM_P (operands[2])
@@ -2018,10 +2018,10 @@
 (define_insn "fma4_fnmsub<mode>4"
   [(set (match_operand:SSEMODEF4 0 "register_operand" "=x,x")
 	(minus:SSEMODEF4
-	 (mult:SSEMODEF4
-	  (neg:SSEMODEF4
-	   (match_operand:SSEMODEF4 1 "register_operand" "%x,x"))
-	  (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m"))
+	 (neg:SSEMODEF4
+	  (mult:SSEMODEF4
+	   (match_operand:SSEMODEF4 1 "register_operand" "%x,x")
+	   (match_operand:SSEMODEF4 2 "nonimmediate_operand" "x,m")))
 	 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "xm,x")))]
   "TARGET_FMA4 && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
   "vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
@@ -2032,10 +2032,10 @@
 (define_split
   [(set (match_operand:SSEMODEF4 0 "register_operand" "")
 	(minus:SSEMODEF4
-	 (mult:SSEMODEF4
-	  (neg:SSEMODEF4
-	   (match_operand:SSEMODEF4 1 "nonimmediate_operand" ""))
-	  (match_operand:SSEMODEF4 2 "nonimmediate_operand" ""))
+	 (neg:SSEMODEF4
+	  (mult:SSEMODEF4
+	   (match_operand:SSEMODEF4 1 "nonimmediate_operand" "")
+	   (match_operand:SSEMODEF4 2 "nonimmediate_operand" "")))
 	 (match_operand:SSEMODEF4 3 "nonimmediate_operand" "")))]
   "TARGET_FMA4
    && MEM_P (operands[2])
@@ -2058,10 +2058,10 @@
   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
 	(vec_merge:SSEMODEF2P
 	 (minus:SSEMODEF2P
-	  (mult:SSEMODEF2P
-	   (neg:SSEMODEF2P
-	    (match_operand:SSEMODEF2P 1 "register_operand" "%x,x"))
-	   (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
+	  (neg:SSEMODEF2P
+	   (mult:SSEMODEF2P
+	    (match_operand:SSEMODEF2P 1 "register_operand" "%x,x")
+	    (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
 	  (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
 	 (match_dup 0)
 	 (const_int 1)))]
@@ -2118,10 +2118,10 @@
   [(set (match_operand:FMA4MODEF4 0 "register_operand" "=x,x")
 	(unspec:FMA4MODEF4
 	 [(minus:FMA4MODEF4
-	   (mult:FMA4MODEF4
-	    (neg:FMA4MODEF4
-	     (match_operand:FMA4MODEF4 1 "register_operand" "%x,x"))
-	    (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
+	   (neg:FMA4MODEF4
+	    (mult:FMA4MODEF4
+	     (match_operand:FMA4MODEF4 1 "register_operand" "%x,x")
+	     (match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))
 	   (match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
 	 UNSPEC_FMA4_INTRINSIC))]
   "TARGET_FMA4 && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
@@ -2176,10 +2176,10 @@
   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x")
 	(unspec:SSEMODEF2P
 	 [(minus:SSEMODEF2P
-	   (mult:SSEMODEF2P
-	    (neg:SSEMODEF2P
-	     (match_operand:SSEMODEF2P 1 "register_operand" "%x,x"))
-	    (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
+	   (neg:SSEMODEF2P
+	    (mult:SSEMODEF2P
+	     (match_operand:SSEMODEF2P 1 "register_operand" "%x,x")
+	     (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
 	   (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
 	 UNSPEC_FMA4_INTRINSIC))]
   "TARGET_FMA4 && !(MEM_P (operands[2]) && MEM_P (operands[3]))"
@@ -2245,10 +2245,10 @@
 	(unspec:SSEMODEF2P
 	 [(vec_merge:SSEMODEF2P
 	   (minus:SSEMODEF2P
-	    (mult:SSEMODEF2P
-	     (neg:SSEMODEF2P
-	      (match_operand:SSEMODEF2P 1 "register_operand" "%x,x"))
-	     (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
+	    (neg:SSEMODEF2P
+	     (mult:SSEMODEF2P
+	      (match_operand:SSEMODEF2P 1 "register_operand" "%x,x")
+	      (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))
 	    (match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))
 	   (match_dup 0)
 	   (const_int 1))]
-- 
1.6.0.4


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