[RFC] Provide SSE ABI/implementation of (some) libm routines on i386

Richard Guenther rguenther@suse.de
Thu Jul 7 16:49:00 GMT 2005


This patch provides libm on i386 with an extra set of libm routines
using SSE register calling conventions for float and double arguments.
This is useful together with GCC emitting calls to these functions
if compiling for an SSE2 machine with SSE math turned on (-fpmath=sse).
It hereby avoids costly moves between SSE registers and the i387 FP stack.

Of course the actual SSE implementation of the routines is lame at
the moment (just compile the generic ieee754 stuff with -fpmath=sse),
but libimf shipped with the Intel compiler shows you can get quite a
runtime speedup with proper implementations.

The patch depends on the gcc patch also provided here by reference
and is for general commenting only as if you like me to rather push
this into some internal gcc place like libgcc.

Thanks,
Richard.
-------------- next part --------------
Index: sysdeps/i386/fpu/Makefile
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/i386/fpu/Makefile,v
retrieving revision 1.1
diff -u -r1.1 Makefile
--- sysdeps/i386/fpu/Makefile	29 Apr 2003 07:14:48 -0000	1.1
+++ sysdeps/i386/fpu/Makefile	7 Jul 2005 08:59:38 -0000
@@ -1,3 +1,51 @@
 ifeq ($(subdir),math)
 $(objpfx)libm.so: $(elfobjdir)/ld.so
+
+libm-sysdep_routines += sse2_sin sse2_sincos32 sse2_dosincos sse2_branred \
+	sse2_mpa sse2_atan sse2_atan2 sse2_mpatan2 sse2_mpatan sse2_mpsqrt \
+	sse2_asin sse2_doasin sse2_exp sse2_slowexp sse2_log10 sse2_log \
+	sse2_mplog sse2_mpexp sse2_pow sse2_slowpow sse2_tan sse2_mptan \
+	sse2_halfulp
+SSE2BUILD-CFLAGS = -mfpmath=sse -msse2 -msseregparm
+CFLAGS-sse2_sin.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_sincos32.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_dosincos.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_branred.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mpa.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_atan.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_atan2.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mpatan2.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mpatan.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mpsqrt.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_asin.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_doasin.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_exp.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_slowexp.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_log10.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_log.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mplog.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mpexp.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_pow.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_slowpow.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_tan.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_mptan.c += $(SSE2BUILD-CFLAGS)
+CFLAGS-sse2_halfulp.c += $(SSE2BUILD-CFLAGS)
+
+libm-sysdep_routines += sse_sinf sse_cosf sse_atanf sse_atan2f \
+	sse_asinf sse_expf sse_log10f sse_logf sse_powf sse_tanf \
+	sse_rem_pio2f sse_k_rem_pio2f sse_t_exp
+SSEBUILD-CFLAGS = -mfpmath=sse -msse2 -msseregparm
+CFLAGS-sse_sinf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_cosf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_atanf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_atan2f.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_asinf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_expf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_log10f.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_logf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_powf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_tanf.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_rem_pio2f.c += $(SSEBUILD-CFLAGS)
+CFLAGS-sse_k_rem_pio2f.c += $(SSEBUILD-CFLAGS)
+
 endif
Index: sysdeps/i386/fpu/Versions
===================================================================
RCS file: /cvs/glibc/libc/sysdeps/i386/fpu/Versions,v
retrieving revision 1.1
diff -u -r1.1 Versions
--- sysdeps/i386/fpu/Versions	13 Jun 2000 23:43:27 -0000	1.1
+++ sysdeps/i386/fpu/Versions	7 Jul 2005 08:59:38 -0000
@@ -3,4 +3,17 @@
     # functions used in inline functions or macros
     __expl; __expm1l;
   }
+  GLIBC_2.4 {
+    __libm_sse2_acos; __libm_sse2_acosf;
+    __libm_sse2_asin; __libm_sse2_asinf;
+    __libm_sse2_atan2; __libm_sse2_atan2f;
+    __libm_sse2_atan; __libm_sse2_atanf;
+    __libm_sse2_cos; __libm_sse2_cosf;
+    __libm_sse2_exp; __libm_sse2_expf;
+    __libm_sse2_log10; __libm_sse2_log10f;
+    __libm_sse2_log; __libm_sse2_logf;
+    __libm_sse2_pow; __libm_sse2_powf;
+    __libm_sse2_sin; __lib__libm_sse2_sinf;
+    __libm_sse2_tan; __lib__libm_sse2_tanf;
+  }
 }
