[PATCH] rs6000: Use xori for HTM builtins and vector compares

Segher Boessenkool segher@kernel.crashing.org
Tue Sep 9 19:29:00 GMT 2014


These patterns use subfic now.  subfic clobbers the carry.  Other code
already preferably uses xor.  Let's do the same here.

Bootstrapped and tested as usual, no regressions.  Is this okay to apply?


Segher


2014-09-09  Segher Boessenkool  <segher@kernel.crashing.org>

	* config/rs6000/htm.md (tabort, tabortdc, tabortdci, tabortwc,
	tabortwci, tbegin, tcheck, tend, trechkpt, treclaim, tsr): Use xor
	instead of minus.
	* config/rs6000/vector.md (cr6_test_for_zero_reverse,
	cr6_test_for_lt_reverse): Ditto.


---
 gcc/config/rs6000/htm.md    | 33 ++++++++++++++++++++++-----------
 gcc/config/rs6000/vector.md |  8 ++++++--
 2 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/gcc/config/rs6000/htm.md b/gcc/config/rs6000/htm.md
index 140212b..03948b1 100644
--- a/gcc/config/rs6000/htm.md
+++ b/gcc/config/rs6000/htm.md
@@ -55,7 +55,8 @@ (define_expand "tabort"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -81,7 +82,8 @@ (define_expand "tabortdc"
 	(eq:SI (match_dup 4)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 5)))]
+	(xor:SI (match_dup 5)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[4] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -109,7 +111,8 @@ (define_expand "tabortdci"
 	(eq:SI (match_dup 4)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 5)))]
+	(xor:SI (match_dup 5)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[4] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -137,7 +140,8 @@ (define_expand "tabortwc"
 	(eq:SI (match_dup 4)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 5)))]
+	(xor:SI (match_dup 5)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[4] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -165,7 +169,8 @@ (define_expand "tabortwci"
 	(eq:SI (match_dup 4)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 5)))]
+	(xor:SI (match_dup 5)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[4] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -209,7 +214,8 @@ (define_expand "tbegin"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -233,7 +239,8 @@ (define_expand "tcheck"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -257,7 +264,8 @@ (define_expand "tend"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -281,7 +289,8 @@ (define_expand "trechkpt"
 	(eq:SI (match_dup 1)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 2)))]
+	(xor:SI (match_dup 2)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[1] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -305,7 +314,8 @@ (define_expand "treclaim"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
@@ -329,7 +339,8 @@ (define_expand "tsr"
 	(eq:SI (match_dup 2)
 	       (const_int 0)))
    (set (match_operand:SI 0 "int_reg_operand" "")
-	(minus:SI (const_int 1) (match_dup 3)))]
+	(xor:SI (match_dup 3)
+		(const_int 1)))]
   "TARGET_HTM"
 {
   operands[2] = gen_rtx_REG (CCmode, CR0_REGNO);
diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md
index bfae244..237724e 100644
--- a/gcc/config/rs6000/vector.md
+++ b/gcc/config/rs6000/vector.md
@@ -686,7 +686,9 @@ (define_expand "cr6_test_for_zero_reverse"
   [(set (match_operand:SI 0 "register_operand" "=r")
 	(eq:SI (reg:CC 74)
 	       (const_int 0)))
-   (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
+   (set (match_dup 0)
+	(xor:SI (match_dup 0)
+		(const_int 1)))]
   "TARGET_ALTIVEC || TARGET_VSX"
   "")
 
@@ -701,7 +703,9 @@ (define_expand "cr6_test_for_lt_reverse"
   [(set (match_operand:SI 0 "register_operand" "=r")
 	(lt:SI (reg:CC 74)
 	       (const_int 0)))
-   (set (match_dup 0) (minus:SI (const_int 1) (match_dup 0)))]
+   (set (match_dup 0)
+	(xor:SI (match_dup 0)
+		(const_int 1)))]
   "TARGET_ALTIVEC || TARGET_VSX"
   "")
 
-- 
1.8.1.4



More information about the Gcc-patches mailing list