On Mon, Jan 16, 2017 at 02:42:08PM +0800, Kito Cheng wrote:
> 2017-01-16 Kito Cheng <[email protected]>
> Kuan-Lin Chen <[email protected]>
>
> PR target/PR79079
> * gcc/internal-fn.c (expand_mul_overflow): Use convert_modes instead
> of
> gen_lowpart.
No gcc/ prefix in gcc/ChangeLog.
> @@ -1505,11 +1505,12 @@ expand_mul_overflow (location_t loc, tree lhs, tree
> arg0, tree arg1,
> if (loxhi >> (bitsize / 2) == 0 (if uns). */
> rtx hipartloxhi = expand_shift (RSHIFT_EXPR, mode, loxhi, hprec,
> NULL_RTX, 0);
> - hipartloxhi = gen_lowpart (hmode, hipartloxhi);
> + hipartloxhi = convert_modes (hmode, mode, hipartloxhi, uns);
While I think convert_modes on truncation should ignore the last argument,
given that the corresponding expand_shift uses ins of 0, I think
convert_modes should use 0 here too (the earlier convert_modes calls you've
added are fine).
> rtx signbitloxhi = const0_rtx;
> if (!uns)
> signbitloxhi = expand_shift (RSHIFT_EXPR, hmode,
> - gen_lowpart (hmode, loxhi),
> + convert_modes (hmode, mode,
> + loxhi, uns),
And here 0 as well (it is guarded by if (!uns) anyway, and it is what
expand_shift will use too).
> hprec - 1, NULL_RTX, 0);
>
> do_compare_rtx_and_jump (signbitloxhi, hipartloxhi, NE, true, hmode,
> @@ -1519,7 +1520,8 @@ expand_mul_overflow (location_t loc, tree lhs, tree
> arg0, tree arg1,
> /* res = (loxhi << (bitsize / 2)) | (hmode) lo0xlo1; */
> rtx loxhishifted = expand_shift (LSHIFT_EXPR, mode, loxhi, hprec,
> NULL_RTX, 1);
> - tem = convert_modes (mode, hmode, gen_lowpart (hmode, lo0xlo1), 1);
> + tem = convert_modes (mode, hmode,
> + convert_modes (hmode, mode, lo0xlo1, uns), 1);
And here 1.
Ok for trunk with those changes.
Jakub