rs6000.md (bswapdi 2nd splitter): Don't swap words twice for little-endian.

* config/rs6000/rs6000.md (bswapdi 2nd splitter): Don't swap words
	twice for little-endian.
	(ashrdi3_no_power, ashrdi3): Support little-endian.

From-SVN: r198618
This commit is contained in:
Alan Modra 2013-05-06 09:49:07 +09:30 committed by Alan Modra
parent 2353515daf
commit 54890767f6
2 changed files with 29 additions and 11 deletions

View File

@ -1,3 +1,9 @@
2013-05-06 Alan Modra <amodra@gmail.com>
* config/rs6000/rs6000.md (bswapdi 2nd splitter): Don't swap words
twice for little-endian.
(ashrdi3_no_power, ashrdi3): Support little-endian.
2013-05-06 Oleg Endo <olegendo@gcc.gnu.org>
PR target/55303

View File

@ -2329,16 +2329,14 @@
{
word_high = change_address (dest, SImode, addr1);
word_low = change_address (dest, SImode, addr2);
emit_insn (gen_bswapsi2 (word_high, src_si));
emit_insn (gen_bswapsi2 (word_low, op3_si));
}
else
{
word_high = change_address (dest, SImode, addr2);
word_low = change_address (dest, SImode, addr1);
emit_insn (gen_bswapsi2 (word_low, src_si));
emit_insn (gen_bswapsi2 (word_high, op3_si));
}
emit_insn (gen_bswapsi2 (word_high, src_si));
emit_insn (gen_bswapsi2 (word_low, op3_si));
}")
(define_split
@ -6634,10 +6632,25 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
(match_operand:SI 2 "const_int_operand" "M,i")))]
"TARGET_32BIT && !TARGET_POWERPC64 && WORDS_BIG_ENDIAN"
"@
srawi %0,%1,31\;srawi %L0,%1,%h2
srwi %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;srawi %0,%1,%h2"
"!TARGET_POWERPC64"
"*
{
switch (which_alternative)
{
default:
gcc_unreachable ();
case 0:
if (WORDS_BIG_ENDIAN)
return \"srawi %0,%1,31\;srawi %L0,%1,%h2\";
else
return \"srawi %L0,%L1,31\;srawi %0,%L1,%h2\";
case 1:
if (WORDS_BIG_ENDIAN)
return \"srwi %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;srawi %0,%1,%h2\";
else
return \"srwi %0,%1,%h2\;insrwi %0,%L1,%h2,0\;srawi %L0,%L1,%h2\";
}
}"
[(set_attr "type" "two,three")
(set_attr "length" "8,12")])
@ -7734,13 +7747,12 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "")
(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:SI 2 "reg_or_cint_operand" "")))]
"WORDS_BIG_ENDIAN"
""
"
{
if (TARGET_POWERPC64)
;
else if (TARGET_32BIT && GET_CODE (operands[2]) == CONST_INT
&& WORDS_BIG_ENDIAN)
else if (GET_CODE (operands[2]) == CONST_INT)
{
emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2]));
DONE;