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