This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
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