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