--- gcc/config/i386/i386.md.jj	2012-11-13 16:46:04.859106102 +0100
+++ gcc/config/i386/i386.md	2012-11-14 20:31:24.440648957 +0100
@@ -16120,7 +16120,7 @@ (define_peephole2
 
 (define_expand "mov<mode>cc"
   [(set (match_operand:SWIM 0 "register_operand")
-	(if_then_else:SWIM (match_operand 1 "ordered_comparison_operator")
+	(if_then_else:SWIM (match_operand 1 "comparison_operator")
 			   (match_operand:SWIM 2 "<general_operand>")
 			   (match_operand:SWIM 3 "<general_operand>")))]
   ""
@@ -16237,7 +16237,7 @@ (define_split
 (define_expand "mov<mode>cc"
   [(set (match_operand:X87MODEF 0 "register_operand")
 	(if_then_else:X87MODEF
-	  (match_operand 1 "ix86_fp_comparison_operator")
+	  (match_operand 1 "comparison_operator")
 	  (match_operand:X87MODEF 2 "register_operand")
 	  (match_operand:X87MODEF 3 "register_operand")))]
   "(TARGET_80387 && TARGET_CMOVE)
--- gcc/config/i386/i386.c.jj	2012-11-14 20:26:37.000000000 +0100
+++ gcc/config/i386/i386.c	2012-11-14 20:45:54.304190855 +0100
@@ -19847,6 +19847,11 @@ ix86_expand_fp_movcc (rtx operands[])
       return true;
     }
 
+  if (GET_MODE (op0) == TImode
+      || (GET_MODE (op0) == DImode
+	  && !TARGET_64BIT))
+    return false;
+
   /* The floating point conditional move instructions don't directly
      support conditions resulting from a signed integer comparison.  */
 