Index: sysdeps/i386/fpu/sse2_asin.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_asin.c
diff -N sysdeps/i386/fpu/sse2_asin.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_asin.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,7 @@
+#include "sse2_defines.h"
+
+#define __ieee754_asin __libm_sse2_asin
+#define __ieee754_acos __libm_sse2_acos
+
+#include "sysdeps/ieee754/dbl-64/e_asin.c"
+
Index: sysdeps/i386/fpu/sse2_atan.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_atan.c
diff -N sysdeps/i386/fpu/sse2_atan.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_atan.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,7 @@
+#include "sse2_defines.h"
+
+#define atan __libm_sse2_atan
+#define __signArctan __sse2_signArctan
+
+#include "sysdeps/ieee754/dbl-64/s_atan.c"
+
Index: sysdeps/i386/fpu/sse2_atan2.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_atan2.c
diff -N sysdeps/i386/fpu/sse2_atan2.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_atan2.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,6 @@
+#include "sse2_defines.h"
+
+#define __ieee754_atan2 __libm_sse2_atan2
+
+#include "sysdeps/ieee754/dbl-64/e_atan2.c"
+
Index: sysdeps/i386/fpu/sse2_branred.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_branred.c
diff -N sysdeps/i386/fpu/sse2_branred.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_branred.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/branred.c"
Index: sysdeps/i386/fpu/sse2_defines.h
===================================================================
RCS file: sysdeps/i386/fpu/sse2_defines.h
diff -N sysdeps/i386/fpu/sse2_defines.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_defines.h	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,73 @@
+#include "libc-symbols.h"
+#undef weak_alias
+#undef strong_alias
+#define weak_alias(a,b)
+#define strong_alias(a,b)
+
+/* sincos32.c */
+#define __mpsin __sse2_mpsin
+#define __mpcos __sse2_mpcos
+#define __mpsin1 __sse2_mpsin1
+#define __mpcos1 __sse2_mpcos1
+#define __mpranred __sse2_mpranred
+#define __cos32 __sse2_cos32
+#define __sin32 __sse2_sin32
+#define __c32 __sse2_c32
+
+/* dosincos.c */
+#define __dubsin __sse2_dubsin
+#define __docos __sse2_docos
+#define __dubcos __sse2_dubcos
+
+/* branred.c */
+#define __branred __sse2_branred
+
+/* mpa.c */
+#define __mcr __sse2_mcr
+#define __acr __sse2_acr
+#define __cr __sse2_cr
+#define __cpy __sse2_cpy
+#define __cpymn __sse2_cpymn
+#define __norm __sse2_norm
+#define __denorm __sse2_denorm
+#define __dbl_mp __sse2_dbl_mp
+#define __mp_dbl __sse2_mp_dbl
+#define __add __sse2_add
+#define __sub __sse2_sub
+#define __mul __sse2_mul
+#define __inv __sse2_inv
+#define __dvd __sse2_dvd
+
+/* mpsqrt.c */
+#define __mpsqrt __sse2_mpsqrt
+#define fastiroot __sse2_fastiroot
+
+/* mpatan.c */
+#define __mpatan __sse2_mpatan
+
+/* mpatan2.c */
+#define __mpatan2 __sse2_mpatan2
+
+/* doasin.c */
+#define __doasin __sse2_doasin
+
+/* slowexp.c */
+#define __slowexp __sse2_slowexp
+
+/* mplog.c */
+#define __mplog __sse2_mplog
+
+/* mpexp.c */
+#define __mpexp __sse2_mpexp
+
+/* e_exp.c */
+#define __exp1 __sse2_exp1
+
+/* slowpow.c */
+#define __slowpow __sse2_slowpow
+
+/* mptan.c */
+#define __mptan __sse2_mptan
+
+/* halfulp.c */
+#define __halfulp __sse2_halfulp
Index: sysdeps/i386/fpu/sse2_doasin.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_doasin.c
diff -N sysdeps/i386/fpu/sse2_doasin.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_doasin.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/doasin.c"
Index: sysdeps/i386/fpu/sse2_dosincos.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_dosincos.c
diff -N sysdeps/i386/fpu/sse2_dosincos.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_dosincos.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/dosincos.c"
Index: sysdeps/i386/fpu/sse2_exp.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_exp.c
diff -N sysdeps/i386/fpu/sse2_exp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_exp.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,6 @@
+#include "sse2_defines.h"
+
+#define __ieee754_exp __libm_sse2_exp
+
+#include "sysdeps/ieee754/dbl-64/e_exp.c"
+
Index: sysdeps/i386/fpu/sse2_halfulp.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_halfulp.c
diff -N sysdeps/i386/fpu/sse2_halfulp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_halfulp.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/halfulp.c"
Index: sysdeps/i386/fpu/sse2_log.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_log.c
diff -N sysdeps/i386/fpu/sse2_log.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_log.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse2_defines.h"
+
+#define __ieee754_log __libm_sse2_log
+
+#include "sysdeps/ieee754/dbl-64/e_log.c"
Index: sysdeps/i386/fpu/sse2_log10.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_log10.c
diff -N sysdeps/i386/fpu/sse2_log10.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_log10.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,6 @@
+#include "sse2_defines.h"
+
+#define __ieee754_log10 __libm_sse2_log10
+
+#include "sysdeps/ieee754/dbl-64/e_log10.c"
+
Index: sysdeps/i386/fpu/sse2_mpa.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mpa.c
diff -N sysdeps/i386/fpu/sse2_mpa.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mpa.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mpa.c"
Index: sysdeps/i386/fpu/sse2_mpatan.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mpatan.c
diff -N sysdeps/i386/fpu/sse2_mpatan.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mpatan.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mpatan.c"
Index: sysdeps/i386/fpu/sse2_mpatan2.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mpatan2.c
diff -N sysdeps/i386/fpu/sse2_mpatan2.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mpatan2.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mpatan2.c"
Index: sysdeps/i386/fpu/sse2_mpexp.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mpexp.c
diff -N sysdeps/i386/fpu/sse2_mpexp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mpexp.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mpexp.c"
Index: sysdeps/i386/fpu/sse2_mplog.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mplog.c
diff -N sysdeps/i386/fpu/sse2_mplog.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mplog.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mplog.c"
Index: sysdeps/i386/fpu/sse2_mpsqrt.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mpsqrt.c
diff -N sysdeps/i386/fpu/sse2_mpsqrt.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mpsqrt.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mpsqrt.c"
Index: sysdeps/i386/fpu/sse2_mptan.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_mptan.c
diff -N sysdeps/i386/fpu/sse2_mptan.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_mptan.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/mptan.c"
Index: sysdeps/i386/fpu/sse2_pow.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_pow.c
diff -N sysdeps/i386/fpu/sse2_pow.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_pow.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,6 @@
+#include "sse2_defines.h"
+
+#define __ieee754_pow __libm_sse2_pow
+
+#include "sysdeps/ieee754/dbl-64/e_pow.c"
+
Index: sysdeps/i386/fpu/sse2_sin.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_sin.c
diff -N sysdeps/i386/fpu/sse2_sin.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_sin.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,7 @@
+#include "sse2_defines.h"
+
+#define __sin __libm_sse2_sin
+#define __cos __libm_sse2_cos
+
+#include "sysdeps/ieee754/dbl-64/s_sin.c"
+
Index: sysdeps/i386/fpu/sse2_sincos32.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_sincos32.c
diff -N sysdeps/i386/fpu/sse2_sincos32.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_sincos32.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/sincos32.c"
Index: sysdeps/i386/fpu/sse2_slowexp.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_slowexp.c
diff -N sysdeps/i386/fpu/sse2_slowexp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_slowexp.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/slowexp.c"
Index: sysdeps/i386/fpu/sse2_slowpow.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_slowpow.c
diff -N sysdeps/i386/fpu/sse2_slowpow.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_slowpow.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse2_defines.h"
+#include "sysdeps/ieee754/dbl-64/slowpow.c"
Index: sysdeps/i386/fpu/sse2_tan.c
===================================================================
RCS file: sysdeps/i386/fpu/sse2_tan.c
diff -N sysdeps/i386/fpu/sse2_tan.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse2_tan.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,6 @@
+#include "sse2_defines.h"
+
+#define tan __libm_sse2_tan
+
+#include "sysdeps/ieee754/dbl-64/s_tan.c"
+
Index: sysdeps/i386/fpu/sse_acosf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_acosf.c
diff -N sysdeps/i386/fpu/sse_acosf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_acosf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_acosf __libm_sse2_acosf
+
+#include "sysdeps/ieee754/flt-32/e_acosf.c"
Index: sysdeps/i386/fpu/sse_asinf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_asinf.c
diff -N sysdeps/i386/fpu/sse_asinf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_asinf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_asinf __libm_sse2_asinf
+
+#include "sysdeps/ieee754/flt-32/e_asinf.c"
Index: sysdeps/i386/fpu/sse_atan2f.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_atan2f.c
diff -N sysdeps/i386/fpu/sse_atan2f.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_atan2f.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_atan2f __libm_sse2_atan2f
+
+#include "sysdeps/ieee754/flt-32/e_atan2f.c"
Index: sysdeps/i386/fpu/sse_atanf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_atanf.c
diff -N sysdeps/i386/fpu/sse_atanf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_atanf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __atanf __libm_sse2_atanf
+
+#include "sysdeps/ieee754/flt-32/s_atanf.c"
Index: sysdeps/i386/fpu/sse_cosf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_cosf.c
diff -N sysdeps/i386/fpu/sse_cosf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_cosf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __cosf __libm_sse2_cosf
+
+#include "sysdeps/ieee754/flt-32/s_cosf.c"
Index: sysdeps/i386/fpu/sse_defines.h
===================================================================
RCS file: sysdeps/i386/fpu/sse_defines.h
diff -N sysdeps/i386/fpu/sse_defines.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_defines.h	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,11 @@
+#include "libc-symbols.h"
+#undef weak_alias
+#undef strong_alias
+#define weak_alias(a,b)
+#define strong_alias(a,b)
+
+/* e_rem_pio2f.c */
+#define __ieee754_rem_pio2f __sse2_ieee754_rem_pio2f
+
+/* k_rem_pio2f.c */
+#define __kernel_rem_pio2f __sse2_kernel_rem_pio2f
Index: sysdeps/i386/fpu/sse_expf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_expf.c
diff -N sysdeps/i386/fpu/sse_expf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_expf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_expf __libm_sse2_expf
+
+#include "sysdeps/ieee754/flt-32/e_expf.c"
Index: sysdeps/i386/fpu/sse_k_rem_pio2f.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_k_rem_pio2f.c
diff -N sysdeps/i386/fpu/sse_k_rem_pio2f.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_k_rem_pio2f.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse_defines.h"
+#include "sysdeps/ieee754/flt-32/k_rem_pio2f.c"
Index: sysdeps/i386/fpu/sse_log10f.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_log10f.c
diff -N sysdeps/i386/fpu/sse_log10f.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_log10f.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_log10f __libm_sse2_log10f
+
+#include "sysdeps/ieee754/flt-32/e_log10f.c"
Index: sysdeps/i386/fpu/sse_logf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_logf.c
diff -N sysdeps/i386/fpu/sse_logf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_logf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_logf __libm_sse2_logf
+
+#include "sysdeps/ieee754/flt-32/e_logf.c"
Index: sysdeps/i386/fpu/sse_powf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_powf.c
diff -N sysdeps/i386/fpu/sse_powf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_powf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __ieee754_powf __libm_sse2_powf
+
+#include "sysdeps/ieee754/flt-32/e_powf.c"
Index: sysdeps/i386/fpu/sse_rem_pio2f.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_rem_pio2f.c
diff -N sysdeps/i386/fpu/sse_rem_pio2f.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_rem_pio2f.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,2 @@
+#include "sse_defines.h"
+#include "sysdeps/ieee754/flt-32/e_rem_pio2f.c"
Index: sysdeps/i386/fpu/sse_sinf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_sinf.c
diff -N sysdeps/i386/fpu/sse_sinf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_sinf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __sinf __libm_sse2_sinf
+
+#include "sysdeps/ieee754/flt-32/s_sinf.c"
Index: sysdeps/i386/fpu/sse_t_exp.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_t_exp.c
diff -N sysdeps/i386/fpu/sse_t_exp.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_t_exp.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1 @@
+#include "sysdeps/ieee754/dbl-64/t_exp.c"
Index: sysdeps/i386/fpu/sse_tanf.c
===================================================================
RCS file: sysdeps/i386/fpu/sse_tanf.c
diff -N sysdeps/i386/fpu/sse_tanf.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sysdeps/i386/fpu/sse_tanf.c	7 Jul 2005 08:59:39 -0000
@@ -0,0 +1,5 @@
+#include "sse_defines.h"
+
+#define __tanf __libm_sse2_tanf
+
+#include "sysdeps/ieee754/flt-32/s_tanf.c"
-------------- next part --------------
2005-07-06  Richard Guenther  <rguenther@suse.de>

	* config/i386/i386.opt: New target option -msseregparm.
	* config/i386/i386.c (override_options): Error out for
	-msseregparm but no SSE support.
	(ix86_function_sseregparm): Check for global sseregparm.
	* doc/invoke.texi: Document -msseregparm.

