amd64/115581: [fix] -mfancy-math-387 has no effect

Simun Mikecin numisemis at yahoo.com
Thu Aug 16 09:50:02 PDT 2007


>Number:         115581
>Category:       amd64
>Synopsis:       [fix] -mfancy-math-387 has no effect
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-amd64
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Aug 16 16:50:01 GMT 2007
>Closed-Date:
>Last-Modified:
>Originator:     Simun Mikecin
>Release:        FreeBSD/amd64 7-CURRENT
>Organization:
>Environment:
>Description:
32-bit compatibility libraries on FreeBSD/amd64 are compiled using -mfancy-math-387 gcc option. As stated in gcc(1):

       -mno-fancy-math-387
           Some 387 emulators do not support the "sin", "cos" and "sqrt"
           instructions for the 387.  Specify this option to avoid generating
           those instructions.  This option is the default on FreeBSD, OpenBSD
           and NetBSD.  This option is overridden when -march indicates that
           the target cpu will always have an FPU and so the instruction will
           not need emulation.  As of revision 2.6.1, these instructions are
           not generated unless you also use the -funsafe-math-optimizations
           switch.

So, using just -mfancy-math-387 has no effect. It should be used in combination with -funsafe-math-optimizations or it should not be used.

>How-To-Repeat:
double test(double x) {
  return sin(x);
}

Try to compile using:
gcc -m32 -S -mfancy-math-387 -funsafe-math-optimizations -O2 -march=athlon64 test.c

and with:
gcc -m32 -S -mfancy-math-387 -O2 -march=athlon64 test.c

There will be a difference in assembler output. First one will use machine instruction 'fsin' and the second one will use a libm routine called 'sin'.

>Fix:


Patch attached with submission follows:

--- Makefile.inc1.orig	Tue Jul 10 18:39:36 2007
+++ Makefile.inc1	Thu Aug 16 18:30:44 2007
@@ -238,7 +238,7 @@
 .else
 LIB32CPUTYPE=	${TARGET_CPUTYPE}
 .endif
-LIB32FLAGS=	-m32 -march=${LIB32CPUTYPE} -mfancy-math-387 -DCOMPAT_32BIT \
+LIB32FLAGS=	-m32 -march=${LIB32CPUTYPE} -mfancy-math-387 -funsafe-math-optimizations -DCOMPAT_32BIT \
 		-iprefix ${LIB32TMP}/usr/ \
 		-L${LIB32TMP}/usr/lib32 \
 		-B${LIB32TMP}/usr/lib32


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-amd64 mailing list