re PR target/9348 ([HP-UX] error in int to unsigned long multiplication)

PR target/9348
	* expr.c (expand_expr_real) <MULT_EXPR>:  When performing widening
	multiplies with a multiplication of the wrong signedness, its the
	signedness of the multiplication that we've performed that needs to
	be passed to expand_mult_highpart_adjust.  Avoid emitting a nop-move
	if expand_mult_highpart_adjust places the result in target.

	* gcc.c-torture/execute/multdi-1.c: New test case.

From-SVN: r77192
This commit is contained in:
Roger Sayle 2004-02-03 21:31:00 +00:00 committed by Roger Sayle
parent a8c0bbc721
commit 888d65b5a8
4 changed files with 47 additions and 13 deletions

View File

@ -1,3 +1,12 @@
2004-02-03 Roger Sayle <roger@eyesopen.com>
PR target/9348
* expr.c (expand_expr_real) <MULT_EXPR>: When performing widening
multiplies with a multiplication of the wrong signedness, its the
signedness of the multiplication that we've performed that needs to
be passed to expand_mult_highpart_adjust. Avoid emitting a nop-move
if expand_mult_highpart_adjust places the result in target.
2004-02-03 Richard Henderson <rth@redhat.com>
* varasm.c (const_desc_rtx_sym_eq): Compare symbol strings.

View File

@ -7859,12 +7859,12 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
==
TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))))))
{
enum machine_mode innermode
= TYPE_MODE (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)));
optab other_optab = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
? smul_widen_optab : umul_widen_optab);
this_optab = (TREE_UNSIGNED (TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0)))
? umul_widen_optab : smul_widen_optab);
tree op0type = TREE_TYPE (TREE_OPERAND (TREE_OPERAND (exp, 0), 0));
enum machine_mode innermode = TYPE_MODE (op0type);
bool zextend_p = TREE_UNSIGNED (op0type);
optab other_optab = zextend_p ? smul_widen_optab : umul_widen_optab;
this_optab = zextend_p ? umul_widen_optab : smul_widen_optab;
if (mode == GET_MODE_WIDER_MODE (innermode))
{
if (this_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing)
@ -7882,7 +7882,7 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
else if (other_optab->handlers[(int) mode].insn_code != CODE_FOR_nothing
&& innermode == word_mode)
{
rtx htem;
rtx htem, hipart;
op0 = expand_expr (TREE_OPERAND (TREE_OPERAND (exp, 0), 0),
NULL_RTX, VOIDmode, 0);
if (TREE_CODE (TREE_OPERAND (exp, 1)) == INTEGER_CST)
@ -7895,12 +7895,12 @@ expand_expr_real (tree exp, rtx target, enum machine_mode tmode,
NULL_RTX, VOIDmode, 0);
temp = expand_binop (mode, other_optab, op0, op1, target,
unsignedp, OPTAB_LIB_WIDEN);
htem = expand_mult_highpart_adjust (innermode,
gen_highpart (innermode, temp),
op0, op1,
gen_highpart (innermode, temp),
unsignedp);
emit_move_insn (gen_highpart (innermode, temp), htem);
hipart = gen_highpart (innermode, temp);
htem = expand_mult_highpart_adjust (innermode, hipart,
op0, op1, hipart,
zextend_p);
if (htem != hipart)
emit_move_insn (hipart, htem);
return temp;
}
}

View File

@ -1,3 +1,8 @@
2004-02-03 Roger Sayle <roger@eyesopen.com>
PR target/9348
* gcc.c-torture/execute/multdi-1.c: New test case.
2004-02-03 Mark Mitchell <mark@codesourcery.com>
PR c++/13925

View File

@ -0,0 +1,20 @@
/* PR target/9348 */
#define u_l_l unsigned long long
#define l_l long long
l_l mpy_res;
u_l_l mpy (long a, long b)
{
return (u_l_l) a * (u_l_l) b;
}
int main(void)
{
mpy_res = mpy(1,-1);
if (mpy_res != -1LL)
abort ();
return 0;
}