Index: gcc/gcc/config/i386/i386.c
===================================================================
*** gcc.orig/gcc/config/i386/i386.c
--- gcc/gcc/config/i386/i386.c
*************** override_options (void)
*** 1573,1578 ****
--- 1573,1583 ----
          target_flags |= MASK_NO_RED_ZONE;
      }
  
+   /* Accept -msseregparm only if at least SSE support is enabled.  */
+   if (TARGET_SSEREGPARM
+       && ! TARGET_SSE)
+     error ("-msseregparm used without SSE enabled");
+ 
    ix86_fpmath = TARGET_FPMATH_DEFAULT;
  
    if (ix86_fpmath_string != 0)
*************** ix86_function_sseregparm (tree type, tre
*** 1947,1954 ****
  {
    /* Use SSE registers to pass SFmode and DFmode arguments if requested
       by the sseregparm attribute.  */
!   if (type
!       && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type)))
      {
        if (!TARGET_SSE)
  	{
--- 1952,1960 ----
  {
    /* Use SSE registers to pass SFmode and DFmode arguments if requested
       by the sseregparm attribute.  */
!   if (TARGET_SSEREGPARM
!       || (type
! 	  && lookup_attribute ("sseregparm", TYPE_ATTRIBUTES (type))))
      {
        if (!TARGET_SSE)
  	{
Index: gcc/gcc/config/i386/i386.opt
===================================================================
*** gcc.orig/gcc/config/i386/i386.opt
--- gcc/gcc/config/i386/i386.opt
*************** msse3
*** 193,198 ****
--- 193,202 ----
  Target Report Mask(SSE3)
  Support MMX, SSE, SSE2 and SSE3 built-in functions and code generation
  
+ msseregparm
+ Target RejectNegative Mask(SSEREGPARM)
+ Use SSE register passing conventions for SF and DF mode
+ 
  msvr3-shlib
  Target Report Mask(SVR3_SHLIB)
  Uninitialized locals in .bss
Index: gcc/gcc/doc/invoke.texi
===================================================================
*** gcc.orig/gcc/doc/invoke.texi
--- gcc/gcc/doc/invoke.texi
*************** Objective-C and Objective-C++ Dialects}.
*** 513,520 ****
  -mmmx  -msse  -msse2 -msse3 -m3dnow @gol
  -mthreads  -mno-align-stringops  -minline-all-stringops @gol
  -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double @gol
! -m96bit-long-double  -mregparm=@var{num}  -momit-leaf-frame-pointer @gol
! -mno-red-zone -mno-tls-direct-seg-refs @gol
  -mcmodel=@var{code-model} @gol
  -m32  -m64}
  
--- 513,520 ----
  -mmmx  -msse  -msse2 -msse3 -m3dnow @gol
  -mthreads  -mno-align-stringops  -minline-all-stringops @gol
  -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double @gol
! -m96bit-long-double  -mregparm=@var{num}  -msseregparm @gol
! -momit-leaf-frame-pointer  -mno-red-zone -mno-tls-direct-seg-refs @gol
  -mcmodel=@var{code-model} @gol
  -m32  -m64}
  
*************** function by using the function attribute
*** 9025,9030 ****
--- 9025,9042 ----
  value, including any libraries.  This includes the system libraries and
  startup modules.
  
+ @item -msseregparm
+ @opindex msseregparm
+ Use SSE register passing conventions for float and double arguments
+ and return values.  You can control this behavior for a specific
+ function by using the function attribute @samp{sseregparm}.
+ @xref{Function Attributes}.
+ 
+ @strong{Warning:} if you use this switch then you must build all
+ modules with the same value, including any libraries.  This includes
+ the system libraries and startup modules.  Unless you know what you
+ are doing.
+ 
  @item -mpreferred-stack-boundary=@var{num}
  @opindex mpreferred-stack-boundary
  Attempt to keep the stack boundary aligned to a 2 raised to @var{num}


More information about the Libc-alpha mailing list