Commit 644f0132 by Jakub Jelinek Committed by Jakub Jelinek

re PR target/82981 (unnecessary __multi3 call for mips64r6 linux kernel)

	PR target/82981
	* internal-fn.c (expand_mul_overflow): Use OPTAB_WIDEN instead of
	OPTAB_DIRECT in calls to expand_simple_binop.

From-SVN: r254986
parent b76602dc
2017-11-21 Jakub Jelinek <jakub@redhat.com>
PR target/82981
* internal-fn.c (expand_mul_overflow): Use OPTAB_WIDEN instead of
OPTAB_DIRECT in calls to expand_simple_binop.
2017-11-20 David Malcolm <dmalcolm@redhat.com> 2017-11-20 David Malcolm <dmalcolm@redhat.com>
PR c/81404 PR c/81404
...@@ -1760,7 +1760,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1760,7 +1760,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
tem = convert_modes (mode, hmode, lopart, 1); tem = convert_modes (mode, hmode, lopart, 1);
tem = expand_shift (LSHIFT_EXPR, mode, tem, hprec, NULL_RTX, 1); tem = expand_shift (LSHIFT_EXPR, mode, tem, hprec, NULL_RTX, 1);
tem = expand_simple_binop (mode, MINUS, loxhi, tem, NULL_RTX, tem = expand_simple_binop (mode, MINUS, loxhi, tem, NULL_RTX,
1, OPTAB_DIRECT); 1, OPTAB_WIDEN);
emit_move_insn (loxhi, tem); emit_move_insn (loxhi, tem);
emit_label (after_hipart_neg); emit_label (after_hipart_neg);
...@@ -1774,7 +1774,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1774,7 +1774,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
profile_probability::even ()); profile_probability::even ());
tem = expand_simple_binop (mode, MINUS, loxhi, larger, NULL_RTX, tem = expand_simple_binop (mode, MINUS, loxhi, larger, NULL_RTX,
1, OPTAB_DIRECT); 1, OPTAB_WIDEN);
emit_move_insn (loxhi, tem); emit_move_insn (loxhi, tem);
emit_label (after_lopart_neg); emit_label (after_lopart_neg);
...@@ -1783,7 +1783,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1783,7 +1783,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
/* loxhi += (uns) lo0xlo1 >> (bitsize / 2); */ /* loxhi += (uns) lo0xlo1 >> (bitsize / 2); */
tem = expand_shift (RSHIFT_EXPR, mode, lo0xlo1, hprec, NULL_RTX, 1); tem = expand_shift (RSHIFT_EXPR, mode, lo0xlo1, hprec, NULL_RTX, 1);
tem = expand_simple_binop (mode, PLUS, loxhi, tem, NULL_RTX, tem = expand_simple_binop (mode, PLUS, loxhi, tem, NULL_RTX,
1, OPTAB_DIRECT); 1, OPTAB_WIDEN);
emit_move_insn (loxhi, tem); emit_move_insn (loxhi, tem);
/* if (loxhi >> (bitsize / 2) /* if (loxhi >> (bitsize / 2)
...@@ -1810,7 +1810,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1810,7 +1810,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
convert_modes (hmode, mode, lo0xlo1, 1), 1); convert_modes (hmode, mode, lo0xlo1, 1), 1);
tem = expand_simple_binop (mode, IOR, loxhishifted, tem, res, tem = expand_simple_binop (mode, IOR, loxhishifted, tem, res,
1, OPTAB_DIRECT); 1, OPTAB_WIDEN);
if (tem != res) if (tem != res)
emit_move_insn (res, tem); emit_move_insn (res, tem);
emit_jump (done_label); emit_jump (done_label);
...@@ -1835,7 +1835,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1835,7 +1835,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
if (!op0_medium_p) if (!op0_medium_p)
{ {
tem = expand_simple_binop (hmode, PLUS, hipart0, const1_rtx, tem = expand_simple_binop (hmode, PLUS, hipart0, const1_rtx,
NULL_RTX, 1, OPTAB_DIRECT); NULL_RTX, 1, OPTAB_WIDEN);
do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode, do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode,
NULL_RTX, NULL, do_error, NULL_RTX, NULL, do_error,
profile_probability::very_unlikely ()); profile_probability::very_unlikely ());
...@@ -1844,7 +1844,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1, ...@@ -1844,7 +1844,7 @@ expand_mul_overflow (location_t loc, tree lhs, tree arg0, tree arg1,
if (!op1_medium_p) if (!op1_medium_p)
{ {
tem = expand_simple_binop (hmode, PLUS, hipart1, const1_rtx, tem = expand_simple_binop (hmode, PLUS, hipart1, const1_rtx,
NULL_RTX, 1, OPTAB_DIRECT); NULL_RTX, 1, OPTAB_WIDEN);
do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode, do_compare_rtx_and_jump (tem, const1_rtx, GTU, true, hmode,
NULL_RTX, NULL, do_error, NULL_RTX, NULL, do_error,
profile_probability::very_unlikely ()); profile_probability::very_unlikely ());
......
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