Home | History | Annotate | Line # | Download | only in testfloat
writeHex.c revision 1.1.1.1
      1  1.1  ross 
      2  1.1  ross /*
      3  1.1  ross ===============================================================================
      4  1.1  ross 
      5  1.1  ross This C source file is part of TestFloat, Release 2a, a package of programs
      6  1.1  ross for testing the correctness of floating-point arithmetic complying to the
      7  1.1  ross IEC/IEEE Standard for Floating-Point.
      8  1.1  ross 
      9  1.1  ross Written by John R. Hauser.  More information is available through the Web
     10  1.1  ross page `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'.
     11  1.1  ross 
     12  1.1  ross THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
     13  1.1  ross has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
     14  1.1  ross TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
     15  1.1  ross PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
     16  1.1  ross AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
     17  1.1  ross 
     18  1.1  ross Derivative works are acceptable, even for commercial purposes, so long as
     19  1.1  ross (1) they include prominent notice that the work is derivative, and (2) they
     20  1.1  ross include prominent notice akin to these four paragraphs for those parts of
     21  1.1  ross this code that are retained.
     22  1.1  ross 
     23  1.1  ross ===============================================================================
     24  1.1  ross */
     25  1.1  ross 
     26  1.1  ross #include <stdio.h>
     27  1.1  ross #include "milieu.h"
     28  1.1  ross #include "softfloat.h"
     29  1.1  ross #include "writeHex.h"
     30  1.1  ross 
     31  1.1  ross void writeHex_flag( flag a, FILE *stream )
     32  1.1  ross {
     33  1.1  ross 
     34  1.1  ross     fputc( a ? '1' : '0', stream );
     35  1.1  ross 
     36  1.1  ross }
     37  1.1  ross 
     38  1.1  ross static void writeHex_bits8( bits8 a, FILE *stream )
     39  1.1  ross {
     40  1.1  ross     int digit;
     41  1.1  ross 
     42  1.1  ross     digit = ( a>>4 ) & 0xF;
     43  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     44  1.1  ross     fputc( '0' + digit, stream );
     45  1.1  ross     digit = a & 0xF;
     46  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     47  1.1  ross     fputc( '0' + digit, stream );
     48  1.1  ross 
     49  1.1  ross }
     50  1.1  ross 
     51  1.1  ross static void writeHex_bits12( int16 a, FILE *stream )
     52  1.1  ross {
     53  1.1  ross     int digit;
     54  1.1  ross 
     55  1.1  ross     digit = ( a>>8 ) & 0xF;
     56  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     57  1.1  ross     fputc( '0' + digit, stream );
     58  1.1  ross     digit = ( a>>4 ) & 0xF;
     59  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     60  1.1  ross     fputc( '0' + digit, stream );
     61  1.1  ross     digit = a & 0xF;
     62  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     63  1.1  ross     fputc( '0' + digit, stream );
     64  1.1  ross 
     65  1.1  ross }
     66  1.1  ross 
     67  1.1  ross static void writeHex_bits16( bits16 a, FILE *stream )
     68  1.1  ross {
     69  1.1  ross     int digit;
     70  1.1  ross 
     71  1.1  ross     digit = ( a>>12 ) & 0xF;
     72  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     73  1.1  ross     fputc( '0' + digit, stream );
     74  1.1  ross     digit = ( a>>8 ) & 0xF;
     75  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     76  1.1  ross     fputc( '0' + digit, stream );
     77  1.1  ross     digit = ( a>>4 ) & 0xF;
     78  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     79  1.1  ross     fputc( '0' + digit, stream );
     80  1.1  ross     digit = a & 0xF;
     81  1.1  ross     if ( 9 < digit ) digit += 'A' - ( '0' + 10 );
     82  1.1  ross     fputc( '0' + digit, stream );
     83  1.1  ross 
     84  1.1  ross }
     85  1.1  ross 
     86  1.1  ross void writeHex_bits32( bits32 a, FILE *stream )
     87  1.1  ross {
     88  1.1  ross 
     89  1.1  ross     writeHex_bits16( a>>16, stream );
     90  1.1  ross     writeHex_bits16( a, stream );
     91  1.1  ross 
     92  1.1  ross }
     93  1.1  ross 
     94  1.1  ross #ifdef BITS64
     95  1.1  ross 
     96  1.1  ross void writeHex_bits64( bits64 a, FILE *stream )
     97  1.1  ross {
     98  1.1  ross 
     99  1.1  ross     writeHex_bits32( a>>32, stream );
    100  1.1  ross     writeHex_bits32( a, stream );
    101  1.1  ross 
    102  1.1  ross }
    103  1.1  ross 
    104  1.1  ross #endif
    105  1.1  ross 
    106  1.1  ross void writeHex_float32( float32 a, FILE *stream )
    107  1.1  ross {
    108  1.1  ross 
    109  1.1  ross     fputc( ( ( (sbits32) a ) < 0 ) ? '8' : '0', stream );
    110  1.1  ross     writeHex_bits8( a>>23, stream );
    111  1.1  ross     fputc( '.', stream );
    112  1.1  ross     writeHex_bits8( ( a>>16 ) & 0x7F, stream );
    113  1.1  ross     writeHex_bits16( a, stream );
    114  1.1  ross 
    115  1.1  ross }
    116  1.1  ross 
    117  1.1  ross #ifdef BITS64
    118  1.1  ross 
    119  1.1  ross void writeHex_float64( float64 a, FILE *stream )
    120  1.1  ross {
    121  1.1  ross 
    122  1.1  ross     writeHex_bits12( a>>52, stream );
    123  1.1  ross     fputc( '.', stream );
    124  1.1  ross     writeHex_bits12( a>>40, stream );
    125  1.1  ross     writeHex_bits8( a>>32, stream );
    126  1.1  ross     writeHex_bits32( a, stream );
    127  1.1  ross 
    128  1.1  ross }
    129  1.1  ross 
    130  1.1  ross #else
    131  1.1  ross 
    132  1.1  ross void writeHex_float64( float64 a, FILE *stream )
    133  1.1  ross {
    134  1.1  ross 
    135  1.1  ross     writeHex_bits12( a.high>>20, stream );
    136  1.1  ross     fputc( '.', stream );
    137  1.1  ross     writeHex_bits12( a.high>>8, stream );
    138  1.1  ross     writeHex_bits8( a.high, stream );
    139  1.1  ross     writeHex_bits32( a.low, stream );
    140  1.1  ross 
    141  1.1  ross }
    142  1.1  ross 
    143  1.1  ross #endif
    144  1.1  ross 
    145  1.1  ross #ifdef FLOATX80
    146  1.1  ross 
    147  1.1  ross void writeHex_floatx80( floatx80 a, FILE *stream )
    148  1.1  ross {
    149  1.1  ross 
    150  1.1  ross     writeHex_bits16( a.high, stream );
    151  1.1  ross     fputc( '.', stream );
    152  1.1  ross     writeHex_bits64( a.low, stream );
    153  1.1  ross 
    154  1.1  ross }
    155  1.1  ross 
    156  1.1  ross #endif
    157  1.1  ross 
    158  1.1  ross #ifdef FLOAT128
    159  1.1  ross 
    160  1.1  ross void writeHex_float128( float128 a, FILE *stream )
    161  1.1  ross {
    162  1.1  ross 
    163  1.1  ross     writeHex_bits16( a.high>>48, stream );
    164  1.1  ross     fputc( '.', stream );
    165  1.1  ross     writeHex_bits16( a.high>>32, stream );
    166  1.1  ross     writeHex_bits32( a.high, stream );
    167  1.1  ross     writeHex_bits64( a.low, stream );
    168  1.1  ross 
    169  1.1  ross }
    170  1.1  ross 
    171  1.1  ross #endif
    172  1.1  ross 
    173  1.1  ross void writeHex_float_flags( uint8 flags, FILE *stream )
    174  1.1  ross {
    175  1.1  ross 
    176  1.1  ross     fputc( flags & float_flag_invalid   ? 'v' : '.', stream );
    177  1.1  ross     fputc( flags & float_flag_divbyzero ? 'z' : '.', stream );
    178  1.1  ross     fputc( flags & float_flag_overflow  ? 'o' : '.', stream );
    179  1.1  ross     fputc( flags & float_flag_underflow ? 'u' : '.', stream );
    180  1.1  ross     fputc( flags & float_flag_inexact   ? 'x' : '.', stream );
    181  1.1  ross 
    182  1.1  ross }
    183  1.1  ross 
    184