+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
{
rtx insns;
rtx value;
+ rtx eq_value;
enum machine_mode outmode = mode;
/* All of these functions return small values. Thus we choose to
end_sequence ();
target = gen_reg_rtx (outmode);
- emit_libcall_block (insns, target, value,
- gen_rtx_fmt_e (unoptab->code, outmode, op0));
+ eq_value = gen_rtx_fmt_e (unoptab->code, mode, 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;
}