--- a/external/gpl3/gcc/dist/libgcc/config/m68k/fpgnulib.c	Sun Sep 07 04:08:23 2025 +0000
+++ b/external/gpl3/gcc/dist/libgcc/config/m68k/fpgnulib.c	Sun Sep 07 19:20:57 2025 +1000
@@ -138,6 +138,7 @@ int
   return 0;
 }
 
+#ifndef LIBCSOFTFLOAT
 /* convert unsigned int to double */
 double
 __floatunsidf (unsigned long a1)
@@ -411,6 +412,7 @@ long
   return __fixdfsi (foo);
 }
 
+#endif
 #else /* EXTFLOAT */
 
 /* We do not need these routines for coldfire, as it has no extended
@@ -421,6 +423,7 @@ long
 
    We assume all numbers are normalized, don't do any rounding, etc.  */
 
+#ifndef LIBCSOFTFLOAT
 /* Prototypes for the above in case we use them.  */
 double __floatunsidf (unsigned long);
 double __floatsidf (long);
@@ -430,6 +433,7 @@ float __truncdfsf2 (double);
 long __fixdfsi (double);
 long __fixsfsi (float);
 long __cmpdf2 (double, double);
+#endif
 
 int
 __unordxf2(long double a, long double b)
@@ -447,6 +451,7 @@ int
   return 0;
 }
 
+#ifndef LIBCSOFTFLOAT
 /* convert double to long double */
 long double
 __extenddfxf2 (double d)
@@ -664,5 +669,6 @@ long
   return __cmpdf2 ((double) x1, (double) x2);
 }
 
+#endif
 #endif /* !__mcoldfire__ */
 #endif /* EXTFLOAT */
--- a/external/gpl3/gcc/lib/libgcc/Makefile.inc	Sun Sep 07 04:08:23 2025 +0000
+++ b/external/gpl3/gcc/lib/libgcc/Makefile.inc	Sun Sep 07 19:20:57 2025 +1000
@@ -153,6 +153,10 @@ CPICFLAGS:=
 BUILDSYMLINKS+=	${DIST}/libgcc/config/m68k/fpgnulib.c fpgnulib.c
 BUILDSYMLINKS+=	${DIST}/libgcc/config/m68k/fpgnulib.c xfgnulib.c
 CPPFLAGS.xfgnulib.c+=	-DEXTFLOAT=1
+.  if ${MKLIBCSOFTFLOAT} != "no"
+CPPFLAGS.fpgnulib.c+=-DLIBCSOFTFLOAT=1
+CPPFLAGS.xfgnulib.c+=-DLIBCSOFTFLOAT=1
+.  endif
 .endif
 
 ${LIB2FUNCS} ${LIB2FUNCS_ST}: ${.CURDIR}/Makefile
--- a/lib/libc/arch/m68k/Makefile.inc	Sun Sep 07 04:08:23 2025 +0000
+++ b/lib/libc/arch/m68k/Makefile.inc	Sun Sep 07 19:20:57 2025 +1000
@@ -7,9 +7,17 @@ ASM+=	_lwp_getprivate.S mremap.S
 CPPFLAGS+= -I.		# for assym.h
 
 .if ${MKSOFTFLOAT} != "no"
+.  if ${MKLIBCSOFTFLOAT} != "no"
+.  include <softfloat/Makefile.inc>
+CPPFLAGS+= -DSOFTFLOAT
+.    if ${SOFTFLOAT_BITS} == "32"
+CPPFLAGS+= -DSOFTFLOATBITS32
+.    endif
+.  else
 #CPPFLAGS+= -DSOFTFLOAT_NEED_FIXUNS
 CPPFLAGS+= -DSOFTFLOAT -DSOFTFLOATM68K_FOR_GCC
-.  include <softfloat/Makefile.inc>
+.include <softfloat/Makefile.fenv.inc>
+.  endif
 .elif ${MACHINE_ARCH} != "m68000"
 .PATH : ${ARCHDIR}/hardfloat
 .  include "${ARCHDIR}/hardfloat/Makefile.inc"
--- a/lib/libc/arch/m68k/gen/Makefile.inc	Sun Sep 07 04:08:23 2025 +0000
+++ b/lib/libc/arch/m68k/gen/Makefile.inc	Sun Sep 07 19:20:57 2025 +1000
@@ -23,8 +23,10 @@ SRCS+=	signbitl_ieee754.c
 .endif
 
 SRCS+=	ashlsi3.S ashrsi3.S \
