public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r12-6084] rs6000: Replace UNSPECS with ss_plus/us_plus and ss_minus/us_minus
@ 2021-12-21  3:50 Xiong Hu Luo
  0 siblings, 0 replies; only message in thread
From: Xiong Hu Luo @ 2021-12-21  3:50 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:460d53f816fe30093653cb22ef0feeb4bddc0895

commit r12-6084-g460d53f816fe30093653cb22ef0feeb4bddc0895
Author: Xionghu Luo <luoxhu@linux.ibm.com>
Date:   Mon Dec 20 21:02:50 2021 -0600

    rs6000: Replace UNSPECS with ss_plus/us_plus and ss_minus/us_minus
    
    These four UNSPECS seems could be replaced with native RTL.
    
    For
    "(set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))":
    
    Quoted David's explanation:
    
    "The design came from the early implementation of Altivec:
    
    https://gcc.gnu.org/pipermail/gcc-patches/2002-May/077409.html
    
    If one later checks for saturation (reads VSCR), one needs a
    corresponding SET of the value.  It's set in an architecture-specific
    manner that isn't described to GCC, but it's set, not just clobbered
    and in an undefined state.
    
    The RTL does not describe that VSCR is set to the value 0.  The
    (const_int 0) is not the value set.  You can think of the (const_int
    0) as a dummy RTL argument to the VSCR UNSPEC.  UNSPEC requires at
    least one argument and the pattern doesn't try to express the
    argument, so it uses a dummy RTL constant.  It's part of a PARALLEL
    and the plus or minus already expresses the data dependency of the
    pattern on the input operands."
    
    gcc/ChangeLog:
    
    2021-12-21  Xionghu Luo  <luoxhu@linux.ibm.com>
    
            * config/rs6000/altivec.md (altivec_vaddu<VI_char>s): Replace
            UNSPEC_VADDU with us_plus.
            (altivec_vadds<VI_char>s): Replace UNSPEC_VADDS with ss_plus.
            (altivec_vsubu<VI_char>s): Replace UNSPEC_VSUBU with us_minus.
            (altivec_vsubs<VI_char>s): Replace UNSPEC_VSUBS with ss_minus.
            (altivec_abss_<mode>): Likewise.

Diff:
---
 gcc/config/rs6000/altivec.md | 29 ++++++++++-------------------
 1 file changed, 10 insertions(+), 19 deletions(-)

diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md
index ef432112333..c2312cc1e0f 100644
--- a/gcc/config/rs6000/altivec.md
+++ b/gcc/config/rs6000/altivec.md
@@ -29,8 +29,6 @@
    UNSPEC_VMHADDSHS
    UNSPEC_VMHRADDSHS
    UNSPEC_VADDCUW
-   UNSPEC_VADDU
-   UNSPEC_VADDS
    UNSPEC_VAVGU
    UNSPEC_VAVGS
    UNSPEC_VMULEUB
@@ -61,8 +59,6 @@
    UNSPEC_VSR
    UNSPEC_VSRO
    UNSPEC_VSUBCUW
-   UNSPEC_VSUBU
-   UNSPEC_VSUBS
    UNSPEC_VSUM4UBS
    UNSPEC_VSUM4S
    UNSPEC_VSUM2SWS
@@ -517,9 +513,8 @@
 
 (define_insn "altivec_vaddu<VI_char>s"
   [(set (match_operand:VI 0 "register_operand" "=v")
-        (unspec:VI [(match_operand:VI 1 "register_operand" "v")
-		    (match_operand:VI 2 "register_operand" "v")]
-		   UNSPEC_VADDU))
+        (us_plus:VI (match_operand:VI 1 "register_operand" "v")
+		    (match_operand:VI 2 "register_operand" "v")))
    (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
   "<VI_unit>"
   "vaddu<VI_char>s %0,%1,%2"
@@ -527,9 +522,8 @@
 
 (define_insn "altivec_vadds<VI_char>s"
   [(set (match_operand:VI 0 "register_operand" "=v")
-        (unspec:VI [(match_operand:VI 1 "register_operand" "v")
-                    (match_operand:VI 2 "register_operand" "v")]
-		   UNSPEC_VADDS))
+        (ss_plus:VI (match_operand:VI 1 "register_operand" "v")
+		    (match_operand:VI 2 "register_operand" "v")))
    (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
   "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
   "vadds<VI_char>s %0,%1,%2"
@@ -563,9 +557,8 @@
 
 (define_insn "altivec_vsubu<VI_char>s"
   [(set (match_operand:VI 0 "register_operand" "=v")
-        (unspec:VI [(match_operand:VI 1 "register_operand" "v")
-                    (match_operand:VI 2 "register_operand" "v")]
-		   UNSPEC_VSUBU))
+        (us_minus:VI (match_operand:VI 1 "register_operand" "v")
+		     (match_operand:VI 2 "register_operand" "v")))
    (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
   "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
   "vsubu<VI_char>s %0,%1,%2"
@@ -573,9 +566,8 @@
 
 (define_insn "altivec_vsubs<VI_char>s"
   [(set (match_operand:VI 0 "register_operand" "=v")
-        (unspec:VI [(match_operand:VI 1 "register_operand" "v")
-                    (match_operand:VI 2 "register_operand" "v")]
-		   UNSPEC_VSUBS))
+        (ss_minus:VI (match_operand:VI 1 "register_operand" "v")
+		     (match_operand:VI 2 "register_operand" "v")))
    (set (reg:SI VSCR_REGNO) (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))]
   "VECTOR_UNIT_ALTIVEC_P (<MODE>mode)"
   "vsubs<VI_char>s %0,%1,%2"
@@ -3480,9 +3472,8 @@
 (define_expand "altivec_abss_<mode>"
   [(set (match_dup 2) (vec_duplicate:VI (const_int 0)))
    (parallel [(set (match_dup 3)
-		   (unspec:VI [(match_dup 2)
-			       (match_operand:VI 1 "register_operand" "v")]
-			      UNSPEC_VSUBS))
+		   (ss_minus:VI (match_dup 2)
+				(match_operand:VI 1 "register_operand" "v")))
 	      (set (reg:SI VSCR_REGNO)
 		   (unspec:SI [(const_int 0)] UNSPEC_SET_VSCR))])
    (set (match_operand:VI 0 "register_operand" "=v")


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2021-12-21  3:50 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-21  3:50 [gcc r12-6084] rs6000: Replace UNSPECS with ss_plus/us_plus and ss_minus/us_minus Xiong Hu Luo

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).