This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix fma4 intrinsics with -mno-fused-madd (PR target/44338)
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Uros Bizjak <ubizjak at gmail dot com>, Jan Hubicka <jh at suse dot cz>
- Cc: gcc-patches at gcc dot gnu dot org, Harsha Jagasia <harsha dot jagasia at amd dot com>
- Date: Mon, 31 May 2010 17:33:13 +0200
- Subject: [PATCH] Fix fma4 intrinsics with -mno-fused-madd (PR target/44338)
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
Hi!
All 40 fma4 insn patterns are guarded with TARGET_FMA4 && TARGET_FUSED_MADD
condition, which leads to ICEs when fma4 intrinsics are used with
-mno-fused-madd. Apparently half of the insns have generic patterns
(so that e.g. combiner can match them) and half of them use
- UNSPEC_FMA4_INTRINSIC unspec. These are what the intrinsic builtins
expand to.
The following patch fixes it by using just TARGET_FMA4 condition for the
latter, there is no risk that anything but the intrinsics will be matched
by those patterns.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk/4.5?
2010-05-31 Jakub Jelinek <jakub@redhat.com>
PR target/44338
* config/i386/sse.md (fma4i_fmadd<mode>4256, fma4i_fmsub<mode>4256,
fma4i_fnmadd<mode>4256, fma4i_fnmsub<mode>4256, fma4i_fmadd<mode>4,
fma4i_fmsub<mode>4, fma4i_fnmadd<mode>4, fma4i_fnmsub<mode>4,
fma4i_vmfmadd<mode>4, fma4i_vmfmsub<mode>4, fma4i_vmfnmadd<mode>4,
fma4i_vmfnmsub<mode>4, fma4i_fmaddsubv8sf4, fma4i_fmaddsubv4df4,
fma4i_fmaddsubv4sf4, fma4i_fmaddsubv2df4, fma4i_fmsubaddv8sf4,
fma4i_fmsubaddv4df4, fma4i_fmsubaddv4sf4, fma4i_fmsubaddv2df4):
Guard only with TARGET_FMA4 instead of TARGET_FMA4 &&
TARGET_FUSED_MADD.
* gcc.target/i386/sse-24.c: New test.
--- gcc/config/i386/sse.md.jj 2010-05-17 07:52:06.000000000 +0200
+++ gcc/config/i386/sse.md 2010-05-31 14:14:04.000000000 +0200
@@ -1943,7 +1943,7 @@ (define_insn "fma4i_fmadd<mode>4256"
(match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
(match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -1957,7 +1957,7 @@ (define_insn "fma4i_fmsub<mode>4256"
(match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
(match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -1971,7 +1971,7 @@ (define_insn "fma4i_fnmadd<mode>4256"
(match_operand:FMA4MODEF4 1 "nonimmediate_operand" "%x,x")
(match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m")))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmadd<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -1986,7 +1986,7 @@ (define_insn "fma4i_fnmsub<mode>4256"
(match_operand:FMA4MODEF4 2 "nonimmediate_operand" "x,m"))
(match_operand:FMA4MODEF4 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmsub<fma4modesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -2000,7 +2000,7 @@ (define_insn "fma4i_fmadd<mode>4"
(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
(match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -2014,7 +2014,7 @@ (define_insn "fma4i_fmsub<mode>4"
(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
(match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -2028,7 +2028,7 @@ (define_insn "fma4i_fnmadd<mode>4"
(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%x,x")
(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m")))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmadd<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -2043,7 +2043,7 @@ (define_insn "fma4i_fnmsub<mode>4"
(match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,m"))
(match_operand:SSEMODEF2P 3 "nonimmediate_operand" "xm,x"))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmsub<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<MODE>")])
@@ -2062,7 +2062,7 @@ (define_insn "fma4i_vmfmadd<mode>4"
(match_dup 0)
(const_int 1))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<ssescalarmode>")])
@@ -2079,7 +2079,7 @@ (define_insn "fma4i_vmfmsub<mode>4"
(match_dup 0)
(const_int 1))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<ssescalarmode>")])
@@ -2096,7 +2096,7 @@ (define_insn "fma4i_vmfnmadd<mode>4"
(match_dup 0)
(const_int 1))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmadd<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<ssescalarmode>")])
@@ -2114,7 +2114,7 @@ (define_insn "fma4i_vmfnmsub<mode>4"
(match_dup 0)
(const_int 1))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfnmsub<ssemodesuffixf2s>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "<ssescalarmode>")])
@@ -2293,7 +2293,7 @@ (define_insn "fma4i_fmaddsubv8sf4"
(match_dup 3))
(const_int 170))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V8SF")])
@@ -2314,7 +2314,7 @@ (define_insn "fma4i_fmaddsubv4df4"
(match_dup 3))
(const_int 10))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V4DF")])
@@ -2335,7 +2335,7 @@ (define_insn "fma4i_fmaddsubv4sf4"
(match_dup 3))
(const_int 10))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmaddsubps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V4SF")])
@@ -2356,7 +2356,7 @@ (define_insn "fma4i_fmaddsubv2df4"
(match_dup 3))
(const_int 2))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmaddsubpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V2DF")])
@@ -2377,7 +2377,7 @@ (define_insn "fma4i_fmsubaddv8sf4"
(match_dup 3))
(const_int 85))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V8SF")])
@@ -2398,7 +2398,7 @@ (define_insn "fma4i_fmsubaddv4df4"
(match_dup 3))
(const_int 5))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V4DF")])
@@ -2419,7 +2419,7 @@ (define_insn "fma4i_fmsubaddv4sf4"
(match_dup 3))
(const_int 5))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsubaddps\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V4SF")])
@@ -2440,7 +2440,7 @@ (define_insn "fma4i_fmsubaddv2df4"
(match_dup 3))
(const_int 1))]
UNSPEC_FMA4_INTRINSIC))]
- "TARGET_FMA4 && TARGET_FUSED_MADD"
+ "TARGET_FMA4"
"vfmsubaddpd\t{%3, %2, %1, %0|%0, %1, %2, %3}"
[(set_attr "type" "ssemuladd")
(set_attr "mode" "V2DF")])
--- gcc/testsuite/gcc.target/i386/sse-24.c.jj 2010-05-31 14:19:10.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/sse-24.c 2010-05-31 14:19:06.000000000 +0200
@@ -0,0 +1,5 @@
+/* PR target/44338 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -mno-fused-madd" } */
+
+#include "sse-23.c"
Jakub