rs6000.md (movsi_from_df): Optimize converting a DFmode to a SFmode...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Tue, 26 Sep 2017 18:12:33 +0000 (18:12 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Tue, 26 Sep 2017 18:12:33 +0000 (18:12 +0000)
2017-09-26  Michael Meissner  <meissner@linux.vnet.ibm.com>

* config/rs6000/rs6000.md (movsi_from_df): Optimize converting a
DFmode to a SFmode, and then needing to move the SFmode to a GPR
to use the XSCVDPSP instruction instead of FRSP and XSCVDPSPN.

From-SVN: r253210

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

index 9b5b9fc97298cdb3d40f93ba2dda5c58eb773f40..7c8ff6c20fd0e0fd55cdd366fcead20f40b15b7f 100644 (file)
@@ -11,7 +11,9 @@
        (movdi_from_sf_zero_ext): Likewise.
        (reload_gpr_from_vsxsf): Likewise.
        (p8_mfvsrd_4_disf): Delete, no longer used.
-
+       (movsi_from_df): Optimize converting a DFmode to a SFmode, and
+       then needing to move the SFmode to a GPR to use the XSCVDPSP
+       instruction instead of FRSP and XSCVDPSPN.
 
 2017-09-26  Martin Jambor  <mjambor@suse.cz>
 
index c91719f821f39e878997ab4e296415cd18911299..9b10e7fd44aa28b919f97ea2b439ce3643ff4973 100644 (file)
                "4,          4,           4,           4,        8,
                 8,          4")])
 
+;; Like movsi_from_sf, but combine a convert from DFmode to SFmode before
+;; moving it to SImode.  We can do a SFmode store without having to do the
+;; conversion explicitly.  If we are doing a register->register conversion, use
+;; XSCVDPSP instead of XSCVDPSPN, since the former handles cases where the
+;; input will not fit in a SFmode, and the later assumes the value has already
+;; been rounded.
+(define_insn "*movsi_from_df"
+  [(set (match_operand:SI 0 "nonimmediate_operand"         "=wa,m,wY,Z")
+       (unspec:SI [(float_truncate:SF
+                    (match_operand:DF 1 "gpc_reg_operand" "wa, f,wb,wa"))]
+                   UNSPEC_SI_FROM_SF))]
+
+  "TARGET_NO_SF_SUBREG"
+  "@
+   xscvdpsp %x0,%x1
+   stfs%U0%X0 %1,%0
+   stxssp %1,%0
+   stxsspx %x1,%y0"
+  [(set_attr "type"   "fp,fpstore,fpstore,fpstore")])
+
 ;; Split a load of a large constant into the appropriate two-insn
 ;; sequence.