Sortix Math Library
===================

This is the Sortix Math Library (libm). It is a full implemention of the
<complex.h>, <fenv.h>, <math.h>, and <tgmath.h> API as described in the C
standard. A modern compiler should be able to build the library without any
warnings as the code has been modernized. Some platforms have optimized versions
of some functions available, but all functions are available as C code assuming
IEEE floating point semantics.

The library is a fork of the NetBSD 9.1 Math Library, with a few missing pieces
taken from the NetBSD 9.1 libc and kernel. The code has been modified to be part
of the Sortix operating system. However, we have tried to make as few changes to
the source code files themselves, so it should be easy to upgrade this library
if the upstream versions are upgraded as well. The internal header structure
tries to be BSD-like so the code can include BSD headers provided internally.
Some GNU extensions are implemented as well.

License
-------

The library is partly public domain and partly BSD-style licensed, see the file
LEGAL for information about which licenses are used. The files in this library
carry their original copyright headers, although a few lack such headers and are
assumed to carry the standard NetBSD license.

Currently the e_exp.S file contains an advertisement clause from Winning
Strategies, Inc., but otherwise the library is free of such requirements.

Porting
-------

The source code is reasonable portable and compiles cleanly with gcc as C99,
however the headers needs to be hooked up against the C library. As an example,
they currently support Sortix libc and GNU libc. You will also want to redo the
build system and probably fork the library. If you are the type that considers
porting a libm, then you probably should be able to do it without too much pain.

Standards Compliance
--------------------

There are two options in making libm at compile time:

        _IEEE_LIBM      --- IEEE libm; smaller, and somewhat faster
        _MULTI_LIBM     --- Support multi-standard at runtime by
                            imposing wrapper functions defined in
                            fdlibm.h:
                                _IEEE_MODE      -- IEEE
                                _XOPEN_MODE     -- X/OPEN
                                _POSIX_MODE     -- POSIX/ANSI
                                _SVID3_MODE     -- SVID

Here is how to set up CPPFLAGS to create the desired libm at
compile time:

        CPPFLAGS = -D_IEEE_LIBM         ... IEEE libm (recommended)
        CPPFLAGS = -D_SVID3_MODE        ... Multi-standard supported
                                            libm with SVID as the
                                            default standard
        CPPFLAGS = -D_XOPEN_MODE        ... Multi-standard supported
                                            libm with XOPEN as the
                                            default standard
        CPPFLAGS = -D_POSIX_MODE        ... Multi-standard supported
                                            libm with POSIX as the
                                            default standard
        CPPFLAGS =                      ... Multi-standard supported
                                            libm with IEEE as the
                                            default standard
