diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4bd40857b37f7b6699dfbacc9ea974565a4f4306..ff52771918fb9dc4915c24063019f0709abf76d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2002-07-11  John David Anglin  <dave@hiauly1.hia.nrc.ca>
+
+	* pa.md (adddi3): Change predicate of operand 2 to adddi3_operand
+	and delete code to force constant to register.
+	* pa-protos.h (adddi3_operand): Add prototype.
+	* pa.c (adddi3_operand): New function.
+
 2002-07-11  Roger Sayle  <roger@eyesopen.com>
 
 	* c-decl.c (duplicate_decls): Preserve the noreturn attribute on
diff --git a/gcc/config/pa/pa-protos.h b/gcc/config/pa/pa-protos.h
index a21a383a47ba77ed03bc4490c3617d4e39ae00e6..8f1c330203aa9f4b391673ee2b833da21db2a709 100644
--- a/gcc/config/pa/pa-protos.h
+++ b/gcc/config/pa/pa-protos.h
@@ -63,6 +63,7 @@ extern rtx legitimize_pic_address PARAMS ((rtx, enum machine_mode, rtx));
 extern struct rtx_def *gen_cmp_fp PARAMS ((enum rtx_code, rtx, rtx));
 extern void hppa_encode_label PARAMS ((rtx));
 extern int arith11_operand PARAMS ((rtx, enum machine_mode));
+extern int adddi3_operand PARAMS ((rtx, enum machine_mode));
 extern int symbolic_expression_p PARAMS ((rtx));
 extern int hppa_address_cost PARAMS ((rtx));
 extern int symbolic_memory_operand PARAMS ((rtx, enum machine_mode));
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index c06a7b45215aaf390be438e33cde92d601215abc..7619f2bd3631c903bd0ef7a4486aa0882c1224cc 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -578,6 +578,18 @@ arith11_operand (op, mode)
 	  || (GET_CODE (op) == CONST_INT && INT_11_BITS (op)));
 }
 
+/* Return truth value of whether OP can be used as an operand in a
+   adddi3 insn.  */
+int
+adddi3_operand (op, mode)
+     rtx op;
+     enum machine_mode mode;
+{
+  return (register_operand (op, mode)
+	  || (GET_CODE (op) == CONST_INT
+	      && (TARGET_64BIT ? INT_14_BITS (op) : INT_11_BITS (op))));
+}
+
 /* A constant integer suitable for use in a PRE_MODIFY memory
    reference.  */
 int
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 10c0462b4e469ab439f369dacb126f29ca4ddb78..73f2831c12d05020c03f45530d0e4c698a3f463a 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -3813,15 +3813,9 @@
 (define_expand "adddi3"
   [(set (match_operand:DI 0 "register_operand" "")
 	(plus:DI (match_operand:DI 1 "register_operand" "")
-		 (match_operand:DI 2 "arith_operand" "")))]
+		 (match_operand:DI 2 "adddi3_operand" "")))]
   ""
-  "
-{
-  if (!TARGET_64BIT
-      && GET_CODE (operands[2]) == CONST_INT
-      && !VAL_11_BITS_P (INTVAL (operands[2])))
-    operands[2] = force_reg (DImode, operands[2]);
-}")
+  "")
 
 (define_insn ""
   [(set (match_operand:DI 0 "register_operand" "=r")