rs6000: Improve the load/store-with-update patterns (PR17108)

Many of these patterns only worked in 32-bit mode, and some only worked
in 64-bit mode.  This patch makes these use Pmode, fixing the PR.  On
the other hand, the stack updates have to use the same mode for the
stack pointer as for the value stored, so let's simplify that a bit.

Many of these patterns pass the wrong mode to
avoiding_indexed_address_p (it should be the mode of the datum
accessed, not the mode of the pointer).

Finally, I merge some patterns into one (using iterators).


	PR target/17108
	* config/rs6000/rs6000.c (rs6000_split_multireg_move): Adjust pattern
	name.
	(rs6000_emit_allocate_stack_1): Simplify condition.  Adjust pattern
	name.
	* config/rs6000/rs6000.md (bits): Add entries for SF and DF.
	(*movdi_update1): Use Pmode.
	(movdi_<mode>_update): Fix argument to avoiding_indexed_address_p.
	(movdi_<mode>_update_stack): Rename to ...
	(movdi_update_stack): ... this.  Fix comment.  Change condition. Don't
	use Pmode.
	(*movsi_update1): Use Pmode.
	(*movsi_update2): Use Pmode.
	(movsi_update): Rename to ...
	(movsi_<mode>_update): ... this.  Use Pmode.
	(movsi_update_stack): Fix condition.
	(*movhi_update1): Use Pmode.  Fix argument to
	avoiding_indexed_address_p.
	(*movhi_update2): Ditto.
	(*movhi_update3): Ditto.
	(*movhi_update4): Ditto.
	(*movqi_update1): Ditto.
	(*movqi_update2): Ditto.
	(*movqi_update3): Ditto.
	(*movsf_update1, *movdf_update1): Merge, rename to...
	(*mov<mode>_update1): This.  Use Pmode.  Fix argument to
	avoiding_indexed_address_p.  Add "size" attribute.
	(*movsf_update2, *movdf_update2): Merge, rename to...
	(*mov<mode>_update2): This.  Ditto.
	(*movsf_update3): Use Pmode.  Fix argument to
	avoiding_indexed_address_p.
	(*movsf_update4): Ditto.
	(allocate_stack): Simplify condition.  Adjust pattern names.

From-SVN: r270407
This commit is contained in:
Segher Boessenkool 2019-04-17 11:45:57 +02:00 committed by Segher Boessenkool
parent b39c686b82
commit 61943f94a0
3 changed files with 164 additions and 158 deletions

View File

@ -1,3 +1,39 @@
2019-04-17 Segher Boessenkool <segher@kernel.crashing.org>
PR target/17108
* config/rs6000/rs6000.c (rs6000_split_multireg_move): Adjust pattern
name.
(rs6000_emit_allocate_stack_1): Simplify condition. Adjust pattern
name.
* config/rs6000/rs6000.md (bits): Add entries for SF and DF.
(*movdi_update1): Use Pmode.
(movdi_<mode>_update): Fix argument to avoiding_indexed_address_p.
(movdi_<mode>_update_stack): Rename to ...
(movdi_update_stack): ... this. Fix comment. Change condition. Don't
use Pmode.
(*movsi_update1): Use Pmode.
(*movsi_update2): Use Pmode.
(movsi_update): Rename to ...
(movsi_<mode>_update): ... this. Use Pmode.
(movsi_update_stack): Fix condition.
(*movhi_update1): Use Pmode. Fix argument to
avoiding_indexed_address_p.
(*movhi_update2): Ditto.
(*movhi_update3): Ditto.
(*movhi_update4): Ditto.
(*movqi_update1): Ditto.
(*movqi_update2): Ditto.
(*movqi_update3): Ditto.
(*movsf_update1, *movdf_update1): Merge, rename to...
(*mov<mode>_update1): This. Use Pmode. Fix argument to
avoiding_indexed_address_p. Add "size" attribute.
(*movsf_update2, *movdf_update2): Merge, rename to...
(*mov<mode>_update2): This. Ditto.
(*movsf_update3): Use Pmode. Fix argument to
avoiding_indexed_address_p.
(*movsf_update4): Ditto.
(allocate_stack): Simplify condition. Adjust pattern names.
2019-04-17 Jakub Jelinek <jakub@redhat.com>
PR target/89093

View File

@ -24010,7 +24010,7 @@ rs6000_split_multireg_move (rtx dst, rtx src)
emit_insn (TARGET_32BIT
? (TARGET_POWERPC64
? gen_movdi_si_update (breg, breg, delta_rtx, nsrc)
: gen_movsi_update (breg, breg, delta_rtx, nsrc))
: gen_movsi_si_update (breg, breg, delta_rtx, nsrc))
: gen_movdi_di_update (breg, breg, delta_rtx, nsrc));
used_update = true;
}
@ -25486,16 +25486,16 @@ rs6000_emit_allocate_stack_1 (HOST_WIDE_INT size_int, rtx orig_sp)
size_rtx = tmp_reg;
}
if (Pmode == SImode)
if (TARGET_32BIT)
insn = emit_insn (gen_movsi_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
size_rtx,
orig_sp));
else
insn = emit_insn (gen_movdi_di_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
size_rtx,
orig_sp));
insn = emit_insn (gen_movdi_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
size_rtx,
orig_sp));
rtx par = PATTERN (insn);
gcc_assert (GET_CODE (par) == PARALLEL);
rtx set = XVECEXP (par, 0, 0);

View File

@ -563,7 +563,8 @@
(TI "q")])
;; How many bits in this mode?
(define_mode_attr bits [(QI "8") (HI "16") (SI "32") (DI "64")])
(define_mode_attr bits [(QI "8") (HI "16") (SI "32") (DI "64")
(SF "32") (DF "64")])
; DImode bits
(define_mode_attr dbits [(QI "56") (HI "48") (SI "32")])
@ -9083,13 +9084,13 @@
(define_insn "*movdi_update1"
[(set (match_operand:DI 3 "gpc_reg_operand" "=r,r")
(mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
(match_operand:DI 2 "reg_or_aligned_short_operand" "r,I"))))
(set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
(plus:DI (match_dup 1) (match_dup 2)))]
(mem:DI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_aligned_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_POWERPC64 && TARGET_UPDATE
&& (!avoiding_indexed_address_p (DImode)
|| !gpc_reg_operand (operands[2], DImode))"
|| !gpc_reg_operand (operands[2], Pmode))"
"@
ldux %3,%0,%2
ldu %3,%2(%0)"
@ -9099,12 +9100,12 @@
(define_insn "movdi_<mode>_update"
[(set (mem:DI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_aligned_short_operand" "r,I")))
(match_operand:P 2 "reg_or_aligned_short_operand" "r,I")))
(match_operand:DI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_POWERPC64 && TARGET_UPDATE
&& (!avoiding_indexed_address_p (Pmode)
&& (!avoiding_indexed_address_p (DImode)
|| !gpc_reg_operand (operands[2], Pmode)
|| (REG_P (operands[0])
&& REGNO (operands[0]) == STACK_POINTER_REGNUM))"
@ -9115,15 +9116,15 @@
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
;; This pattern is only conditional on TARGET_POWERPC64, as it is
;; This pattern is only conditional on TARGET_64BIT, as it is
;; needed for stack allocation, even if the user passes -mno-update.
(define_insn "movdi_<mode>_update_stack"
[(set (mem:DI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_aligned_short_operand" "r,I")))
(define_insn "movdi_update_stack"
[(set (mem:DI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0,0")
(match_operand:DI 2 "reg_or_aligned_short_operand" "r,I")))
(match_operand:DI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_POWERPC64"
(set (match_operand:DI 0 "gpc_reg_operand" "=b,b")
(plus:DI (match_dup 1) (match_dup 2)))]
"TARGET_64BIT"
"@
stdux %3,%0,%2
stdu %3,%2(%0)"
@ -9133,13 +9134,13 @@
(define_insn "*movsi_update1"
[(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
(mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(mem:SI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lwzux %3,%0,%2
lwzu %3,%2(%0)"
@ -9148,12 +9149,12 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movsi_update2"
[(set (match_operand:DI 3 "gpc_reg_operand" "=r")
(sign_extend:DI
(mem:SI (plus:DI (match_operand:DI 1 "gpc_reg_operand" "0")
(match_operand:DI 2 "gpc_reg_operand" "r")))))
(set (match_operand:DI 0 "gpc_reg_operand" "=b")
(plus:DI (match_dup 1) (match_dup 2)))]
[(set (match_operand:EXTSI 3 "gpc_reg_operand" "=r")
(sign_extend:EXTSI
(mem:SI (plus:P (match_operand:P 1 "gpc_reg_operand" "0")
(match_operand:P 2 "gpc_reg_operand" "r")))))
(set (match_operand:P 0 "gpc_reg_operand" "=b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_POWERPC64 && !avoiding_indexed_address_p (DImode)"
"lwaux %3,%0,%2"
[(set_attr "type" "load")
@ -9161,15 +9162,15 @@
(set_attr "update" "yes")
(set_attr "indexed" "yes")])
(define_insn "movsi_update"
[(set (mem:SI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
(define_insn "movsi_<mode>_update"
[(set (mem:SI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))
(match_operand:SI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode)
|| !gpc_reg_operand (operands[2], Pmode)
|| (REG_P (operands[0])
&& REGNO (operands[0]) == STACK_POINTER_REGNUM))"
"@
@ -9187,7 +9188,7 @@
(match_operand:SI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
""
"TARGET_32BIT"
"@
stwux %3,%0,%2
stwu %3,%2(%0)"
@ -9197,12 +9198,12 @@
(define_insn "*movhi_update1"
[(set (match_operand:HI 3 "gpc_reg_operand" "=r,r")
(mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(mem:HI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
&& (!avoiding_indexed_address_p (HImode)
|| !gpc_reg_operand (operands[2], SImode))"
"@
lhzux %3,%0,%2
@ -9212,15 +9213,15 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movhi_update2"
[(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
(zero_extend:SI
(mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
[(set (match_operand:EXTHI 3 "gpc_reg_operand" "=r,r")
(zero_extend:EXTHI
(mem:HI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (HImode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lhzux %3,%0,%2
lhzu %3,%2(%0)"
@ -9229,15 +9230,15 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movhi_update3"
[(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
(sign_extend:SI
(mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
[(set (match_operand:EXTHI 3 "gpc_reg_operand" "=r,r")
(sign_extend:EXTHI
(mem:HI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& !(avoiding_indexed_address_p (SImode)
&& gpc_reg_operand (operands[2], SImode))"
&& !(avoiding_indexed_address_p (HImode)
&& gpc_reg_operand (operands[2], Pmode))"
"@
lhaux %3,%0,%2
lhau %3,%2(%0)"
@ -9247,14 +9248,14 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movhi_update4"
[(set (mem:HI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
[(set (mem:HI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))
(match_operand:HI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (HImode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
sthux %3,%0,%2
sthu %3,%2(%0)"
@ -9264,13 +9265,13 @@
(define_insn "*movqi_update1"
[(set (match_operand:QI 3 "gpc_reg_operand" "=r,r")
(mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(mem:QI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (QImode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lbzux %3,%0,%2
lbzu %3,%2(%0)"
@ -9279,15 +9280,15 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movqi_update2"
[(set (match_operand:SI 3 "gpc_reg_operand" "=r,r")
(zero_extend:SI
(mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
[(set (match_operand:EXTQI 3 "gpc_reg_operand" "=r,r")
(zero_extend:EXTQI
(mem:QI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (QImode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lbzux %3,%0,%2
lbzu %3,%2(%0)"
@ -9296,14 +9297,14 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movqi_update3"
[(set (mem:QI (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
[(set (mem:QI (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))
(match_operand:QI 3 "gpc_reg_operand" "r,r"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (QImode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
stbux %3,%0,%2
stbu %3,%2(%0)"
@ -9311,47 +9312,49 @@
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
(define_insn "*movsf_update1"
[(set (match_operand:SF 3 "gpc_reg_operand" "=f,f")
(mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(define_insn "*mov<mode>_update1"
[(set (match_operand:SFDF 3 "gpc_reg_operand" "=<Ff>,<Ff>")
(mem:SFDF (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_HARD_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (<MODE>mode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lfsux %3,%0,%2
lfsu %3,%2(%0)"
lf<Fs>ux %3,%0,%2
lf<Fs>u %3,%2(%0)"
[(set_attr "type" "fpload")
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
(set_attr "indexed" "yes,no")
(set_attr "size" "<bits>")])
(define_insn "*movsf_update2"
[(set (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
(match_operand:SF 3 "gpc_reg_operand" "f,f"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(define_insn "*mov<mode>_update2"
[(set (mem:SFDF (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))
(match_operand:SFDF 3 "gpc_reg_operand" "<Ff>,<Ff>"))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_HARD_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (<MODE>mode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
stfsux %3,%0,%2
stfsu %3,%2(%0)"
stf<Fs>ux %3,%0,%2
stf<Fs>u %3,%2(%0)"
[(set_attr "type" "fpstore")
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
(set_attr "indexed" "yes,no")
(set_attr "size" "<bits>")])
(define_insn "*movsf_update3"
[(set (match_operand:SF 3 "gpc_reg_operand" "=r,r")
(mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(mem:SF (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_SOFT_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (SFmode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
lwzux %3,%0,%2
lwzu %3,%2(%0)"
@ -9360,14 +9363,14 @@
(set_attr "indexed" "yes,no")])
(define_insn "*movsf_update4"
[(set (mem:SF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
[(set (mem:SF (plus:P (match_operand:P 1 "gpc_reg_operand" "0,0")
(match_operand:P 2 "reg_or_short_operand" "r,I")))
(match_operand:SF 3 "gpc_reg_operand" "r,r"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
(set (match_operand:P 0 "gpc_reg_operand" "=b,b")
(plus:P (match_dup 1) (match_dup 2)))]
"TARGET_SOFT_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
&& (!avoiding_indexed_address_p (SFmode)
|| !gpc_reg_operand (operands[2], Pmode))"
"@
stwux %3,%0,%2
stwu %3,%2(%0)"
@ -9375,39 +9378,6 @@
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
(define_insn "*movdf_update1"
[(set (match_operand:DF 3 "gpc_reg_operand" "=d,d")
(mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I"))))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
"TARGET_HARD_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
"@
lfdux %3,%0,%2
lfdu %3,%2(%0)"
[(set_attr "type" "fpload")
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")
(set_attr "size" "64")])
(define_insn "*movdf_update2"
[(set (mem:DF (plus:SI (match_operand:SI 1 "gpc_reg_operand" "0,0")
(match_operand:SI 2 "reg_or_short_operand" "r,I")))
(match_operand:DF 3 "gpc_reg_operand" "d,d"))
(set (match_operand:SI 0 "gpc_reg_operand" "=b,b")
(plus:SI (match_dup 1) (match_dup 2)))]
"TARGET_HARD_FLOAT && TARGET_UPDATE
&& (!avoiding_indexed_address_p (SImode)
|| !gpc_reg_operand (operands[2], SImode))"
"@
stfdux %3,%0,%2
stfdu %3,%2(%0)"
[(set_attr "type" "fpstore")
(set_attr "update" "yes")
(set_attr "indexed" "yes,no")])
;; After inserting conditional returns we can sometimes have
;; unnecessary register moves. Unfortunately we cannot have a
@ -9771,14 +9741,14 @@
emit_stack_clash_protection_probe_loop_start (&loop_lab, &end_loop,
last_addr, rotated);
if (Pmode == SImode)
if (TARGET_32BIT)
emit_insn (gen_movsi_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
update, chain));
else
emit_insn (gen_movdi_di_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
update, chain));
emit_insn (gen_movdi_update_stack (stack_pointer_rtx,
stack_pointer_rtx,
update, chain));
emit_stack_clash_protection_probe_loop_end (loop_lab, end_loop,
last_addr, rotated);
}
@ -9802,7 +9772,7 @@
neg_op0 = GEN_INT (-INTVAL (operands[1]));
insn = emit_insn ((* ((TARGET_32BIT) ? gen_movsi_update_stack
: gen_movdi_di_update_stack))
: gen_movdi_update_stack))
(stack_pointer_rtx, stack_pointer_rtx, neg_op0,
chain));
/* Since we didn't use gen_frame_mem to generate the MEM, grab