[RS6000] , add xxswapd support
diff mbox series

Message ID 1568311364.3756.10.camel@us.ibm.com
State New
Headers show
Series
  • [RS6000] , add xxswapd support
Related show

Commit Message

Carl Love Sept. 12, 2019, 6:02 p.m. UTC
GCC maintainers:

The following patch adds define_insn support for xxswapd mnemonic.  The
xxswapd mnemonic is the more prefered name for the xxpermdi mnemonic. 
The following patch replaces the define_insn xxpermdi with define_insn
xxswapd.

The patch has been tested on:

  powerpc64le-unknown-linux-gnu (Power 8 LE)
  powerpc64le-unknown-linux-gnu (Power 9 LE)

with no regressions.

Please let me know if the patch is acceptable for trunk.

                        Carl Love
-----------------------------------------------------------
RS6000, add xxswapd support

gcc/ChangeLog:

2019-09-10  Carl Love  <cel@us.ibm.com>

	* config/rs6000/vsx.md (xxswapd_v4si, xxswapd_v8hi, xxswapd_v16qi):
	New define_insn.
	(vsx_xxpermdi4_le_<mode>, vsx_xxpermdi8_le_V8HI,
	vsx_xxpermdi16_le_V16QI): Removed define_insn.
---
 gcc/config/rs6000/vsx.md | 74 ++++++++++++++++++++++------------------
 1 file changed, 40 insertions(+), 34 deletions(-)

Patch
diff mbox series

diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 7633171df..cd67131eb 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -2941,43 +2941,49 @@ 
   "xxpermdi %x0,%x1,%x1,2"
   [(set_attr "type" "vecperm")])
 
-(define_insn "*vsx_xxpermdi4_le_<mode>"
-  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wa")
-        (vec_select:VSX_W
-          (match_operand:VSX_W 1 "vsx_register_operand" "wa")
-          (parallel [(const_int 2) (const_int 3)
-                     (const_int 0) (const_int 1)])))]
-  "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (<MODE>mode)"
-  "xxpermdi %x0,%x1,%x1,2"
+(define_insn "xxswapd_v16qi"
+  [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
+	(vec_select:V16QI
+	  (match_operand:V16QI 1 "vsx_register_operand" "wa")
+	  (parallel [(const_int 8) (const_int 9)
+		     (const_int 10) (const_int 11)
+		     (const_int 12) (const_int 13)
+		     (const_int 14) (const_int 15)
+		     (const_int 0) (const_int 1)
+		     (const_int 2) (const_int 3)
+		     (const_int 4) (const_int 5)
+		     (const_int 6) (const_int 7)])))]
+   "TARGET_VSX"
+;; AIX does not support the extended mnemonic xxswapd.  Use the basic
+;; mnemonic xxpermdi instead.
+   "xxpermdi %x0,%x1,%x1,2"
   [(set_attr "type" "vecperm")])
 
-(define_insn "*vsx_xxpermdi8_le_V8HI"
+(define_insn "xxswapd_v8hi"
   [(set (match_operand:V8HI 0 "vsx_register_operand" "=wa")
-        (vec_select:V8HI
-          (match_operand:V8HI 1 "vsx_register_operand" "wa")
-          (parallel [(const_int 4) (const_int 5)
-                     (const_int 6) (const_int 7)
-                     (const_int 0) (const_int 1)
-                     (const_int 2) (const_int 3)])))]
-  "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (V8HImode)"
-  "xxpermdi %x0,%x1,%x1,2"
-  [(set_attr "type" "vecperm")])
-
-(define_insn "*vsx_xxpermdi16_le_V16QI"
-  [(set (match_operand:V16QI 0 "vsx_register_operand" "=wa")
-        (vec_select:V16QI
-          (match_operand:V16QI 1 "vsx_register_operand" "wa")
-          (parallel [(const_int 8) (const_int 9)
-                     (const_int 10) (const_int 11)
-                     (const_int 12) (const_int 13)
-                     (const_int 14) (const_int 15)
-                     (const_int 0) (const_int 1)
-                     (const_int 2) (const_int 3)
-                     (const_int 4) (const_int 5)
-                     (const_int 6) (const_int 7)])))]
-  "!BYTES_BIG_ENDIAN && VECTOR_MEM_VSX_P (V16QImode)"
-  "xxpermdi %x0,%x1,%x1,2"
-  [(set_attr "type" "vecperm")])
+	(vec_select:V8HI
+	  (match_operand:V8HI 1 "vsx_register_operand" "wa")
+	  (parallel [(const_int 4) (const_int 5)
+		     (const_int 6) (const_int 7)
+		     (const_int 0) (const_int 1)
+		     (const_int 2) (const_int 3)])))]
+   "TARGET_VSX"
+;; AIX does not support the extended mnemonic xxswapd.  Use the basic
+;; mnemonic xxpermdi instead.
+   "xxpermdi %x0,%x1,%x1,2"
+   [(set_attr "type" "vecperm")])
+
+(define_insn "xxswapd_<mode>"
+  [(set (match_operand:VSX_W 0 "vsx_register_operand" "=wa")
+	(vec_select:VSX_W
+	  (match_operand:VSX_W 1 "vsx_register_operand" "wa")
+	  (parallel [(const_int 2) (const_int 3)
+		     (const_int 0) (const_int 1)])))]
+   "TARGET_VSX"
+;; AIX does not support extended mnemonic xxswapd.  Use the basic
+;; mnemonic xxpermdi instead.
+   "xxpermdi %x0,%x1,%x1,2"
+   [(set_attr "type" "vecperm")])
 
 ;; lxvd2x for little endian loads.  We need several of
 ;; these since the form of the PARALLEL differs by mode.