diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8092a46e2bb44873b3523e0b7f8d85887233d6f2..567c4923f22f39a54644ee5a67a5db3fb40a4d3f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-08-10  David Edelsohn  <edelsohn@gnu.org>
+
+	* config/rs6000/predicates.md (indexed_or_indirect_address): New.
+	* config/rs6000/rs6000.md (prefetch): Remove operand 0 mode and
+	change predicate to indexed_or_indirect_address.
+
 2005-08-10  Richard Sandiford  <richard@codesourcery.com>
 
 	* config/arm/lib1funcs.asm (__aeabi_uidiv, __aeabi_idiv): New aliases.
diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md
index a5bad7bfcd4739a37e8ce696b36b1f4e59d30a8c..68c824a077f37d2180ca0d93072e40cfd41d095d 100644
--- a/gcc/config/rs6000/predicates.md
+++ b/gcc/config/rs6000/predicates.md
@@ -369,6 +369,14 @@
 		    || GET_CODE (XEXP (XEXP (op, 0), 1)) != CONST_INT
 		    || INTVAL (XEXP (XEXP (op, 0), 1)) % 4 == 0")))
 
+;; Return 1 if the operand is an indexed or indirect address.
+(define_predicate "indexed_or_indirect_address"
+  (and (match_operand 0 "address_operand")
+       (match_test "REG_P (op)
+		    || (GET_CODE (op) == PLUS
+			&& REG_P (XEXP (op, 0)) 
+			&& REG_P (XEXP (op, 1)))")))
+
 ;; Used for the destination of the fix_truncdfsi2 expander.
 ;; If stfiwx will be used, the result goes to memory; otherwise,
 ;; we're going to emit a store and a load of a subreg, so the dest is a
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 3cc613a82edc7fa8652ea8725852a4dd760a048b..05ff9bd3b4917667eed4aee4f9992745be9c372b 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -14016,7 +14016,7 @@
 }")
 
 (define_insn "prefetch"
-  [(prefetch (match_operand:V4SI 0 "address_operand" "p")
+  [(prefetch (match_operand 0 "indexed_or_indirect_address" "p")
 	     (match_operand:SI 1 "const_int_operand" "n")
 	     (match_operand:SI 2 "const_int_operand" "n"))]
   "TARGET_POWERPC"