Home | History | Annotate | Download | only in Softfloat
      1 $NetBSD: softfloat-source.txt,v 1.2 2006/11/24 19:46:58 christos Exp $
      2 
      3 SoftFloat Release 2a Source Documentation
      4 
      5 John R. Hauser
      6 1998 December 14
      7 
      8 
      9 -------------------------------------------------------------------------------
     10 Introduction
     11 
     12 SoftFloat is a software implementation of floating-point that conforms to
     13 the IEC/IEEE Standard for Binary Floating-Point Arithmetic.  SoftFloat can
     14 support four floating-point formats:  single precision, double precision,
     15 extended double precision, and quadruple precision.  All operations required
     16 by the IEEE Standard are implemented, except for conversions to and from
     17 decimal.  SoftFloat is distributed in the form of C source code, so a
     18 C compiler is needed to compile the code.  Support for the extended double-
     19 precision and quadruple-precision formats is dependent on the C compiler
     20 implementing a 64-bit integer type.
     21 
     22 This document gives information needed for compiling and/or porting
     23 SoftFloat.
     24 
     25 The source code for SoftFloat is intended to be relatively machine-
     26 independent and should be compilable using any ISO/ANSI C compiler.  At the
     27 time of this writing, SoftFloat has been successfully compiled with the GNU
     28 C Compiler (`gcc') for several platforms.
     29 
     30 
     31 -------------------------------------------------------------------------------
     32 Limitations
     33 
     34 SoftFloat as written requires an ISO/ANSI-style C compiler.  No attempt has
     35 been made to accommodate compilers that are not ISO-conformant.  Older ``K&R-
     36 style'' compilers are not adequate for compiling SoftFloat.  All testing I
     37 have done so far has been with the GNU C Compiler.  Compilation with other
     38 compilers should be possible but has not been tested.
     39 
     40 The SoftFloat sources assume that source code file names can be longer than
     41 8 characters.  In order to compile under an MS-DOS-type system, many of the
     42 source files will need to be renamed, and the source and makefiles edited
     43 appropriately.  Once compiled, the SoftFloat binary does not depend on the
     44 existence of long file names.
     45 
     46 The underlying machine is assumed to be binary with a word size that is a
     47 power of 2.  Bytes are 8 bits.  Support for the extended double-precision
     48 and quadruple-precision formats depends on the C compiler implementing
     49 a 64-bit integer type.  If the largest integer type supported by the
     50 C compiler is 32 bits, SoftFloat is limited to the single- and double-
     51 precision formats.
     52 
     53 
     54 -------------------------------------------------------------------------------
     55 Contents
     56 
     57     Introduction
     58     Limitations
     59     Contents
     60     Legal Notice
     61     SoftFloat Source Directory Structure
     62     SoftFloat Source Files
     63         processors/*.h
     64         softfloat/bits*/*/softfloat.h
     65         softfloat/bits*/*/milieu.h
     66         softfloat/bits*/*/softfloat-specialize
     67         softfloat/bits*/softfloat-macros
     68         softfloat/bits*/softfloat.c
     69     Steps to Creating a `softfloat.o'
     70     Making `softfloat.o' a Library
     71     Testing SoftFloat
     72     Timing SoftFloat
     73     Compiler Options and Efficiency
     74     Processor-Specific Optimization of `softfloat.c' Using `softfloat-macros'
     75     Contact Information
     76 
     77 
     78 
     79 -------------------------------------------------------------------------------
     80 Legal Notice
     81 
     82 SoftFloat was written by John R. Hauser.  This work was made possible in
     83 part by the International Computer Science Institute, located at Suite 600,
     84 1947 Center Street, Berkeley, California 94704.  Funding was partially
     85 provided by the National Science Foundation under grant MIP-9311980.  The
     86 original version of this code was written as part of a project to build
     87 a fixed-point vector processor in collaboration with the University of
     88 California at Berkeley, overseen by Profs. Nelson Morgan and John Wawrzynek.
     89 
     90 THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     91 has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     92 TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     93 PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     94 AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     95 
     96 
     97 -------------------------------------------------------------------------------
     98 SoftFloat Source Directory Structure
     99 
    100 Because SoftFloat is targeted to multiple platforms, its source code
    101 is slightly scattered between target-specific and target-independent
    102 directories and files.  The directory structure is as follows:
    103 
    104     processors
    105     softfloat
    106         bits64
    107             templates
    108             386-Win32-gcc
    109             SPARC-Solaris-gcc
    110         bits32
    111             templates
    112             386-Win32-gcc
    113             SPARC-Solaris-gcc
    114 
    115 The two topmost directories and their contents are:
    116 
    117     softfloat    - Most of the source code needed for SoftFloat.
    118     processors   - Target-specific header files that are not specific to
    119                        SoftFloat.
    120 
    121 The `softfloat' directory is further split into two parts:
    122 
    123     bits64       - SoftFloat implementation using 64-bit integers.
    124     bits32       - SoftFloat implementation using only 32-bit integers.
    125 
    126 Within these directories are subdirectories for each of the targeted
    127 platforms.  The SoftFloat source code is distributed with targets
    128 `386-Win32-gcc' and `SPARC-Solaris-gcc' (and perhaps others) already
    129 prepared for both the 32-bit and 64-bit implementations.  Source files that
    130 are not within these target-specific subdirectories are intended to be
    131 target-independent.
    132 
    133 The naming convention used for the target-specific directories is
    134 `<processor>-<executable-type>-<compiler>'.  The names of the supplied
    135 target directories should be interpreted as follows:
    136 
    137   <processor>:
    138     386          - Intel 386-compatible processor.
    139     SPARC        - SPARC processor (as used by Sun machines).
    140   <executable-type>:
    141     Win32        - Microsoft Win32 executable.
    142     Solaris      - Sun Solaris executable.
    143   <compiler>:
    144     gcc          - GNU C Compiler.
    145 
    146 You do not need to maintain this convention if you do not want to.
    147 
    148 Alongside the supplied target-specific directories is a `templates'
    149 directory containing a set of ``generic'' target-specific source files.  A
    150 new target directory can be created by copying the `templates' directory and
    151 editing the files inside.  (Complete instructions for porting SoftFloat to a
    152 new target are in the section _Steps_to_Creating_a_`softfloat.o'_.)  Note
    153 that the `templates' directory will not work as a target directory without
    154 some editing.  To avoid confusion, it would be wise to refrain from editing
    155 the files inside `templates' directly.
    156 
    157 
    158 -------------------------------------------------------------------------------
    159 SoftFloat Source Files
    160 
    161 The purpose of each source file is described below.  In the following,
    162 the `*' symbol is used in place of the name of a specific target, such as
    163 `386-Win32-gcc' or `SPARC-Solaris-gcc', or in place of some other text, as
    164 in `bits*' for either `bits32' or `bits64'.
    165 
    166 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    167 processors/*.h
    168 
    169 The target-specific `processors' header file defines integer types
    170 of various sizes, and also defines certain C preprocessor macros that
    171 characterize the target.  The two examples supplied are `386-gcc.h' and
    172 `SPARC-gcc.h'.  The naming convention used for processor header files is
    173 `<processor>-<compiler>.h'.
    174 
    175 If 64-bit integers are supported by the compiler, the macro name `BITS64'
    176 should be defined here along with the corresponding 64-bit integer
    177 types.  In addition, the function-like macro `LIT64' must be defined for
    178 constructing 64-bit integer literals (constants).  The `LIT64' macro is used
    179 consistently in the SoftFloat code to annotate 64-bit literals.
    180 
    181 If `BITS64' is not defined, only the 32-bit version of SoftFloat can be
    182 compiled.  If `BITS64' _is_ defined, either can be compiled.
    183 
    184 If an inlining attribute (such as an `inline' keyword) is provided by the
    185 compiler, the macro `INLINE' should be defined to the appropriate keyword.
    186 If not, `INLINE' can be set to the keyword `static'.  The `INLINE' macro
    187 appears in the SoftFloat source code before every function that should
    188 be inlined by the compiler.  SoftFloat depends on inlining to obtain
    189 good speed.  Even if inlining cannot be forced with a language keyword,
    190 the compiler may still be able to perform inlining on its own as an
    191 optimization.  If a command-line option is needed to convince the compiler
    192 to perform this optimization, this should be assured in the makefile.  (See
    193 the section _Compiler_Options_and_Efficiency_ below.)
    194 
    195 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    196 softfloat/bits*/*/softfloat.h
    197 
    198 The target-specific `softfloat.h' header file defines the SoftFloat
    199 interface as seen by clients.
    200 
    201 Unlike the actual function definitions in `softfloat.c', the declarations
    202 in `softfloat.h' do not use any of the types defined by the `processors'
    203 header file.  This is done so that clients will not have to include the
    204 `processors' header file in order to use SoftFloat.  Nevertheless, the
    205 target-specific declarations in `softfloat.h' must match what `softfloat.c'
    206 expects.  For example, if `int32' is defined as `int' in the `processors'
    207 header file, then in `softfloat.h' the output of `float32_to_int32' should
    208 be stated as `int', although in `softfloat.c' it is given in target-
    209 independent form as `int32'.
    210 
    211 For the `bits64' implementation of SoftFloat, the macro names `FLOATX80' and
    212 `FLOAT128' must be defined in order for the extended double-precision and
    213 quadruple-precision formats to be enabled in the code.  Conversely, either
    214 or both of the extended formats can be disabled by simply removing the
    215 `#define' of the respective macro.  When an extended format is not enabled,
    216 none of the functions that either input or output the format are defined,
    217 and no space is taken up in `softfloat.o' by such functions.  There is no
    218 provision for disabling the usual single- and double-precision formats.
    219 
    220 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    221 softfloat/bits*/*/milieu.h
    222 
    223 The target-specific `milieu.h' header file provides declarations that are
    224 needed to compile SoftFloat.  In addition, deviations from ISO/ANSI C by
    225 the compiler (such as names not properly declared in system header files)
    226 are corrected in this header if possible.
    227 
    228 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    229 softfloat/bits*/*/softfloat-specialize
    230 
    231 This target-specific C source fragment defines:
    232 
    233 -- whether tininess for underflow is detected before or after rounding by
    234        default;
    235 -- what (if anything) special happens when exceptions are raised;
    236 -- how signaling NaNs are distinguished from quiet NaNs;
    237 -- the default generated quiet NaNs; and
    238 -- how NaNs are propagated from function inputs to output.
    239 
    240 These details are not decided by the IEC/IEEE Standard.  This fragment is
    241 included verbatim within `softfloat.c' when SoftFloat is compiled.
    242 
    243 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    244 softfloat/bits*/softfloat-macros
    245 
    246 This target-independent C source fragment defines a number of arithmetic
    247 functions used as primitives within the `softfloat.c' source.  Most of the
    248 functions defined here are intended to be inlined for efficiency.  This
    249 fragment is included verbatim within `softfloat.c' when SoftFloat is
    250 compiled.
    251 
    252 Target-specific variations on this file are possible.  See the section
    253 _Processor-Specific_Optimization_of_`softfloat.c'_Using_`softfloat-macros'_
    254 below.
    255 
    256 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    257 softfloat/bits*/softfloat.c
    258 
    259 The target-independent `softfloat.c' source file contains the body of the
    260 SoftFloat implementation.
    261 
    262 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    263 
    264 The inclusion of the files above within each other (using `#include') can be
    265 shown graphically as follows:
    266 
    267     softfloat/bits*/softfloat.c
    268         softfloat/bits*/*/milieu.h
    269             processors/*.h
    270         softfloat/bits*/*/softfloat.h
    271         softfloat/bits*/*/softfloat-specialize
    272         softfloat/bits*/softfloat-macros
    273 
    274 Note in particular that `softfloat.c' does not include the `processors'
    275 header file directly.  Rather, `softfloat.c' includes the target-specific
    276 `milieu.h' header file, which in turn includes the processor header file.
    277 
    278 
    279 -------------------------------------------------------------------------------
    280 Steps to Creating a `softfloat.o'
    281 
    282 Porting and/or compiling SoftFloat involves the following steps:
    283 
    284 1. If one does not already exist, create an appropriate `.h' file in the
    285    `processors' directory.
    286 
    287 2. If `BITS64' is defined in the `processors' header file, choose whether
    288    to compile the 32-bit or 64-bit implementation of SoftFloat.  If
    289    `BITS64' is not defined, your only choice is the 32-bit implementation.
    290    The remaining steps occur within either the `bits32' or `bits64'
    291    subdirectories.
    292 
    293 3. If one does not already exist, create an appropriate target-specific
    294    subdirectory by copying the given `templates' directory.
    295 
    296 4. In the target-specific subdirectory, edit the files `softfloat-specialize'
    297    and `softfloat.h' to define the desired exception handling functions
    298    and mode control values.  In the `softfloat.h' header file, ensure also
    299    that all declarations give the proper target-specific type (such as
    300    `int' or `long') corresponding to the target-independent type used in
    301    `softfloat.c' (such as `int32').  None of the type names declared in the
    302    `processors' header file should appear in `softfloat.h'.
    303 
    304 5. In the target-specific subdirectory, edit the files `milieu.h' and
    305    `Makefile' to reflect the current environment.
    306 
    307 6. In the target-specific subdirectory, execute `make'.
    308 
    309 For the targets that are supplied, if the expected compiler is available
    310 (usually `gcc'), it should only be necessary to execute `make' in the
    311 target-specific subdirectory.
    312 
    313 
    314 -------------------------------------------------------------------------------
    315 Making `softfloat.o' a Library
    316 
    317 SoftFloat is not made into a software library by the supplied makefile.
    318 If desired, `softfloat.o' can easily be put into its own library (in Unix,
    319 `softfloat.a') using the usual system tool (in Unix, `ar').
    320 
    321 
    322 -------------------------------------------------------------------------------
    323 Testing SoftFloat
    324 
    325 SoftFloat can be tested using the `testsoftfloat' program by the same
    326 author.  The `testsoftfloat' program is part of the TestFloat package
    327 available at the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/
    328 TestFloat.html'.
    329 
    330 
    331 -------------------------------------------------------------------------------
    332 Timing SoftFloat
    333 
    334 A program called `timesoftfloat' for timing the SoftFloat functions is
    335 included with the SoftFloat source code.  Compiling `timesoftfloat' should
    336 pose no difficulties once `softfloat.o' exists.  The supplied makefile
    337 will create a `timesoftfloat' executable by default after generating
    338 `softfloat.o'.  See `timesoftfloat.txt' for documentation about using
    339 `timesoftfloat'.
    340 
    341 
    342 -------------------------------------------------------------------------------
    343 Compiler Options and Efficiency
    344 
    345 In order to get good speed with SoftFloat, it is important that the compiler
    346 inline the routines that have been marked `INLINE' in the code.  Even if
    347 inlining cannot be forced by an appropriate definition of the `INLINE'
    348 macro, the compiler may still be able to perform inlining on its own as
    349 an optimization.  In that case, the makefile should be edited to give the
    350 compiler whatever option is required to cause it to inline small functions.
    351 
    352 The ability of the processor to do fast shifts has been assumed.  Efficiency
    353 will not be as good on processors for which this is not the case (such as
    354 the original Motorola 68000 or Intel 8086 processors).
    355 
    356 
    357 -------------------------------------------------------------------------------
    358 Processor-Specific Optimization of `softfloat.c' Using `softfloat-macros'
    359 
    360 The `softfloat-macros' source fragment defines arithmetic functions used
    361 as primitives by `softfloat.c'.  This file has been written in a target-
    362 independent form.  For a given target, it may be possible to improve on
    363 these functions using target-specific and/or non-ISO-C features (such
    364 as `asm' statements).  For example, one of the ``macro'' functions takes
    365 two word-size integers and returns their full product in two words.
    366 This operation can be done directly in hardware on many processors; but
    367 because it is not available through standard C, the function defined in
    368 `softfloat-macros' uses four multiplies to achieve the same result.
    369 
    370 To address these shortcomings, a customized version of `softfloat-macros'
    371 can be created in any of the target-specific subdirectories.  A simple
    372 modification to the target's makefile should be sufficient to ensure that
    373 the custom version is used instead of the generic one.
    374 
    375 
    376 -------------------------------------------------------------------------------
    377 Contact Information
    378 
    379 At the time of this writing, the most up-to-date information about
    380 SoftFloat and the latest release can be found at the Web page `http://
    381 HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/SoftFloat.html'.
    382 
    383 
    384