diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4af8dcfc48f86b31febff04a3a4a637d4ac039ac..31adda24fe3a51abcbc8425768d5f3b0c5a29d64 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2004-08-24  Richard Sandiford  <rsandifo@redhat.com>
+
+	* config/mips/mips.c (mips_gen_conditional_trap): Fix mode.
+	* config/mips/mips.md (*conditional_trap[sd]i): Name previously unnamed
+	patterns.  Redefine using :GPR.  Give the match_operator a mode.
+	Use '%2' rather than '%z2' for operand 2.
+
 2004-08-24  Richard Sandiford  <rsandifo@redhat.com>
 
 	* config/mips/mips.md (load_call[sd]i): Redefine using :P.  Add mode
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 5067324a05eab1e1128f6e8fe6573844190e176f..9f0bf68fadedb49a854c0320fee9cf56913a74cd 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -2578,20 +2578,20 @@ mips_gen_conditional_trap (rtx *operands)
     }
   if (cmp_code == GET_CODE (operands[0]))
     {
-      op0 = force_reg (mode, cmp_operands[0]);
+      op0 = cmp_operands[0];
       op1 = cmp_operands[1];
     }
   else
     {
-      op0 = force_reg (mode, cmp_operands[1]);
+      op0 = cmp_operands[1];
       op1 = cmp_operands[0];
     }
-  if (GET_CODE (op1) == CONST_INT && ! SMALL_INT (op1))
+  op0 = force_reg (mode, op0);
+  if (!arith_operand (op1, mode))
     op1 = force_reg (mode, op1);
 
   emit_insn (gen_rtx_TRAP_IF (VOIDmode,
-			      gen_rtx_fmt_ee (cmp_code, GET_MODE (operands[0]),
-					      op0, op1),
+			      gen_rtx_fmt_ee (cmp_code, mode, op0, op1),
 			      operands[1]));
 }
 
diff --git a/gcc/config/mips/mips.md b/gcc/config/mips/mips.md
index 251ec685700ebb8add87f490c1762b6e5bae85f1..46ec8cf1be1ced0f62ac335d51b2ad954735d8fd 100644
--- a/gcc/config/mips/mips.md
+++ b/gcc/config/mips/mips.md
@@ -396,7 +396,7 @@
   else
     return "break";
 }
-  [(set_attr "type"	"trap")])
+  [(set_attr "type" "trap")])
 
 (define_expand "conditional_trap"
   [(trap_if (match_operator 0 "comparison_operator"
@@ -404,7 +404,8 @@
 	    (match_operand 1 "const_int_operand"))]
   "ISA_HAS_COND_TRAP"
 {
-  if (operands[1] == const0_rtx)
+  if (GET_MODE_CLASS (GET_MODE (cmp_operands[0])) == MODE_INT
+      && operands[1] == const0_rtx)
     {
       mips_gen_conditional_trap (operands);
       DONE;
@@ -413,23 +414,14 @@
     FAIL;
 })
 
-(define_insn ""
-  [(trap_if (match_operator 0 "trap_comparison_operator"
-                            [(match_operand:SI 1 "reg_or_0_operand" "dJ")
-                             (match_operand:SI 2 "arith_operand" "dI")])
+(define_insn "*conditional_trap<mode>"
+  [(trap_if (match_operator:GPR 0 "trap_comparison_operator"
+				[(match_operand:GPR 1 "reg_or_0_operand" "dJ")
+				 (match_operand:GPR 2 "arith_operand" "dI")])
 	    (const_int 0))]
   "ISA_HAS_COND_TRAP"
-  "t%C0\t%z1,%z2"
-  [(set_attr "type"	"trap")])
-
-(define_insn ""
-  [(trap_if (match_operator 0 "trap_comparison_operator"
-                            [(match_operand:DI 1 "reg_or_0_operand" "dJ")
-                             (match_operand:DI 2 "arith_operand" "dI")])
-	    (const_int 0))]
-  "TARGET_64BIT && ISA_HAS_COND_TRAP"
-  "t%C0\t%z1,%z2"
-  [(set_attr "type"	"trap")])
+  "t%C0\t%z1,%2"
+  [(set_attr "type" "trap")])
 
 ;;
 ;;  ....................
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3bf74a06ffe3736addaaa63a990d348404eb5507..c49b14902ba33deb680521fd98c8f6264ceff83c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2004-08-24  Richard Sandiford  <rsandifo@redhat.com>
+
+	* gcc.c-torture/compile/iftrap-3.c: New test.
+
 2004-08-24  Paul Brook  <paul@codesourcery.com>
 
 	* gfortran.dg/entry_2.f90: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/iftrap-3.c b/gcc/testsuite/gcc.c-torture/compile/iftrap-3.c
new file mode 100644
index 0000000000000000000000000000000000000000..52278e145dbcfd81c370fc25ce7976b4015701bc
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/iftrap-3.c
@@ -0,0 +1,4 @@
+/* Check that the conditional_trap pattern handles floating-point
+   comparisons correctly.  */
+void f1 (float x, float y) { if (x == y) __builtin_trap (); }
+void f2 (double x, double y) { if (x == y) __builtin_trap (); }