 b6cbf7203b
			
		
	
	
		b6cbf7203b
		
	
	
	
	
		
			
			This patch imports the unmodified current version of NetBSD libc. The NetBSD includes are in /nbsd_include, while the libc code itself is split between lib/nbsd_libc and common/lib/libc.
		
			
				
	
	
		
			384 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			384 lines
		
	
	
		
			17 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| $NetBSD: softfloat-source.txt,v 1.2 2006/11/24 19:46:58 christos Exp $
 | |
| 
 | |
| SoftFloat Release 2a Source Documentation
 | |
| 
 | |
| John R. Hauser
 | |
| 1998 December 14
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Introduction
 | |
| 
 | |
| SoftFloat is a software implementation of floating-point that conforms to
 | |
| the IEC/IEEE Standard for Binary Floating-Point Arithmetic.  SoftFloat can
 | |
| support four floating-point formats:  single precision, double precision,
 | |
| extended double precision, and quadruple precision.  All operations required
 | |
| by the IEEE Standard are implemented, except for conversions to and from
 | |
| decimal.  SoftFloat is distributed in the form of C source code, so a
 | |
| C compiler is needed to compile the code.  Support for the extended double-
 | |
| precision and quadruple-precision formats is dependent on the C compiler
 | |
| implementing a 64-bit integer type.
 | |
| 
 | |
| This document gives information needed for compiling and/or porting
 | |
| SoftFloat.
 | |
| 
 | |
| The source code for SoftFloat is intended to be relatively machine-
 | |
| independent and should be compilable using any ISO/ANSI C compiler.  At the
 | |
| time of this writing, SoftFloat has been successfully compiled with the GNU
 | |
