[i386] : Improve split condition for complex MMX with SSE emulations

Message ID CAFULd4bRLNieg+poCj3frDEobGmRm1fzNKaGf5tCCotxO8eDPg@mail.gmail.com
State New
Headers show
Series
  • [i386] : Improve split condition for complex MMX with SSE emulations
Related show

Commit Message

Uros Bizjak July 2, 2019, 3:52 p.m.
Attached patch improves the split condition from using
TARGET_MMX_WITH_SSE to TARGET_SSEx && SSE_REGNO_P, which is what these
splitters really split.

2019-07-02  UroŇ° Bizjak  <ubizjak@gmail.com>

    * config/i386/mmx.md (mmx_pack<s_trunsuffix>swb):
    Use TARGET_SSE2 && SSE_REGNO_P in split condition.
    (mmx_packssdw): Ditto.
    (mmx_punpckhbw): Ditto.
    (mmx_punpcklbw): Ditto.
    (mmx_punpckhwd): Ditto.
    (mmx_punpcklwd): Ditto.
    (mmx_punpckhdq): Ditto.
    (mmx_punpckldq): Ditto.
    (*vec_dupv4hi): Ditto.
    (*vec_dupv2si): Ditto.
    (mmx_pmovmskb): Ditto.
    * config/i386/sse.md (sse_cvtpi2ps): Use
    TARGET_SSE2 && SSE_REG_P in split condition.
    (ssse3_ph<plusminus_mnemonic>wv4hi3): Use
    TARGET_SSSE3 && SSE_REGNO_P in split condition.
    (ssse3_ph<plusminus_mnemonic>dv2si3): Ditto.
    (ssse3_pshufbv8qi3): Ditto.
    (ssse3_palignrdi): Ditto.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.

Patch

diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index 9ff86ba0eecc..4c71e66e6607 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -1228,7 +1228,8 @@ 
    pack<s_trunsuffix>swb\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_pack (operands, <any_s_truncate:CODE>); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1247,7 +1248,8 @@ 
    packssdw\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_pack (operands, SS_TRUNCATE); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1269,7 +1271,8 @@ 
    punpckhbw\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, true); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1291,7 +1294,8 @@ 
    punpcklbw\t{%2, %0|%0, %k2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, false); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1311,7 +1315,8 @@ 
    punpckhwd\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, true); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1331,7 +1336,8 @@ 
    punpcklwd\t{%2, %0|%0, %k2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, false); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1351,7 +1357,8 @@ 
    punpckhdq\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, true); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1371,7 +1378,8 @@ 
    punpckldq\t{%2, %0|%0, %k2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
   "ix86_split_mmx_punpck (operands, false); DONE;"
   [(set_attr "mmx_isa" "native,sse_noavx,avx")
@@ -1517,7 +1525,8 @@ 
    pshufw\t{$0, %0, %0|%0, %0, 0}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
 {
   rtx op;
@@ -1889,7 +1898,8 @@ 
   "@
    pmovmskb\t{%1, %0|%0, %1}
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[1]))"
   [(set (match_dup 0)
         (unspec:SI [(match_dup 1)] UNSPEC_MOVMSK))
    (set (match_dup 0)
diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md
index 0494cbf08ac2..8f50cb12c60a 100644
--- a/gcc/config/i386/sse.md
+++ b/gcc/config/i386/sse.md
@@ -5110,7 +5110,8 @@ 
    cvtpi2ps\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSE2 && reload_completed
+   && SSE_REG_P (operands[2])"
   [(const_int 0)]
 {
   rtx op2 = lowpart_subreg (V4SImode, operands[2],
@@ -15881,7 +15882,8 @@ 
    ph<plusminus_mnemonic>w\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSSE3 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
 {
   /* Generate SSE version of the operation.  */
@@ -15997,7 +15999,8 @@ 
    ph<plusminus_mnemonic>d\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSSE3 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(const_int 0)]
 {
   /* Generate SSE version of the operation.  */
@@ -16353,7 +16356,8 @@ 
    pshufb\t{%2, %0|%0, %2}
    #
    #"
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSSE3 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(set (match_dup 3) (match_dup 5))
    (set (match_dup 3)
 	(and:V4SI (match_dup 3) (match_dup 2)))
@@ -16490,7 +16494,8 @@ 
       gcc_unreachable ();
     }
 }
-  "TARGET_MMX_WITH_SSE && reload_completed"
+  "TARGET_SSSE3 && reload_completed
+   && SSE_REGNO_P (REGNO (operands[0]))"
   [(set (match_dup 0)
 	(lshiftrt:V1TI (match_dup 0) (match_dup 3)))]
 {