1 ///////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
4 // Digital Ltd. LLC
5 //
6 // All rights reserved.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are
10 // met:
11 // *       Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 // *       Redistributions in binary form must reproduce the above
14 // copyright notice, this list of conditions and the following disclaimer
15 // in the documentation and/or other materials provided with the
16 // distribution.
17 // *       Neither the name of Industrial Light & Magic nor the names of
18 // its contributors may be used to endorse or promote products derived
19 // from this software without specific prior written permission.
20 //
21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 //
33 ///////////////////////////////////////////////////////////////////////////
34 
35 
36 
37 
38 //---------------------------------------------------------------------------
39 //
40 //	toFloat
41 //
42 //	A program to generate the lookup table for half-to-float
43 //	conversion needed by class half.
44 //	The program loops over all 65536 possible half numbers,
45 //	converts each of them to a float, and prints the result.
46 //
47 //---------------------------------------------------------------------------
48 
49 
50 #include <iostream>
51 #include <iomanip>
52 
53 using namespace std;
54 
55 //---------------------------------------------------
56 // Interpret an unsigned short bit pattern as a half,
57 // and convert that half to the corresponding float's
58 // bit pattern.
59 //---------------------------------------------------
60 
61 unsigned int
halfToFloat(unsigned short y)62 halfToFloat (unsigned short y)
63 {
64 
65     int s = (y >> 15) & 0x00000001;
66     int e = (y >> 10) & 0x0000001f;
67     int m =  y        & 0x000003ff;
68 
69     if (e == 0)
70     {
71     if (m == 0)
72     {
73         //
74         // Plus or minus zero
75         //
76 
77         return s << 31;
78     }
79     else
80     {
81         //
82         // Denormalized number -- renormalize it
83         //
84 
85         while (!(m & 0x00000400))
86         {
87         m <<= 1;
88         e -=  1;
89         }
90 
91         e += 1;
92         m &= ~0x00000400;
93     }
94     }
95     else if (e == 31)
96     {
97     if (m == 0)
98     {
99         //
100         // Positive or negative infinity
101         //
102 
103         return (s << 31) | 0x7f800000;
104     }
105     else
106     {
107         //
108         // Nan -- preserve sign and significand bits
109         //
110 
111         return (s << 31) | 0x7f800000 | (m << 13);
112     }
113     }
114 
115     //
116     // Normalized number
117     //
118 
119     e = e + (127 - 15);
120     m = m << 13;
121 
122     //
123     // Assemble s, e and m.
124     //
125 
126     return (s << 31) | (e << 23) | m;
127 }
128 
129 
130 //---------------------------------------------
131 // Main - prints the half-to-float lookup table
132 //---------------------------------------------
133 
134 int
main()135 main ()
136 {
137     cout.precision (9);
138     cout.setf (ios_base::hex, ios_base::basefield);
139 
140     cout << "//\n"
141         "// This is an automatically generated file.\n"
142         "// Do not edit.\n"
143         "//\n\n";
144 
145     cout << "{\n    ";
146 
147     const int iMax = (1 << 16);
148 
149     for (int i = 0; i < iMax; i++)
150     {
151     cout << "{0x" << setfill ('0') << setw (8) << halfToFloat (i) << "}, ";
152 
153     if (i % 4 == 3)
154     {
155         cout << "\n";
156 
157         if (i < iMax - 1)
158         cout << "    ";
159     }
160     }
161 
162     cout << "};\n";
163     return 0;
164 }
165