| C Compiler (`gcc') for several platforms.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Limitations
 | |
| 
 | |
| SoftFloat as written requires an ISO/ANSI-style C compiler.  No attempt has
 | |
| been made to accommodate compilers that are not ISO-conformant.  Older ``K&R-
 | |
| style'' compilers are not adequate for compiling SoftFloat.  All testing I
 | |
| have done so far has been with the GNU C Compiler.  Compilation with other
 | |
| compilers should be possible but has not been tested.
 | |
| 
 | |
| The SoftFloat sources assume that source code file names can be longer than
 | |
| 8 characters.  In order to compile under an MS-DOS-type system, many of the
 | |
| source files will need to be renamed, and the source and makefiles edited
 | |
| appropriately.  Once compiled, the SoftFloat binary does not depend on the
 | |
| existence of long file names.
 | |
| 
 | |
| The underlying machine is assumed to be binary with a word size that is a
 | |
| power of 2.  Bytes are 8 bits.  Support for the extended double-precision
 | |
| and quadruple-precision formats depends on the C compiler implementing
 | |
| a 64-bit integer type.  If the largest integer type supported by the
 | |
| C compiler is 32 bits, SoftFloat is limited to the single- and double-
 | |
| precision formats.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Contents
 | |
| 
 | |
|     Introduction
 | |
|     Limitations
 | |
|     Contents
 | |
|     Legal Notice
 | |
|     SoftFloat Source Directory Structure
 | |
|     SoftFloat Source Files
 | |
|         processors/*.h
 | |
|         softfloat/bits*/*/softfloat.h
 | |
|         softfloat/bits*/*/milieu.h
 | |
|         softfloat/bits*/*/softfloat-specialize
 | |
|         softfloat/bits*/softfloat-macros
 | |
|         softfloat/bits*/softfloat.c
 | |
|     Steps to Creating a `softfloat.o'
 | |
|     Making `softfloat.o' a Library
 | |
|     Testing SoftFloat
 | |
|     Timing SoftFloat
 | |
|     Compiler Options and Efficiency
 | |
|     Processor-Specific Optimization of `softfloat.c' Using `softfloat-macros'
 | |
|     Contact Information
 | |
| 
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Legal Notice
 | |
| 
 | |
| SoftFloat was written by John R. Hauser.  This work was made possible in
 | |
| part by the International Computer Science Institute, located at Suite 600,
 | |
| 1947 Center Street, Berkeley, California 94704.  Funding was partially
 | |
| provided by the National Science Foundation under grant MIP-9311980.  The
 | |
| original version of this code was written as part of a project to build
 | |
| a fixed-point vector processor in collaboration with the University of
 | |
| California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
 | |
| 
 | |
| THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
 | |
| has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
 | |
| TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
 | |
| PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
 | |
| AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| SoftFloat Source Directory Structure
 | |
| 
 | |
| Because SoftFloat is targeted to multiple platforms, its source code
 | |
| is slightly scattered between target-specific and target-independent
 | |
| directories and files.  The directory structure is as follows:
 | |
| 
 | |
|     processors
 | |
|     softfloat
 | |
|         bits64
 | |
|             templates
 | |
|             386-Win32-gcc
 | |
|             SPARC-Solaris-gcc
 | |
|         bits32
 | |
|             templates
 | |
|             386-Win32-gcc
 | |
|             SPARC-Solaris-gcc
 | |
| 
 | |
| The two topmost directories and their contents are:
 | |
| 
 | |
|     softfloat    - Most of the source code needed for SoftFloat.
 | |
|     processors   - Target-specific header files that are not specific to
 | |
|                        SoftFloat.
 | |
| 
 | |
| The `softfloat' directory is further split into two parts:
 | |
| 
 | |
|     bits64       - SoftFloat implementation using 64-bit integers.
 | |
|     bits32       - SoftFloat implementation using only 32-bit integers.
 | |
| 
 | |
| Within these directories are subdirectories for each of the targeted
 | |
| platforms.  The SoftFloat source code is distributed with targets
 | |
| `386-Win32-gcc' and `SPARC-Solaris-gcc' (and perhaps others) already
 | |
| prepared for both the 32-bit and 64-bit implementations.  Source files that
 | |
| are not within these target-specific subdirectories are intended to be
 | |
| target-independent.
 | |
| 
 | |
| The naming convention used for the target-specific directories is
 | |
| `<processor>-<executable-type>-<compiler>'.  The names of the supplied
 | |
| target directories should be interpreted as follows:
 | |
| 
 | |
|   <processor>:
 | |
|     386          - Intel 386-compatible processor.
 | |
|     SPARC        - SPARC processor (as used by Sun machines).
 | |
|   <executable-type>:
 | |
|     Win32        - Microsoft Win32 executable.
 | |
|     Solaris      - Sun Solaris executable.
 | |
|   <compiler>:
 | |
|     gcc          - GNU C Compiler.
 | |
| 
 | |
| You do not need to maintain this convention if you do not want to.
 | |
| 
 | |
| Alongside the supplied target-specific directories is a `templates'
 | |
| directory containing a set of ``generic'' target-specific source files.  A
 | |
| new target directory can be created by copying the `templates' directory and
 | |
| editing the files inside.  (Complete instructions for porting SoftFloat to a
 | |
| new target are in the section _Steps_to_Creating_a_`softfloat.o'_.)  Note
 | |
| that the `templates' directory will not work as a target directory without
 | |
| some editing.  To avoid confusion, it would be wise to refrain from editing
 | |
| the files inside `templates' directly.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| SoftFloat Source Files
 | |
| 
 | |
| The purpose of each source file is described below.  In the following,
 | |
| the `*' symbol is used in place of the name of a specific target, such as
 | |
| `386-Win32-gcc' or `SPARC-Solaris-gcc', or in place of some other text, as
 | |
| in `bits*' for either `bits32' or `bits64'.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| processors/*.h
 | |
| 
 | |
| The target-specific `processors' header file defines integer types
 | |
| of various sizes, and also defines certain C preprocessor macros that
 | |
| characterize the target.  The two examples supplied are `386-gcc.h' and
 | |
| `SPARC-gcc.h'.  The naming convention used for processor header files is
 | |
| `<processor>-<compiler>.h'.
 | |
| 
 | |
| If 64-bit integers are supported by the compiler, the macro name `BITS64'
 | |
| should be defined here along with the corresponding 64-bit integer
 | |
| types.  In addition, the function-like macro `LIT64' must be defined for
 | |
| constructing 64-bit integer literals (constants).  The `LIT64' macro is used
 | |
| consistently in the SoftFloat code to annotate 64-bit literals.
 | |
| 
 | |
| If `BITS64' is not defined, only the 32-bit version of SoftFloat can be
 | |
| compiled.  If `BITS64' _is_ defined, either can be compiled.
 | |
| 
 | |
| If an inlining attribute (such as an `inline' keyword) is provided by the
 | |
| compiler, the macro `INLINE' should be defined to the appropriate keyword.
 | |
| If not, `INLINE' can be set to the keyword `static'.  The `INLINE' macro
 | |
| appears in the SoftFloat source code before every function that should
 | |
| be inlined by the compiler.  SoftFloat depends on inlining to obtain
 | |
| good speed.  Even if inlining cannot be forced with a language keyword,
 | |
| the compiler may still be able to perform inlining on its own as an
 | |
| optimization.  If a command-line option is needed to convince the compiler
 | |
| to perform this optimization, this should be assured in the makefile.  (See
 | |
| the section _Compiler_Options_and_Efficiency_ below.)
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| softfloat/bits*/*/softfloat.h
 | |
| 
 | |
| The target-specific `softfloat.h' header file defines the SoftFloat
 | |
| interface as seen by clients.
 | |
| 
 | |
| Unlike the actual function definitions in `softfloat.c', the declarations
 | |
| in `softfloat.h' do not use any of the types defined by the `processors'
 | |
| header file.  This is done so that clients will not have to include the
 | |
| `processors' header file in order to use SoftFloat.  Nevertheless, the
 | |
| target-specific declarations in `softfloat.h' must match what `softfloat.c'
 | |
| expects.  For example, if `int32' is defined as `int' in the `processors'
 | |
| header file, then in `softfloat.h' the output of `float32_to_int32' should
 | |
| be stated as `int', although in `softfloat.c' it is given in target-
 | |
| independent form as `int32'.
 | |
| 
 | |
| For the `bits64' implementation of SoftFloat, the macro names `FLOATX80' and
 | |
| `FLOAT128' must be defined in order for the extended double-precision and
 | |
| quadruple-precision formats to be enabled in the code.  Conversely, either
 | |
| or both of the extended formats can be disabled by simply removing the
 | |
| `#define' of the respective macro.  When an extended format is not enabled,
 | |
| none of the functions that either input or output the format are defined,
 | |
| and no space is taken up in `softfloat.o' by such functions.  There is no
 | |
| provision for disabling the usual single- and double-precision formats.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| softfloat/bits*/*/milieu.h
 | |
| 
 | |
| The target-specific `milieu.h' header file provides declarations that are
 | |
| needed to compile SoftFloat.  In addition, deviations from ISO/ANSI C by
 | |
| the compiler (such as names not properly declared in system header files)
 | |
| are corrected in this header if possible.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| softfloat/bits*/*/softfloat-specialize
 | |
| 
 | |
| This target-specific C source fragment defines:
 | |
| 
 | |
| -- whether tininess for underflow is detected before or after rounding by
 | |
|        default;
 | |
| -- what (if anything) special happens when exceptions are raised;
 | |
| -- how signaling NaNs are distinguished from quiet NaNs;
 | |
| -- the default generated quiet NaNs; and
 | |
| -- how NaNs are propagated from function inputs to output.
 | |
| 
 | |
| These details are not decided by the IEC/IEEE Standard.  This fragment is
 | |
| included verbatim within `softfloat.c' when SoftFloat is compiled.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| softfloat/bits*/softfloat-macros
 | |
| 
 | |
| This target-independent C source fragment defines a number of arithmetic
 | |
| functions used as primitives within the `softfloat.c' source.  Most of the
 | |
| functions defined here are intended to be inlined for efficiency.  This
 | |
| fragment is included verbatim within `softfloat.c' when SoftFloat is
 | |
| compiled.
 | |
| 
 | |
| Target-specific variations on this file are possible.  See the section
 | |
| _Processor-Specific_Optimization_of_`softfloat.c'_Using_`softfloat-macros'_
 | |
| below.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| softfloat/bits*/softfloat.c
 | |
| 
 | |
| The target-independent `softfloat.c' source file contains the body of the
 | |
| SoftFloat implementation.
 | |
| 
 | |
| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 | |
| 
 | |
| The inclusion of the files above within each other (using `#include') can be
 | |
| shown graphically as follows:
 | |
| 
 | |
|     softfloat/bits*/softfloat.c
 | |
|         softfloat/bits*/*/milieu.h
 | |
|             processors/*.h
 | |
|         softfloat/bits*/*/softfloat.h
 | |
|         softfloat/bits*/*/softfloat-specialize
 | |
|         softfloat/bits*/softfloat-macros
 | |
| 
 | |
| Note in particular that `softfloat.c' does not include the `processors'
 | |
| header file directly.  Rather, `softfloat.c' includes the target-specific
 | |
| `milieu.h' header file, which in turn includes the processor header file.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Steps to Creating a `softfloat.o'
 | |
| 
 | |
| Porting and/or compiling SoftFloat involves the following steps:
 | |
| 
 | |
| 1. If one does not already exist, create an appropriate `.h' file in the
 | |
|    `processors' directory.
 | |
| 
 | |
| 2. If `BITS64' is defined in the `processors' header file, choose whether
 | |
|    to compile the 32-bit or 64-bit implementation of SoftFloat.  If
 | |
|    `BITS64' is not defined, your only choice is the 32-bit implementation.
 | |
|    The remaining steps occur within either the `bits32' or `bits64'
 | |
|    subdirectories.
 | |
| 
 | |
| 3. If one does not already exist, create an appropriate target-specific
 | |
|    subdirectory by copying the given `templates' directory.
 | |
| 
 | |
| 4. In the target-specific subdirectory, edit the files `softfloat-specialize'
 | |
|    and `softfloat.h' to define the desired exception handling functions
 | |
|    and mode control values.  In the `softfloat.h' header file, ensure also
 | |
|    that all declarations give the proper target-specific type (such as
 | |
|    `int' or `long') corresponding to the target-independent type used in
 | |
|    `softfloat.c' (such as `int32').  None of the type names declared in the
 | |
|    `processors' header file should appear in `softfloat.h'.
 | |
| 
 | |
| 5. In the target-specific subdirectory, edit the files `milieu.h' and
 | |
|    `Makefile' to reflect the current environment.
 | |
| 
 | |
| 6. In the target-specific subdirectory, execute `make'.
 | |
| 
 | |
| For the targets that are supplied, if the expected compiler is available
 | |
| (usually `gcc'), it should only be necessary to execute `make' in the
 | |
| target-specific subdirectory.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Making `softfloat.o' a Library
 | |
| 
 | |
| SoftFloat is not made into a software library by the supplied makefile.
 | |
| If desired, `softfloat.o' can easily be put into its own library (in Unix,
 | |
| `softfloat.a') using the usual system tool (in Unix, `ar').
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Testing SoftFloat
 | |
| 
 | |
| SoftFloat can be tested using the `testsoftfloat' program by the same
 | |
| author.  The `testsoftfloat' program is part of the TestFloat package
 | |
| available at the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/
 | |
| TestFloat.html'.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Timing SoftFloat
 | |
| 
 | |
| A program called `timesoftfloat' for timing the SoftFloat functions is
 | |
| included with the SoftFloat source code.  Compiling `timesoftfloat' should
 | |
| pose no difficulties once `softfloat.o' exists.  The supplied makefile
 | |
| will create a `timesoftfloat' executable by default after generating
 | |
| `softfloat.o'.  See `timesoftfloat.txt' for documentation about using
 | |
| `timesoftfloat'.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Compiler Options and Efficiency
 | |
| 
 | |
| In order to get good speed with SoftFloat, it is important that the compiler
 | |
| inline the routines that have been marked `INLINE' in the code.  Even if
 | |
| inlining cannot be forced by an appropriate definition of the `INLINE'
 | |
| macro, the compiler may still be able to perform inlining on its own as
 | |
| an optimization.  In that case, the makefile should be edited to give the
 | |
| compiler whatever option is required to cause it to inline small functions.
 | |
| 
 | |
| The ability of the processor to do fast shifts has been assumed.  Efficiency
 | |
| will not be as good on processors for which this is not the case (such as
 | |
| the original Motorola 68000 or Intel 8086 processors).
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Processor-Specific Optimization of `softfloat.c' Using `softfloat-macros'
 | |
| 
 | |
| The `softfloat-macros' source fragment defines arithmetic functions used
 | |
| as primitives by `softfloat.c'.  This file has been written in a target-
 | |
| independent form.  For a given target, it may be possible to improve on
 | |
| these functions using target-specific and/or non-ISO-C features (such
 | |
| as `asm' statements).  For example, one of the ``macro'' functions takes
 | |
| two word-size integers and returns their full product in two words.
 | |
| This operation can be done directly in hardware on many processors; but
 | |
| because it is not available through standard C, the function defined in
 | |
| `softfloat-macros' uses four multiplies to achieve the same result.
 | |
| 
 | |
| To address these shortcomings, a customized version of `softfloat-macros'
 | |
| can be created in any of the target-specific subdirectories.  A simple
 | |
| modification to the target's makefile should be sufficient to ensure that
 | |
| the custom version is used instead of the generic one.
 | |
| 
 | |
| 
 | |
| -------------------------------------------------------------------------------
 | |
| Contact Information
 | |
| 
 | |
| At the time of this writing, the most up-to-date information about
 | |
| SoftFloat and the latest release can be found at the Web page `http://
 | |
| HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/SoftFloat.html'.
 | |
| 
 | |
| 
 |