This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
Re: [RFC PATCH] SPU single precision floating point macros and functions
- From: Patrick Mansfield <patmans at us dot ibm dot com>
- To: newlib at sourceware dot org, Jeff Johnston <jjohnstn at redhat dot com>
- Date: Wed, 25 Apr 2007 08:53:23 -0700
- Subject: Re: [RFC PATCH] SPU single precision floating point macros and functions
- References: <20070418164116.GA12543@us.ibm.com>
Jeff -
Did you have any comments on this?
-- Patrick Mansfield
On Wed, Apr 18, 2007 at 09:41:16AM -0700, Patrick Mansfield wrote:
> The SPU/cell single precision floating point does not support NANs or
> infinities, and is documented as such. This patch supplies SPU specific
> macros and functions for various single precision floating point nan,
> isfin, isfinite and fpclassify.
>
> There is a problem with the macros in ieeefp.h, in that we can't define
> them in machine ieeefp.h before the prototypes (like isnanf), this also
> means those prototypes are hidden behind macros if you include ieeefp.h,
> so the prototypes could be removed and the alternate macros put in
> machine/ieeefp.h, but that would still leave us with name space issues
> (when the machine one is included only via math.h).
>
> Do I need to keep the namespace clean when only ieeefp.h is included (i.e.
> don't supply isfinite, isinf, or isnan)? Then I need some __c99_
> prefix, something like I did with __ieeefp_ prefix, or ???
>
> Are the __ieeefp_ macro/overrides OK?
>
> Are locations of the default macro values OK? (left in their current
> files, math.h or ieeefp.h)?
>
> Thanks ...
>
> ChangeLog:
>
> 2007-04-17 Patrick Mansfield <patmans@us.ibm.com>
>
> * libc/include/ieeefp.h: use prefixed __ieeefp_ macros that can be
> overridden via machine/ieeefp.h.
> * libc/include/machine/ieeefp.h: Add SPU specific C99 and ieeefp
> macros for isnan and related macros.
> * libc/include/math.h: Allow C99 isfinite, isinf, and isnan to be
> overridden via machine/ieeefp.h.
> * libm/machine/spu/Makefile.am: Add new files.
> * libm/machine/spu/Makefile.in: Autogeneraate with new files.
> * libm/machine/spu/s_fpclassify.c: Add SPU specific __fpclassifyf,
> plus the same __fpclassifyd as in the common s_fpclassify.c.
> * libm/machine/spu/sf_finite.c: Add SPU specific finitef.
> * libm/machine/spu/sf_isinf.c: Add SPU specific isinff.
> * libm/machine/spu/sf_isinff.c: Add SPU specific __isinff.
> * libm/machine/spu/sf_isnan.c: Add SPU specific isnanf.
> * libm/machine/spu/sf_isnanf.c: Add SPU specific __isnanf.
> * libm/machine/spu/sf_nan.c: Add SPU specific nanf.
>
> Index: my-base-quilt/newlib/libc/include/machine/ieeefp.h
> ===================================================================
> --- my-base-quilt.orig/newlib/libc/include/machine/ieeefp.h
> +++ my-base-quilt/newlib/libc/include/machine/ieeefp.h
> @@ -75,8 +75,27 @@
>
> #ifdef __SPU__
> #define __IEEE_BIG_ENDIAN
> -#endif
>
> +#define isfinite(y) \
> + (__extension__ ({__typeof__(y) __y = (y); \
> + (sizeof (__y) == sizeof (float)) ? (1) : \
> + fpclassify(__y) != FP_INFINITE && fpclassify(__y) != FP_NAN;}))
> +#define isinf(x) \
> + (__extension__ ({__typeof__(x) __x = (x); \
> + (sizeof (__x) == sizeof (float)) ? (0) : __isinfd(__x);}))
> +#define isnan(x) \
> + (__extension__ ({__typeof__(x) __x = (x); \
> + (sizeof (__x) == sizeof (float)) ? (0) : __isnand(__x);}))
> +
> +/*
> + * Macros for use in ieeefp.h. We can't just define the real ones here
> + * (like those above) as we have name space issues when this is *not*
> + * included via generic the ieeefp.h.
> + */
> +#define __ieeefp_isnanf(x) 0
> +#define __ieeefp_isinff(x) 0
> +#define __ieeefp_finitef(x) 1
> +#endif
>
> #ifdef __sparc__
> #ifdef __LITTLE_ENDIAN_DATA__
> Index: my-base-quilt/newlib/libc/include/math.h
> ===================================================================
> --- my-base-quilt.orig/newlib/libc/include/math.h
> +++ my-base-quilt/newlib/libc/include/math.h
> @@ -131,21 +131,29 @@ extern int __signbitd (double x);
> (__extension__ ({__typeof__(x) __x = (x); \
> (sizeof (__x) == sizeof (float)) ? __fpclassifyf(__x) : __fpclassifyd(__x);}))
>
> +#ifndef isfinite
> #define isfinite(y) \
> (__extension__ ({__typeof__(y) __y = (y); \
> fpclassify(__y) != FP_INFINITE && fpclassify(__y) != FP_NAN;}))
> +#endif
>
> /* Note: isinf and isnan were once functions in newlib that took double
> * arguments. C99 specifies that these names are reserved for macros
> * supporting multiple floating point types. Thus, they are
> * now defined as macros. Implementations of the old functions
> * taking double arguments still exist for compatibility purposes. */
> +#ifndef isinf
> #define isinf(x) \
> (__extension__ ({__typeof__(x) __x = (x); \
> (sizeof (__x) == sizeof (float)) ? __isinff(__x) : __isinfd(__x);}))
> +#endif
> +
> +#ifndef isnan
> #define isnan(x) \
> (__extension__ ({__typeof__(x) __x = (x); \
> (sizeof (__x) == sizeof (float)) ? __isnanf(__x) : __isnand(__x);}))
> +#endif
> +
> #define isnormal(y) (fpclassify(y) == FP_NORMAL)
> #define signbit(x) \
> (__extension__ ({__typeof__(x) __x = (x); \
> Index: my-base-quilt/newlib/libm/machine/spu/Makefile.am
> ===================================================================
> --- my-base-quilt.orig/newlib/libm/machine/spu/Makefile.am
> +++ my-base-quilt/newlib/libm/machine/spu/Makefile.am
> @@ -8,7 +8,9 @@ INCLUDES = -I $(newlib_basedir)/../newli
> LIB_SOURCES = \
> feclearexcept.c fe_dfl_env.c fegetenv.c fegetexceptflag.c \
> fegetround.c feholdexcept.c feraiseexcept.c fesetenv.c \
> - fesetexceptflag.c fesetround.c fetestexcept.c feupdateenv.c
> + fesetexceptflag.c fesetround.c fetestexcept.c feupdateenv.c \
> + sf_finite.c sf_isinf.c sf_isinff.c sf_isnanf.c sf_isnan.c sf_nan.c \
> + s_fpclassify.c
>
> noinst_LIBRARIES = lib.a
> lib_a_SOURCES = $(LIB_SOURCES)
> Index: my-base-quilt/newlib/libm/machine/spu/Makefile.in
> ===================================================================
> --- my-base-quilt.orig/newlib/libm/machine/spu/Makefile.in
> +++ my-base-quilt/newlib/libm/machine/spu/Makefile.in
> @@ -47,7 +47,11 @@ DIST_COMMON = $(srcdir)/../../../Makefil
> $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> - $(srcdir)/../../../../compile $(srcdir)/../../../../compile
> + $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> + $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> + $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> + $(srcdir)/../../../../compile $(srcdir)/../../../../compile \
> + $(srcdir)/../../../../compile
> subdir = .
> ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
> am__aclocal_m4_deps = $(top_srcdir)/../../../acinclude.m4 \
> @@ -68,7 +72,10 @@ am__objects_1 = lib_a-feclearexcept.$(OB
> lib_a-feholdexcept.$(OBJEXT) lib_a-feraiseexcept.$(OBJEXT) \
> lib_a-fesetenv.$(OBJEXT) lib_a-fesetexceptflag.$(OBJEXT) \
> lib_a-fesetround.$(OBJEXT) lib_a-fetestexcept.$(OBJEXT) \
> - lib_a-feupdateenv.$(OBJEXT)
> + lib_a-feupdateenv.$(OBJEXT) lib_a-sf_finite.$(OBJEXT) \
> + lib_a-sf_isinf.$(OBJEXT) lib_a-sf_isinff.$(OBJEXT) \
> + lib_a-sf_isnanf.$(OBJEXT) lib_a-sf_isnan.$(OBJEXT) \
> + lib_a-sf_nan.$(OBJEXT) lib_a-s_fpclassify.$(OBJEXT)
> am_lib_a_OBJECTS = $(am__objects_1)
> lib_a_OBJECTS = $(am_lib_a_OBJECTS)
> DEFAULT_INCLUDES = -I. -I$(srcdir)
> @@ -143,11 +150,6 @@ STRIP = @STRIP@
> USE_LIBTOOL_FALSE = @USE_LIBTOOL_FALSE@
> USE_LIBTOOL_TRUE = @USE_LIBTOOL_TRUE@
> VERSION = @VERSION@
> -ac_ct_AR = @ac_ct_AR@
> -ac_ct_AS = @ac_ct_AS@
> -ac_ct_RANLIB = @ac_ct_RANLIB@
> -ac_ct_READELF = @ac_ct_READELF@
> -ac_ct_STRIP = @ac_ct_STRIP@
> aext = @aext@
> am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
> am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
> @@ -163,18 +165,23 @@ build_cpu = @build_cpu@
> build_os = @build_os@
> build_vendor = @build_vendor@
> datadir = @datadir@
> +datarootdir = @datarootdir@
> +docdir = @docdir@
> +dvidir = @dvidir@
> exec_prefix = @exec_prefix@
> host = @host@
> host_alias = @host_alias@
> host_cpu = @host_cpu@
> host_os = @host_os@
> host_vendor = @host_vendor@
> +htmldir = @htmldir@
> includedir = @includedir@
> infodir = @infodir@
> install_sh = @install_sh@
> libdir = @libdir@
> libexecdir = @libexecdir@
> libm_machine_dir = @libm_machine_dir@
> +localedir = @localedir@
> localstatedir = @localstatedir@
> lpfx = @lpfx@
> machine_dir = @machine_dir@
> @@ -183,8 +190,10 @@ mkdir_p = @mkdir_p@
> newlib_basedir = @newlib_basedir@
> oext = @oext@
> oldincludedir = @oldincludedir@
> +pdfdir = @pdfdir@
> prefix = @prefix@
> program_transform_name = @program_transform_name@
> +psdir = @psdir@
> sbindir = @sbindir@
> sharedstatedir = @sharedstatedir@
> sys_dir = @sys_dir@
> @@ -197,7 +206,9 @@ INCLUDES = -I $(newlib_basedir)/../newli
> LIB_SOURCES = \
> feclearexcept.c fe_dfl_env.c fegetenv.c fegetexceptflag.c \
> fegetround.c feholdexcept.c feraiseexcept.c fesetenv.c \
> - fesetexceptflag.c fesetround.c fetestexcept.c feupdateenv.c
> + fesetexceptflag.c fesetround.c fetestexcept.c feupdateenv.c \
> + sf_finite.c sf_isinf.c sf_isinff.c sf_isnanf.c sf_isnan.c sf_nan.c \
> + s_fpclassify.c
>
> noinst_LIBRARIES = lib.a
> lib_a_SOURCES = $(LIB_SOURCES)
> @@ -334,6 +345,48 @@ lib_a-feupdateenv.o: feupdateenv.c
>
> lib_a-feupdateenv.obj: feupdateenv.c
> $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-feupdateenv.obj `if test -f 'feupdateenv.c'; then $(CYGPATH_W) 'feupdateenv.c'; else $(CYGPATH_W) '$(srcdir)/feupdateenv.c'; fi`
> +
> +lib_a-sf_finite.o: sf_finite.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_finite.o `test -f 'sf_finite.c' || echo '$(srcdir)/'`sf_finite.c
> +
> +lib_a-sf_finite.obj: sf_finite.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_finite.obj `if test -f 'sf_finite.c'; then $(CYGPATH_W) 'sf_finite.c'; else $(CYGPATH_W) '$(srcdir)/sf_finite.c'; fi`
> +
> +lib_a-sf_isinf.o: sf_isinf.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isinf.o `test -f 'sf_isinf.c' || echo '$(srcdir)/'`sf_isinf.c
> +
> +lib_a-sf_isinf.obj: sf_isinf.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isinf.obj `if test -f 'sf_isinf.c'; then $(CYGPATH_W) 'sf_isinf.c'; else $(CYGPATH_W) '$(srcdir)/sf_isinf.c'; fi`
> +
> +lib_a-sf_isinff.o: sf_isinff.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isinff.o `test -f 'sf_isinff.c' || echo '$(srcdir)/'`sf_isinff.c
> +
> +lib_a-sf_isinff.obj: sf_isinff.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isinff.obj `if test -f 'sf_isinff.c'; then $(CYGPATH_W) 'sf_isinff.c'; else $(CYGPATH_W) '$(srcdir)/sf_isinff.c'; fi`
> +
> +lib_a-sf_isnanf.o: sf_isnanf.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isnanf.o `test -f 'sf_isnanf.c' || echo '$(srcdir)/'`sf_isnanf.c
> +
> +lib_a-sf_isnanf.obj: sf_isnanf.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isnanf.obj `if test -f 'sf_isnanf.c'; then $(CYGPATH_W) 'sf_isnanf.c'; else $(CYGPATH_W) '$(srcdir)/sf_isnanf.c'; fi`
> +
> +lib_a-sf_isnan.o: sf_isnan.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isnan.o `test -f 'sf_isnan.c' || echo '$(srcdir)/'`sf_isnan.c
> +
> +lib_a-sf_isnan.obj: sf_isnan.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_isnan.obj `if test -f 'sf_isnan.c'; then $(CYGPATH_W) 'sf_isnan.c'; else $(CYGPATH_W) '$(srcdir)/sf_isnan.c'; fi`
> +
> +lib_a-sf_nan.o: sf_nan.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_nan.o `test -f 'sf_nan.c' || echo '$(srcdir)/'`sf_nan.c
> +
> +lib_a-sf_nan.obj: sf_nan.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-sf_nan.obj `if test -f 'sf_nan.c'; then $(CYGPATH_W) 'sf_nan.c'; else $(CYGPATH_W) '$(srcdir)/sf_nan.c'; fi`
> +
> +lib_a-s_fpclassify.o: s_fpclassify.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_fpclassify.o `test -f 's_fpclassify.c' || echo '$(srcdir)/'`s_fpclassify.c
> +
> +lib_a-s_fpclassify.obj: s_fpclassify.c
> + $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(lib_a_CFLAGS) $(CFLAGS) -c -o lib_a-s_fpclassify.obj `if test -f 's_fpclassify.c'; then $(CYGPATH_W) 's_fpclassify.c'; else $(CYGPATH_W) '$(srcdir)/s_fpclassify.c'; fi`
> uninstall-info-am:
>
> ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
> Index: my-base-quilt/newlib/libm/machine/spu/sf_isnan.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_isnan.c
> @@ -0,0 +1,8 @@
> +/*
> + * On the SPU single precision floating does not support NAN's.
> + */
> +int
> +isnanf(float x)
> +{
> + return 0;
> +}
> Index: my-base-quilt/newlib/libm/machine/spu/sf_isnanf.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_isnanf.c
> @@ -0,0 +1,8 @@
> +/*
> + * On the SPU single precision floating does not support NAN's.
> + */
> +int
> +__isnanf(float x)
> +{
> + return 0;
> +}
> Index: my-base-quilt/newlib/libm/machine/spu/sf_nan.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_nan.c
> @@ -0,0 +1,9 @@
> +/*
> + * On the SPU single precision floating does not support NAN's, and nanf
> + * is documented as returning zero.
> + */
> +float
> +nanf(const char *unused)
> +{
> + return 0;
> +}
> Index: my-base-quilt/newlib/libm/machine/spu/s_fpclassify.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/s_fpclassify.c
> @@ -0,0 +1,49 @@
> +/* Copyright (C) 2002 by Red Hat, Incorporated. All rights reserved.
> + * Copyright (C) 2007 IBM
> + *
> + * Permission to use, copy, modify, and distribute this software
> + * is freely granted, provided that this notice is preserved.
> + */
> +
> +#include "fdlibm.h"
> +
> +/*
> + * On the SPU, single precision floating point returns only FP_NORMAL and
> + * FP_ZERO, since FP_NAN, FP_INFINITE, and FP_SUBNORMAL are not
> + * supported.
> + */
> +int
> +__fpclassifyf (float x)
> +{
> + __uint32_t w;
> +
> + GET_FLOAT_WORD(w,x);
> +
> + if (w == 0x00000000 || w == 0x80000000)
> + return FP_ZERO;
> + return FP_NORMAL;
> +}
> +
> +int
> +__fpclassifyd (double x)
> +{
> + __uint32_t msw, lsw;
> +
> + EXTRACT_WORDS(msw,lsw,x);
> +
> + if ((msw == 0x00000000 && lsw == 0x00000000) ||
> + (msw == 0x80000000 && lsw == 0x00000000))
> + return FP_ZERO;
> + else if ((msw >= 0x00100000 && msw <= 0x7fefffff) ||
> + (msw >= 0x80100000 && msw <= 0xffefffff))
> + return FP_NORMAL;
> + else if ((msw >= 0x00000000 && msw <= 0x000fffff) ||
> + (msw >= 0x80000000 && msw <= 0x800fffff))
> + /* zero is already handled above */
> + return FP_SUBNORMAL;
> + else if ((msw == 0x7ff00000 && lsw == 0x00000000) ||
> + (msw == 0xfff00000 && lsw == 0x00000000))
> + return FP_INFINITE;
> + else
> + return FP_NAN;
> +}
> Index: my-base-quilt/newlib/libc/include/ieeefp.h
> ===================================================================
> --- my-base-quilt.orig/newlib/libc/include/ieeefp.h
> +++ my-base-quilt/newlib/libc/include/ieeefp.h
> @@ -213,14 +213,22 @@ int _EXFUN(finitef, (float));
> #define __IEEE_DBL_NAN_EXP 0x7ff
> #define __IEEE_FLT_NAN_EXP 0xff
>
> -
> -#define isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
> - ((*(long *)&(x) & 0x007fffffL)!=0000000000L))
> -
> -#define isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
> - ((*(long *)&(x) & 0x007fffffL)==0000000000L))
> -
> -#define finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L))
> +#ifndef __ieeefp_isnanf
> +#define __ieeefp_isnanf(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
> + ((*(long *)&(x) & 0x007fffffL)!=0000000000L))
> +#endif
> +#define isnanf(x) __ieeefp_isnanf(x)
> +
> +#ifndef __ieeefp_isinff
> +#define __ieeefp_isinff(x) (((*(long *)&(x) & 0x7f800000L)==0x7f800000L) && \
> + ((*(long *)&(x) & 0x007fffffL)==0000000000L))
> +#endif
> +#define isinff(x) __ieeefp_isinff(x)
> +
> +#ifndef __ieeefp_finitef
> +#define __ieeefp_finitef(x) (((*(long *)&(x) & 0x7f800000L)!=0x7f800000L))
> +#endif
> +#define finitef(x) __ieeefp_finitef(x)
>
> #ifdef _DOUBLE_IS_32BITS
> #undef __IEEE_DBL_EXPBIAS
> Index: my-base-quilt/newlib/libm/machine/spu/sf_isinf.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_isinf.c
> @@ -0,0 +1,10 @@
> +/*
> + * On the SPU isinff(x) always returns 0.
> + *
> + * isinff is an extension declared in <ieeefp.h> and <math.h>.
> + */
> +int
> +isinff (float x)
> +{
> + return 0;
> +}
> Index: my-base-quilt/newlib/libm/machine/spu/sf_isinff.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_isinff.c
> @@ -0,0 +1,8 @@
> +/*
> + * On the SPU __isinff(x) always returns 0.
> + */
> +int
> +__isinff (float x)
> +{
> + return 0;
> +}
> Index: my-base-quilt/newlib/libm/machine/spu/sf_finite.c
> ===================================================================
> --- /dev/null
> +++ my-base-quilt/newlib/libm/machine/spu/sf_finite.c
> @@ -0,0 +1,8 @@
> +/*
> + * On the SPU always return 1.
> + */
> +int
> +finitef(float x)
> +{
> + return 1;
> +}