Commit 54890767 by Alan Modra Committed by Alan Modra

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
parent 2353515d
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> 2013-05-06 Oleg Endo <olegendo@gcc.gnu.org>
PR target/55303 PR target/55303
......
...@@ -2329,16 +2329,14 @@ ...@@ -2329,16 +2329,14 @@
{ {
word_high = change_address (dest, SImode, addr1); word_high = change_address (dest, SImode, addr1);
word_low = change_address (dest, SImode, addr2); word_low = change_address (dest, SImode, addr2);
emit_insn (gen_bswapsi2 (word_high, src_si));
emit_insn (gen_bswapsi2 (word_low, op3_si));
} }
else else
{ {
word_high = change_address (dest, SImode, addr2); word_high = change_address (dest, SImode, addr2);
word_low = change_address (dest, SImode, addr1); 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 (define_split
...@@ -6634,10 +6632,25 @@ ...@@ -6634,10 +6632,25 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r") [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
(ashiftrt:DI (match_operand:DI 1 "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")))] (match_operand:SI 2 "const_int_operand" "M,i")))]
"TARGET_32BIT && !TARGET_POWERPC64 && WORDS_BIG_ENDIAN" "!TARGET_POWERPC64"
"@ "*
srawi %0,%1,31\;srawi %L0,%1,%h2 {
srwi %L0,%L1,%h2\;insrwi %L0,%1,%h2,0\;srawi %0,%1,%h2" 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 "type" "two,three")
(set_attr "length" "8,12")]) (set_attr "length" "8,12")])
...@@ -7734,13 +7747,12 @@ ...@@ -7734,13 +7747,12 @@
[(set (match_operand:DI 0 "gpc_reg_operand" "") [(set (match_operand:DI 0 "gpc_reg_operand" "")
(ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "") (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
(match_operand:SI 2 "reg_or_cint_operand" "")))] (match_operand:SI 2 "reg_or_cint_operand" "")))]
"WORDS_BIG_ENDIAN" ""
" "
{ {
if (TARGET_POWERPC64) if (TARGET_POWERPC64)
; ;
else if (TARGET_32BIT && GET_CODE (operands[2]) == CONST_INT else if (GET_CODE (operands[2]) == CONST_INT)
&& WORDS_BIG_ENDIAN)
{ {
emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2])); emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2]));
DONE; DONE;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment