diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index cb18ad6ea5bdaf47d6e409f8e00ba1a77d30b45a..e013ceb39bf5cb669f1e51535dc99a0343b1f02d 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,4 +1,14 @@
-2004-06-15  Peter Barada  <peter@the-baradas.com>
+2004-06-16  Bernardo Innocenti  <bernie@develer.com>
+
+	PR target/13292
+	* config/m68k/m68k.h (TARGET_SWITCHES): Don't remove MASK_68040_ONLY
+	on -msoft-float.
+	(TARGET_FLT_EVAL_METHOD): Don't advertise extended precision for
+	68040 and soft-float.
+	* config/m68k/m68k.md (truncdfsf2): Explicitly require TARGET_68881
+	in the TARGET_68040_ONLY case.
+
+2004-06-16 Peter Barada  <peter@the-baradas.com>
 
 	* config/m68k/m68k.md (movsi_cfv4): New pattern to allow mov3q.
 	(movsi_cf): Make named, don't match TARGET_CFV4.
diff --git a/gcc/config/m68k/m68k.h b/gcc/config/m68k/m68k.h
index 8a0773088425a2e0a4f45d1ae1cfdaa2abdff937..17a69dddc330d7d51e7aea7cfd30c4d76b7b3ecb 100644
--- a/gcc/config/m68k/m68k.h
+++ b/gcc/config/m68k/m68k.h
@@ -257,7 +257,7 @@ extern int target_flags;
     { "noshort", - MASK_SHORT,						\
       N_("Consider type `int' to be 32 bits wide") },			\
     { "68881", MASK_68881, "" },					\
-    { "soft-float", - (MASK_68040_ONLY|MASK_68881),			\
+    { "soft-float", - MASK_68881,					\
       N_("Generate code with library calls for floating point") },	\
     { "68020-40", -(MASK_ALL_CF_BITS|MASK_68060|MASK_68040_ONLY),	\
       N_("Generate code for a 68040, without any new instructions") },	\
@@ -355,7 +355,7 @@ extern int target_flags;
 /* target machine storage layout */
 
 #define LONG_DOUBLE_TYPE_SIZE 96
-#define TARGET_FLT_EVAL_METHOD (TARGET_68040_ONLY ? 0 : 2)
+#define TARGET_FLT_EVAL_METHOD ((TARGET_68040_ONLY || ! TARGET_68881) ? 0 : 2)
 
 #define BITS_BIG_ENDIAN 1
 #define BYTES_BIG_ENDIAN 1
diff --git a/gcc/config/m68k/m68k.md b/gcc/config/m68k/m68k.md
index 2e24c113b2d24995682e0cf288ad90d8d1dae64e..fa3a39524c1964ae5346f6521038afc594ffb48c 100644
--- a/gcc/config/m68k/m68k.md
+++ b/gcc/config/m68k/m68k.md
@@ -1548,7 +1548,7 @@
   [(set (match_operand:SF 0 "nonimmediate_operand" "=f")
 	(float_truncate:SF
 	  (match_operand:DF 1 "general_operand" "fmG")))]
-  "TARGET_68040_ONLY"
+  "TARGET_68881 && TARGET_68040_ONLY"
 {
   if (FP_REG_P (operands[1]))
     return "f%$move%.x %1,%0";