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