re PR target/53199 (__builtin_bswap64 and __builtin_bswap32 generate errors if -mcpu=power6)

[gcc]
2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/53199
	* config/rs6000/rs6000.md (bswapdi splitters): If
	-mavoid-indexed-addresses (or -mcpu=power6 which sets it by
	default) is used, generate an alternate sequence that does not
	depend on using indexed addressing.

[gcc/testsuite]
2012-05-03  Michael Meissner  <meissner@linux.vnet.ibm.com>

	PR target/53199
	* gcc.target/powwerpc/pr53199.c: New file.

From-SVN: r187132
This commit is contained in:
Michael Meissner 2012-05-04 00:28:17 +00:00 committed by Michael Meissner
parent f0c1948ae7
commit 5bf44ebd21
4 changed files with 117 additions and 4 deletions

View File

@ -1,3 +1,14 @@
2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com>
Backport from the mainline
2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/53199
* config/rs6000/rs6000.md (bswapdi splitters): If
-mavoid-indexed-addresses (or -mcpu=power6 which sets it by
default) is used, generate an alternate sequence that does not
depend on using indexed addressing.
2012-05-03 David S. Miller <davem@davemloft.net>
PR target/52684

View File

@ -2551,7 +2551,18 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
addr2 = op2;
}
else
addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
}
else if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
addr2 = op2;
}
else
{
@ -2601,7 +2612,18 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
addr2 = op2;
}
else
addr2 = gen_rtx_PLUS (Pmode, op2, XEXP (addr1, 1));
}
else if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
addr2 = op2;
}
else
{
@ -2682,7 +2704,18 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
addr2 = op2;
}
else
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
else if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
addr2 = op2;
}
else
{
@ -2727,7 +2760,18 @@
if (GET_CODE (addr1) == PLUS)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 0), GEN_INT (4)));
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, XEXP (addr1, 1), op2));
addr2 = op2;
}
else
addr2 = gen_rtx_PLUS (SImode, op2, XEXP (addr1, 1));
}
else if (TARGET_AVOID_XFORM)
{
emit_insn (gen_add3_insn (op2, addr1, GEN_INT (4)));
addr2 = op2;
}
else
{

View File

@ -1,3 +1,11 @@
2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com>
Backport from mainline
2012-05-03 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/53199
* gcc.target/powwerpc/pr53199.c: New file.
2012-05-03 Martin Jambor <mjambor@suse.cz>
Backport from mainline

View File

@ -0,0 +1,50 @@
/* { dg-do compile { target { powerpc*-*-* } } } */
/* { dg-skip-if "" { powerpc*-*-darwin* } { "*" } { "" } } */
/* { dg-options "-O2 -mcpu=power6 -mavoid-indexed-addresses" } */
/* { dg-final { scan-assembler-times "lwbrx" 6 } } */
/* { dg-final { scan-assembler-times "stwbrx" 6 } } */
/* PR 51399: bswap gets an error if -mavoid-indexed-addresses was used in
creating the two lwbrx instructions. */
long long
load64_reverse_1 (long long *p)
{
return __builtin_bswap64 (*p);
}
long long
load64_reverse_2 (long long *p)
{
return __builtin_bswap64 (p[1]);
}
long long
load64_reverse_3 (long long *p, int i)
{
return __builtin_bswap64 (p[i]);
}
void
store64_reverse_1 (long long *p, long long x)
{
*p = __builtin_bswap64 (x);
}
void
store64_reverse_2 (long long *p, long long x)
{
p[1] = __builtin_bswap64 (x);
}
void
store64_reverse_3 (long long *p, long long x, int i)
{
p[i] = __builtin_bswap64 (x);
}
long long
reg_reverse (long long x)
{
return __builtin_bswap64 (x);
}