-	lshlsi3.S lshrsi3.S \
-	negdf2.S negsf2.S
+	lshlsi3.S lshrsi3.S
+.if ${MKSOFTFLOAT} == "no" || ${MKLIBCSOFTFLOAT} != "no"
+SRCS+=	negdf2.S negsf2.S
+.endif
 SRCS+=	bswap16.S bswap32.S bswap64.S
 SRCS+=	_lwp.c
 CPPFLAGS._lwp.c	+= -D_LIBC_SOURCE
--- a/lib/libc/compiler_rt/Makefile.inc	Sun Sep 07 04:08:23 2025 +0000
+++ b/lib/libc/compiler_rt/Makefile.inc	Sun Sep 07 19:20:57 2025 +1000
@@ -118,13 +118,16 @@ GENERIC_SRCS+=	\
 	floatundidf.c \
 	floatundisf.c \
 	floatundixf.c \
-	negdf2.c \
-	negsf2.c \
 	powidf2.c \
 	powisf2.c \
 	powitf2.c \
 	powixf2.c
 
+.  if ${MKLIBCSOFTFLOAT} != "no" || ${MKSOFTFLOAT} == "no"
+GENERIC_SRCS+=	\
+	negdf2.c \
+	negsf2.c
+.  endif
 .endif # IEEE 754 only machines
 
 .if ${LIBC_MACHINE_ARCH} != "m68k"
--- a/lib/libc/softfloat/Makefile.inc	Sun Sep 07 04:08:23 2025 +0000
+++ b/lib/libc/softfloat/Makefile.inc	Sun Sep 07 19:20:57 2025 +1000
@@ -9,8 +9,7 @@ CPPFLAGS+=	-DSOFTFLOAT_FOR_GCC
 
 SRCS.softfloat= softfloat.c
 
-SRCS.softfloat+=fpgetround.c fpsetround.c fpgetmask.c fpsetmask.c \
-		fpgetsticky.c fpsetsticky.c
+.include <softfloat/Makefile.fenv.inc>
 
 .if !empty(LIBC_MACHINE_ARCH:Mearm*)
 SRCS.softfloat+=__aeabi_dcmpeq.c __aeabi_fcmpeq.c
--- a/lib/libc/softfloat/softfloat-specialize	Sun Sep 07 04:08:23 2025 +0000
+++ b/lib/libc/softfloat/softfloat-specialize	Sun Sep 07 19:20:57 2025 +1000
@@ -442,6 +442,7 @@ flag floatx80_is_signaling_nan( floatx80
 
 }
 
+#ifndef SOFTFLOAT_BITS32
 /*
 -------------------------------------------------------------------------------
 Returns the result of converting the extended double-precision floating-
@@ -505,6 +506,7 @@ static floatx80 propagateFloatx80NaN( fl
 }
 
 #endif
+#endif
 
 #ifdef FLOAT128
 
--- a/share/mk/bsd.own.mk	Sun Sep 07 04:08:23 2025 +0000
+++ b/share/mk/bsd.own.mk	Sun Sep 07 19:20:57 2025 +1000
@@ -1167,6 +1167,16 @@ MKSOFTFLOAT=	yes
 SOFTFLOAT_BITS=	32
 .endif
 
+MKSOFTFLOAT?=no
+#
+# Prefer libc's softfloat.c
+#
+.if ${MKSOFTFLOAT} != "no"
+MKLIBCSOFTFLOAT?= yes
+.else
+MKLIBCSOFTFLOAT= no
+.endif
+
 #
 # We want to build zfs only for amd64, aarch64 and sparc64 by default for now.
 #
--- /dev/null	2025-09-07 19:37:02.389644418 +1000
+++ src/lib/libc/softfloat/Makefile.fenv.inc	2025-09-07 16:44:48.194123662 +1000
@@ -0,0 +1,10 @@
+#	$NetBSD$
+
+.PATH:		${.CURDIR}/softfloat
+
+CPPFLAGS+=	-I${ARCHDIR}/softfloat -I${.CURDIR}/softfloat
+CPPFLAGS+=	-DSOFTFLOAT_FOR_GCC
+
+SRCS+=	fpgetround.c fpsetround.c fpgetmask.c fpsetmask.c \
+	fpgetsticky.c fpsetsticky.c
+
