rs6000: Improve *lt0 patterns
authorSegher Boessenkool <segher@kernel.crashing.org>
Fri, 3 Nov 2017 14:09:10 +0000 (15:09 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Fri, 3 Nov 2017 14:09:10 +0000 (15:09 +0100)
The rs6000 port currently has an *lt0_disi define_insn, setting the DI
result to whether the SI argument is negative or not.  It turns out the
generic optimisers cannot always figure out in the other cases either
that this is just a shift for us.  This patch adds patterns for all
four SI/DI combinations.

* config/rs6000/rs6000.md (*lt0_disi): Delete.
(*lt0_<mode>di, *lt0_<mode>si): New.

From-SVN: r254374

gcc/ChangeLog
gcc/config/rs6000/rs6000.md

index e8ebe14f1339e6247ce8c94256a4eb3b16037e42..561e3dae7c9178e3bee69462e68633a95ae7cba0 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-03  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000.md (*lt0_disi): Delete.
+       (*lt0_<mode>di, *lt0_<mode>si): New.
+
 2017-11-03  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.md (move_from_CR_ov_bit): Change condition to
index 3ad702daa062603cb8f5d63240a4b451ab1d3112..2ef028f93b329daf5d573d3d0374a548fa8ae00e 100644 (file)
 
 ; Special case for less-than-0.  We can do it with just one machine
 ; instruction, but the generic optimizers do not realise it is cheap.
-(define_insn "*lt0_disi"
-  [(set (match_operand:DI 0 "gpc_reg_operand" "=r")
-       (lt:DI (match_operand:SI 1 "gpc_reg_operand" "r")
-              (const_int 0)))]
+(define_insn "*lt0_<mode>di"
+  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+       (lt:GPR (match_operand:DI 1 "gpc_reg_operand" "r")
+               (const_int 0)))]
   "TARGET_POWERPC64"
+  "srdi %0,%1,63"
+  [(set_attr "type" "shift")])
+
+(define_insn "*lt0_<mode>si"
+  [(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
+       (lt:GPR (match_operand:SI 1 "gpc_reg_operand" "r")
+               (const_int 0)))]
+  ""
   "rlwinm %0,%1,1,31,31"
   [(set_attr "type" "shift")])