aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuenter Roeck <guenter@roeck-us.net>2006-09-11 17:05:15 +0000
committerDavid Edelsohn <dje@gcc.gnu.org>2006-09-11 13:05:15 -0400
commitd29520088232b973624b0623763f0a9e307ef347 (patch)
tree54b7ed6d4f4b8e01fd0c7f174cecab5cd9ab019e
parent0c387be360e6ac258fc9293db42890d4b96ee276 (diff)
downloadgcc-d29520088232b973624b0623763f0a9e307ef347.zip
gcc-d29520088232b973624b0623763f0a9e307ef347.tar.gz
gcc-d29520088232b973624b0623763f0a9e307ef347.tar.bz2
re PR target/27287 (returning constant double)
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. Co-Authored-By: David Edelsohn <edelsohn@gnu.org> From-SVN: r116850
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rs6000/spe.md31
2 files changed, 32 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6790da2..22e113f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+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.
+
2006-09-11 Hideki Iwamoto <h-iwamoto@kit.hi-ho.ne.jp>
* doc/cpp.texi: Fix names of charset options.
diff --git a/gcc/config/rs6000/spe.md b/gcc/config/rs6000/spe.md
index 930c48a..1ac1a84 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)