diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 49f94fefaebe283f5f1a042cf9cde3d8f502dd58..2b717ebb5264017d7a0137f9f39caad955fd8eab 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-04-24  Ulrich Weigand  <uweigand@de.ibm.com>
+
+	* expmed.c (expand_mult_highpart_adjust): Do not assume OP1
+	is a CONST_INT.
+	(expand_mult_highpart_optab): Call expand_mult_highpart_adjust
+	with NARROW_OP1 instead of OP1.
+
 2004-04-24  Ulrich Weigand  <uweigand@de.ibm.com>
 
 	* config/host-linux.c (TRY_EMPTY_VM_SPACE): Define for __s390__
diff --git a/gcc/expmed.c b/gcc/expmed.c
index 3eb745465dad629676e5658334e51bc66b7ead09..54959799411c3f2966365d9334cb0adfdc8e372d 100644
--- a/gcc/expmed.c
+++ b/gcc/expmed.c
@@ -2841,7 +2841,6 @@ expand_mult_highpart_adjust (enum machine_mode mode, rtx adj_operand, rtx op0,
   rtx tem;
   enum rtx_code adj_code = unsignedp ? PLUS : MINUS;
 
-  op1 = gen_int_mode (INTVAL (op1), mode);
   tem = expand_shift (RSHIFT_EXPR, mode, op0,
 		      build_int_2 (GET_MODE_BITSIZE (mode) - 1, 0),
 		      NULL_RTX, 0);
@@ -2914,7 +2913,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
 			  unsignedp, OPTAB_DIRECT);
       if (tem)
 	/* We used the wrong signedness.  Adjust the result.  */
-	return expand_mult_highpart_adjust (mode, tem, op0, op1,
+	return expand_mult_highpart_adjust (mode, tem, op0, narrow_op1,
 					    tem, unsignedp);
     }
 
@@ -2954,7 +2953,7 @@ expand_mult_highpart_optab (enum machine_mode mode, rtx op0, rtx op1,
 	{
 	  tem = extract_high_half (mode, tem);
 	  /* We used the wrong signedness.  Adjust the result.  */
-	  return expand_mult_highpart_adjust (mode, tem, op0, op1,
+	  return expand_mult_highpart_adjust (mode, tem, op0, narrow_op1,
 					      target, unsignedp);
 	}
     }