Commit 1230d7f8 by Richard Sandiford Committed by Richard Sandiford

re PR rtl-optimization/34959 (23_containers/bitset/ext/15361.cc fails for MIPS n64)

gcc/
	PR rtl-optimization/34959
	* optabs.c (expand_unop): In libcall notes, give ffs, clz, ctz,
	popcount and parity rtxes the same mode as their operand.
	Truncate or extend the result to the return value's mode
	if necessary.

From-SVN: r131863
parent 2f35df8c
2008-01-26 Richard Sandiford <rsandifo@nildram.co.uk> 2008-01-26 Richard Sandiford <rsandifo@nildram.co.uk>
PR rtl-optimization/34959
* optabs.c (expand_unop): In libcall notes, give ffs, clz, ctz,
popcount and parity rtxes the same mode as their operand.
Truncate or extend the result to the return value's mode
if necessary.
2008-01-26 Richard Sandiford <rsandifo@nildram.co.uk>
PR target/34981 PR target/34981
* config/mips/mips-protos.h (mips_expand_call): Return an rtx. * config/mips/mips-protos.h (mips_expand_call): Return an rtx.
* config/mips/mips.h (FIRST_PSEUDO_REGISTER): Rename FAKE_CALL_REGNO * config/mips/mips.h (FIRST_PSEUDO_REGISTER): Rename FAKE_CALL_REGNO
......
...@@ -3273,6 +3273,7 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target, ...@@ -3273,6 +3273,7 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target,
{ {
rtx insns; rtx insns;
rtx value; rtx value;
rtx eq_value;
enum machine_mode outmode = mode; enum machine_mode outmode = mode;
/* All of these functions return small values. Thus we choose to /* All of these functions return small values. Thus we choose to
...@@ -3292,8 +3293,12 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target, ...@@ -3292,8 +3293,12 @@ expand_unop (enum machine_mode mode, optab unoptab, rtx op0, rtx target,
end_sequence (); end_sequence ();
target = gen_reg_rtx (outmode); target = gen_reg_rtx (outmode);
emit_libcall_block (insns, target, value, eq_value = gen_rtx_fmt_e (unoptab->code, mode, op0);
gen_rtx_fmt_e (unoptab->code, outmode, op0)); if (GET_MODE_SIZE (outmode) < GET_MODE_SIZE (mode))
eq_value = simplify_gen_unary (TRUNCATE, outmode, eq_value, mode);
else if (GET_MODE_SIZE (outmode) > GET_MODE_SIZE (mode))
eq_value = simplify_gen_unary (ZERO_EXTEND, outmode, eq_value, mode);
emit_libcall_block (insns, target, value, eq_value);
return target; return target;
} }
......
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