summaryrefslogtreecommitdiffstats
path: root/gcc/config/rs6000/spe.md
diff options
context:
space:
mode:
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2006-09-11 17:05:15 +0000
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2006-09-11 17:05:15 +0000
commit73f4dbb089f8be50016c301a0db8240d13d14f87 (patch)
tree54b7ed6d4f4b8e01fd0c7f174cecab5cd9ab019e /gcc/config/rs6000/spe.md
parent39d6b9c892d95d07bfcc1a7074dc0ea1cd861a3e (diff)
downloadppe42-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.md31
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)
OpenPOWER on IntegriCloud