I have added this E500 port to EGLIBC trunk and 2.5 branch (patches for both attached). This is largely based on Aldy's old SPE add-on for glibc 2.3 (available in CVS on savannah). This port will be enabled if you use the ports add-on, configure for PowerPC with hardware floating point (do not use --without-fp) but the compiler used defines __NO_FPRS__. This port supports both E500v1 and E500v2; the software floating point functions for double precision will be enabled if the compiler defines _SOFT_DOUBLE (part of the required GCC patches, see below). There are no optimized .S functions directly using E500v2 double-precision floating point, although of course such could be added if desired; there are two such functions using E500v1 single-precision floating point and more could be added if desired. Note that the results of the tests of mathematical functions are largely a mess since I don't have a kernel with the necessary trap handler support for IEEE arithmetic and while glibc mostly works with floating point without rounding modes and exceptions, it really doesn't like not having subnormals, NaN or infinities either. This may be hiding real bugs in either the port or GCC; I'll look at the failures in due course to check for this, and hopefully in future will be able to test properly with a kernel with the necessary trap handlers. At that point, it will make sense to add libm-test-ulps files; at present it doesn't make sense to do so. The ideal way of adding a port with a different sort of floating point would be to move the existing PowerPC fpu/ directories so that e500/fpu and 6xx/fpu exist in parallel, but such rearrangements would cause problems in merges from FSF glibc. To minimise divergence, instead I made sure that e500/fpu overrides all files in powerpc/fpu and powerpc/powerpc32/fpu - except for a few headers. In the case of the headers, it's desirable to be able to have a single set of headers shared between E500 and non-E500 multilibs, so I added appropriate conditionals to the headers instead. In due course I intend to submit a slightly different version of this port to FSF glibc; that will have its own copies of the relevant headers, so the only changes needed to core glibc will be the _SOFT_FLOAT -> __NO_FPRS__ in two headers and the addition of __CONTEXT_EXTRA conditionals (which has been chosen to be more likely to be acceptable than putting the E500 code, appropriately conditioned, directly in the core libc files). The implementation of the SPE PIM functions (string to fixed point conversions) here is not yet tested at all (beyond that it compiles), but in principle it should be cleaner and more accurate than that in the old SPE add-on (avoiding problems with double rounding). I did find and report five bugs in glibc's strtod implementation in the course of adapting it for fixed-point (and fixed them in the copy used here). I intend to add proper testcases for all the functions in all rounding modes and fix any problems found. There are several requirements on the compiler to use this port: * You need a compiler capable of building glibc, which means GCC 4.1 or 4.2 branch. 4.3 can't be used until some form of <http://sourceware.org/ml/libc-hacker/2006-11/msg00001.html> or an alternative thereto is accepted for FSF glibc; I'd rather not have EGLIBC diverge from FSF glibc in the approach for handling GCC 4.3's C99 inline support. * You need a compiler with working E500 support. For 4.1 branch this means you need a lot of patches that have gone on that branch since 4.1.1 was released, mostly PowerPC-specific but including some of mine that aren't. For both 4.1 and 4.2 branches you also need my patch <http://gcc.gnu.org/ml/gcc-patches/2006-11/msg01700.html> which is only on trunk at present. * You need a compiler with IBM long double support for E500. This requires (a) the underlying soft-float long double support as attached to glibc bug 2749 (see <http://www.eglibc.org/prerequisites>) and (b) my patch on top of that to support IBM long double for E500. This latter patch is presently only available for 4.1 as branches/csl/sourcerygxx-4_1 revision 119585. I'll prepare and test trunk and 4.2 versions in due course. -- Joseph S. Myers joseph@xxxxxxxxxxxxxxxx
Attachment:
glibc-e500-2.5.bz2
Description: Binary data
Attachment:
glibc-e500-trunk.bz2
Description: Binary data