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