aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2009-09-09 21:50:42 +0200
committerSegher Boessenkool <segher@gcc.gnu.org>2009-09-09 21:50:42 +0200
commit93fbf85741829968709ed17290ac5258eaee55d0 (patch)
tree23079ebfe511d345572cfeee65407df2eaae5c15 /gcc/config
parentc13e029be40bf6d2203c11dfdd79e3fd6625a102 (diff)
downloadgcc-93fbf85741829968709ed17290ac5258eaee55d0.zip
gcc-93fbf85741829968709ed17290ac5258eaee55d0.tar.gz
gcc-93fbf85741829968709ed17290ac5258eaee55d0.tar.bz2
rs6000.md (bswapdi2_64bit): Fix unnecessarily stringent constraints.
2009-09-08 Segher Boessenkool <segher@kernel.crashing.org> * config/rs6000/rs6000.md (bswapdi2_64bit): Fix unnecessarily stringent constraints. Fix address calculation in the splitters. From-SVN: r151575
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/rs6000/rs6000.md44
1 files changed, 24 insertions, 20 deletions
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index ea046d3..d7f30f8 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -2421,8 +2421,8 @@
[(set (match_operand:DI 0 "reg_or_mem_operand" "=&r,Z,??&r")
(bswap:DI (match_operand:DI 1 "reg_or_mem_operand" "Z,r,r")))
(clobber (match_scratch:DI 2 "=&b,&b,&r"))
- (clobber (match_scratch:DI 3 "=&b,&r,&r"))
- (clobber (match_scratch:DI 4 "=&b,X,&r"))]
+ (clobber (match_scratch:DI 3 "=&r,&r,&r"))
+ (clobber (match_scratch:DI 4 "=&r,X,&r"))]
"TARGET_POWERPC64 && !TARGET_LDBRX
&& (REG_P (operands[0]) || REG_P (operands[1]))"
"#"
@@ -2454,12 +2454,13 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_adddi3 (op2, XEXP (addr1, 0), GEN_INT (4)));
- addr1 = XEXP (addr1, 1);
+ addr2 = gen_rtx_PLUS (DImode, op2, XEXP (addr1, 1));
}
else
- emit_move_insn (op2, GEN_INT (4));
-
- addr2 = gen_rtx_PLUS (DImode, op2, addr1);
+ {
+ emit_move_insn (op2, GEN_INT (4));
+ addr2 = gen_rtx_PLUS (DImode, op2, addr1);
+ }
if (BYTES_BIG_ENDIAN)
{
@@ -2484,7 +2485,7 @@
(clobber (match_operand:DI 2 "gpc_reg_operand" ""))
(clobber (match_operand:DI 3 "gpc_reg_operand" ""))
(clobber (match_operand:DI 4 "" ""))]
- "TARGET_POWERPC64 && reload_completed && !TARGET_LDBRX"
+ "TARGET_POWERPC64 && !TARGET_LDBRX && reload_completed"
[(const_int 0)]
"
{
@@ -2503,12 +2504,13 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_adddi3 (op2, XEXP (addr1, 0), GEN_INT (4)));
- addr1 = XEXP (addr1, 1);
+ addr2 = gen_rtx_PLUS (DImode, op2, XEXP (addr1, 1));
}
else
- emit_move_insn (op2, GEN_INT (4));
-
- addr2 = gen_rtx_PLUS (DImode, op2, addr1);
+ {
+ emit_move_insn (op2, GEN_INT (4));
+ addr2 = gen_rtx_PLUS (DImode, op2, addr1);
+ }
emit_insn (gen_lshrdi3 (op3, src, GEN_INT (32)));
if (BYTES_BIG_ENDIAN)
@@ -2582,13 +2584,14 @@
addr1 = XEXP (src, 0);
if (GET_CODE (addr1) == PLUS)
{
- emit_insn (gen_adddi3 (op2, XEXP (addr1, 0), GEN_INT (4)));
- addr1 = XEXP (addr1, 1);
+ emit_insn (gen_addsi3 (op2, XEXP (addr1, 0), GEN_INT (4)));
+ addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
else
- emit_move_insn (op2, GEN_INT (4));
-
- addr2 = gen_rtx_PLUS (DImode, op2, addr1);
+ {
+ emit_move_insn (op2, GEN_INT (4));
+ addr2 = gen_rtx_PLUS (SImode, op2, addr1);
+ }
if (BYTES_BIG_ENDIAN)
{
@@ -2627,12 +2630,13 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_addsi3 (op2, XEXP (addr1, 0), GEN_INT (4)));
- addr1 = XEXP (addr1, 1);
+ addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
else
- emit_move_insn (op2, GEN_INT (4));
-
- addr2 = gen_rtx_PLUS (SImode, op2, addr1);
+ {
+ emit_move_insn (op2, GEN_INT (4));
+ addr2 = gen_rtx_PLUS (SImode, op2, addr1);
+ }
if (BYTES_BIG_ENDIAN)
{