Commit 225220d6 by Segher Boessenkool Committed by Segher Boessenkool

rs6000: Fix *movsi_from_df (PR88892)

The memory store instructions (stfs[u][x], stxssp[x]) can result in
garbage if the value to be stored isn't already a valid single
precision floating point number.  So we cannot use this here.


	PR target/88892
	* config/rs6000/rs6000.md (*movsi_from_df): Allow only register
	operands.

From-SVN: r268083
parent 8b248c17
2019-01-18 Segher Boessenkool <segher@kernel.crashing.org>
PR target/88892
* config/rs6000/rs6000.md (*movsi_from_df): Allow only register
operands.
2019-01-18 Richard Biener <rguenther@suse.de> 2019-01-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/88903 PR tree-optimization/88903
......
...@@ -7014,24 +7014,19 @@ ...@@ -7014,24 +7014,19 @@
8, 4")]) 8, 4")])
;; Like movsi_from_sf, but combine a convert from DFmode to SFmode before ;; 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 ;; moving it to SImode. We cannot do a SFmode store without having to do the
;; conversion explicitly. If we are doing a register->register conversion, use ;; conversion explicitly since that doesn't work in most cases if the input
;; XSCVDPSP instead of XSCVDPSPN, since the former handles cases where the ;; isn't representable as SF. Use XSCVDPSP instead of XSCVDPSPN, since the
;; input will not fit in a SFmode, and the later assumes the value has already ;; former handles cases where the input will not fit in a SFmode, and the
;; been rounded. ;; latter assumes the value has already been rounded.
(define_insn "*movsi_from_df" (define_insn "*movsi_from_df"
[(set (match_operand:SI 0 "nonimmediate_operand" "=wa,m,wY,Z") [(set (match_operand:SI 0 "gpc_reg_operand" "=wa")
(unspec:SI [(float_truncate:SF (unspec:SI [(float_truncate:SF
(match_operand:DF 1 "gpc_reg_operand" "wa, f,wb,wa"))] (match_operand:DF 1 "gpc_reg_operand" "wa"))]
UNSPEC_SI_FROM_SF))] UNSPEC_SI_FROM_SF))]
"TARGET_NO_SF_SUBREG" "TARGET_NO_SF_SUBREG"
"@ "xscvdpsp %x0,%x1"
xscvdpsp %x0,%x1 [(set_attr "type" "fp")])
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 ;; Split a load of a large constant into the appropriate two-insn
;; sequence. ;; sequence.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment