diff options
author | dje <dje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-09-11 17:05:15 +0000 |
---|---|---|
committer | dje <dje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-09-11 17:05:15 +0000 |
commit | 73f4dbb089f8be50016c301a0db8240d13d14f87 (patch) | |
tree | 54b7ed6d4f4b8e01fd0c7f174cecab5cd9ab019e /gcc/config/rs6000/spe.md | |
parent | 39d6b9c892d95d07bfcc1a7074dc0ea1cd861a3e (diff) | |
download | ppe42-gcc-73f4dbb089f8be50016c301a0db8240d13d14f87.tar.gz ppe42-gcc-73f4dbb089f8be50016c301a0db8240d13d14f87.zip |
2006-09-11 Guenter Roeck <guenter@roeck-us.net>
David Edelsohn <edelsohn@gnu.org>
PR target/27287
* config/rs6000/spe.md (frob_df_di): Remove %H.
(frob_di_df): Remove %H. Change evmergelo to mr.
(frob_di_df_2): Remove %H. Change evldd to two loads.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@116850 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/rs6000/spe.md')
-rw-r--r-- | gcc/config/rs6000/spe.md | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/gcc/config/rs6000/spe.md b/gcc/config/rs6000/spe.md index 930c48a090c..1ac1a8492c1 100644 --- a/gcc/config/rs6000/spe.md +++ b/gcc/config/rs6000/spe.md @@ -2200,24 +2200,41 @@ (subreg:DF (match_operand:DI 1 "input_operand" "r,m") 0))] "TARGET_E500_DOUBLE" "@ - evmergelo %0,%H1,%L1 + evmergelo %0,%1,%L1 evldd%X1 %0,%y1") (define_insn "*frob_di_df" [(set (match_operand:DI 0 "nonimmediate_operand" "=&r") (subreg:DI (match_operand:DF 1 "input_operand" "r") 0))] - "TARGET_E500_DOUBLE" /*one of these can be an mr */ - "evmergehi %H0,%1,%1\;evmergelo %L0,%1,%1" + "TARGET_E500_DOUBLE" + "evmergehi %0,%1,%1\;mr %L0,%1" [(set_attr "length" "8")]) (define_insn "*frob_di_df_2" [(set (subreg:DF (match_operand:DI 0 "register_operand" "=&r,r") 0) (match_operand:DF 1 "input_operand" "r,m"))] "TARGET_E500_DOUBLE" - "@ - evmergehi %H0,%1,%1\;evmergelo %L0,%1,%1 - evldd%X1 %0,%y1" - [(set_attr "length" "8,4")]) + "* +{ + switch (which_alternative) + { + default: + gcc_unreachable (); + case 0: + return \"evmergehi %0,%1,%1\;mr %L0,%1\"; + case 1: + /* If the low-address word is used in the address, we must load + it last. Otherwise, load it first. Note that we cannot have + auto-increment in that case since the address register is + known to be dead. */ + if (refers_to_regno_p (REGNO (operands[0]), REGNO (operands[0]) + 1, + operands[1], 0)) + return \"{l|lwz} %L0,%L1\;{l|lwz} %0,%1\"; + else + return \"{l%U1%X1|lwz%U1%X1} %0,%1\;{l|lwz} %L0,%L1\"; + } +}" + [(set_attr "length" "8,8")]) (define_insn "*mov_sidf_e500_subreg0" [(set (subreg:SI (match_operand:DF 0 "register_operand" "+r") 0) |