diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b4606723808e12c31806d0046ab6689af493b87d..f5b81e05512ad86a9401c7d662c6c1761a19765e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2002-01-24  Aldy Hernandez  <aldyh@redhat.com>
+
+        * loop.c (emit_prefetch_instructions): Use the prefetch insn's
+        mode, not Pmode.
+
+        * builtins.c (expand_builtin_prefetch): Same.
+
 2002-01-24  Alexandre Oliva  <aoliva@redhat.com>
 
 	* config/sh/sh.md (sym_label2reg): Make sure all CONSTs have
diff --git a/gcc/builtins.c b/gcc/builtins.c
index 404bf46a0047e9a339a36422d505b1ec38dc084a..9d308aeaff08f09a1d950d9c8596fa41fdf937de 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -785,7 +785,8 @@ expand_builtin_prefetch (arglist)
   if (HAVE_prefetch)
     {
       if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
-	    (op0, Pmode))
+	    (op0,
+	     insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
         op0 = force_reg (Pmode, op0);
       emit_insn (gen_prefetch (op0, op1, op2));
     }
diff --git a/gcc/loop.c b/gcc/loop.c
index 3f874a8652ac85ddbf4ca43db68a8e2333ba6e9b..ebd59af59ff2d59e67d53ee8a46b60ff6bab3aca 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -4023,7 +4023,8 @@ emit_prefetch_instructions (loop)
 
 	      /* Make sure the address operand is valid for prefetch.  */
 	      if (! (*insn_data[(int)CODE_FOR_prefetch].operand[0].predicate)
-		    (loc, Pmode))
+		    (loc,
+		     insn_data[(int)CODE_FOR_prefetch].operand[0].mode))
 		loc = force_reg (Pmode, loc);
 	      emit_insn_before (gen_prefetch (loc, GEN_INT (info[i].write),
 		                              GEN_INT (3)),