1206917Smarius 2206917Smarius/* 3206917Smarius=============================================================================== 4206917Smarius 5206917SmariusThis C source file is part of TestFloat, Release 2a, a package of programs 6206917Smariusfor testing the correctness of floating-point arithmetic complying to the 7206917SmariusIEC/IEEE Standard for Floating-Point. 8206917Smarius 9206917SmariusWritten by John R. Hauser. More information is available through the Web 10206917Smariuspage `http://HTTP.CS.Berkeley.EDU/~jhauser/arithmetic/TestFloat.html'. 11206917Smarius 12206917SmariusTHIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE. Although reasonable effort 13206917Smariushas been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT 14206917SmariusTIMES RESULT IN INCORRECT BEHAVIOR. USE OF THIS SOFTWARE IS RESTRICTED TO 15206917SmariusPERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY 16206917SmariusAND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE. 17206917Smarius 18206917SmariusDerivative works are acceptable, even for commercial purposes, so long as 19206917Smarius(1) they include prominent notice that the work is derivative, and (2) they 20206917Smariusinclude prominent notice akin to these four paragraphs for those parts of 21206917Smariusthis code that are retained. 22206917Smarius 23206917Smarius=============================================================================== 24206917Smarius*/ 25206917Smarius 26206917Smarius#include <stdio.h> 27206917Smarius#include "milieu.h" 28206917Smarius#include "softfloat.h" 29206917Smarius#include "writeHex.h" 30206917Smarius 31206917Smariusvoid writeHex_flag( flag a, FILE *stream ) 32206917Smarius{ 33206917Smarius 34206917Smarius fputc( a ? '1' : '0', stream ); 35206917Smarius 36206917Smarius} 37206917Smarius 38206917Smariusstatic void writeHex_bits8( bits8 a, FILE *stream ) 39206917Smarius{ 40206917Smarius int digit; 41206917Smarius 42206917Smarius digit = ( a>>4 ) & 0xF; 43206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 44206917Smarius fputc( '0' + digit, stream ); 45206917Smarius digit = a & 0xF; 46206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 47206917Smarius fputc( '0' + digit, stream ); 48206917Smarius 49206917Smarius} 50206917Smarius 51206917Smariusstatic void writeHex_bits12( int16 a, FILE *stream ) 52206917Smarius{ 53206917Smarius int digit; 54206917Smarius 55206917Smarius digit = ( a>>8 ) & 0xF; 56206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 57206917Smarius fputc( '0' + digit, stream ); 58206917Smarius digit = ( a>>4 ) & 0xF; 59206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 60206917Smarius fputc( '0' + digit, stream ); 61206917Smarius digit = a & 0xF; 62206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 63206917Smarius fputc( '0' + digit, stream ); 64206917Smarius 65206917Smarius} 66206917Smarius 67206917Smariusstatic void writeHex_bits16( bits16 a, FILE *stream ) 68206917Smarius{ 69206917Smarius int digit; 70206917Smarius 71206917Smarius digit = ( a>>12 ) & 0xF; 72206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 73206917Smarius fputc( '0' + digit, stream ); 74206917Smarius digit = ( a>>8 ) & 0xF; 75206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 76206917Smarius fputc( '0' + digit, stream ); 77206917Smarius digit = ( a>>4 ) & 0xF; 78206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 79206917Smarius fputc( '0' + digit, stream ); 80206917Smarius digit = a & 0xF; 81206917Smarius if ( 9 < digit ) digit += 'A' - ( '0' + 10 ); 82206917Smarius fputc( '0' + digit, stream ); 83206917Smarius 84206917Smarius} 85206917Smarius 86206917Smariusvoid writeHex_bits32( bits32 a, FILE *stream ) 87206917Smarius{ 88206917Smarius 89206917Smarius writeHex_bits16( a>>16, stream ); 90206917Smarius writeHex_bits16( a, stream ); 91206917Smarius 92206917Smarius} 93206917Smarius 94206917Smarius#ifdef BITS64 95206917Smarius 96206917Smariusvoid writeHex_bits64( bits64 a, FILE *stream ) 97206917Smarius{ 98206917Smarius 99206917Smarius writeHex_bits32( a>>32, stream ); 100206917Smarius writeHex_bits32( a, stream ); 101206917Smarius 102206917Smarius} 103206917Smarius 104206917Smarius#endif 105206917Smarius 106206917Smariusvoid writeHex_float32( float32 a, FILE *stream ) 107206917Smarius{ 108206917Smarius 109206917Smarius fputc( ( ( (sbits32) a ) < 0 ) ? '8' : '0', stream ); 110206917Smarius writeHex_bits8( a>>23, stream ); 111206917Smarius fputc( '.', stream ); 112206917Smarius writeHex_bits8( ( a>>16 ) & 0x7F, stream ); 113206917Smarius writeHex_bits16( a, stream ); 114206917Smarius 115206917Smarius} 116206917Smarius 117206917Smarius#ifdef BITS64 118206917Smarius 119206917Smariusvoid writeHex_float64( float64 a, FILE *stream ) 120206917Smarius{ 121206917Smarius 122206917Smarius writeHex_bits12( a>>52, stream ); 123206917Smarius fputc( '.', stream ); 124206917Smarius writeHex_bits12( a>>40, stream ); 125206917Smarius writeHex_bits8( a>>32, stream ); 126206917Smarius writeHex_bits32( a, stream ); 127206917Smarius 128206917Smarius} 129206917Smarius 130206917Smarius#else 131206917Smarius 132206917Smariusvoid writeHex_float64( float64 a, FILE *stream ) 133206917Smarius{ 134206917Smarius 135206917Smarius writeHex_bits12( a.high>>20, stream ); 136206917Smarius fputc( '.', stream ); 137206917Smarius writeHex_bits12( a.high>>8, stream ); 138206917Smarius writeHex_bits8( a.high, stream ); 139206917Smarius writeHex_bits32( a.low, stream ); 140206917Smarius 141206917Smarius} 142206917Smarius 143206917Smarius#endif 144206917Smarius 145206917Smarius#ifdef FLOATX80 146206917Smarius 147206917Smariusvoid writeHex_floatx80( floatx80 a, FILE *stream ) 148206917Smarius{ 149206917Smarius 150206917Smarius writeHex_bits16( a.high, stream ); 151206917Smarius fputc( '.', stream ); 152206917Smarius writeHex_bits64( a.low, stream ); 153206917Smarius 154206917Smarius} 155206917Smarius 156206917Smarius#endif 157206917Smarius 158206917Smarius#ifdef FLOAT128 159206917Smarius 160206917Smariusvoid writeHex_float128( float128 a, FILE *stream ) 161206917Smarius{ 162206917Smarius 163206917Smarius writeHex_bits16( a.high>>48, stream ); 164206917Smarius fputc( '.', stream ); 165206917Smarius writeHex_bits16( a.high>>32, stream ); 166206917Smarius writeHex_bits32( a.high, stream ); 167206917Smarius writeHex_bits64( a.low, stream ); 168206917Smarius 169206917Smarius} 170206917Smarius 171206917Smarius#endif 172206917Smarius 173206917Smariusvoid writeHex_float_flags( uint8 flags, FILE *stream ) 174206917Smarius{ 175206917Smarius 176206917Smarius fputc( flags & float_flag_invalid ? 'v' : '.', stream ); 177206917Smarius fputc( flags & float_flag_divbyzero ? 'z' : '.', stream ); 178206917Smarius fputc( flags & float_flag_overflow ? 'o' : '.', stream ); 179206917Smarius fputc( flags & float_flag_underflow ? 'u' : '.', stream ); 180206917Smarius fputc( flags & float_flag_inexact ? 'x' : '.', stream ); 181206917Smarius 182206917Smarius} 183206917Smarius 184