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 #include <iostream> 38 #include <iomanip> 39 40 using namespace std; 41 42 //----------------------------------------------------- 43 // Compute a lookup table for float-to-half conversion. 44 // 45 // When indexed with the combined sign and exponent of 46 // a float, the table either returns the combined sign 47 // and exponent of the corresponding half, or zero if 48 // the corresponding half may not be normalized (zero, 49 // denormalized, overflow). 50 //----------------------------------------------------- 51 52 void 53 initELut (unsigned short eLut[]) 54 { 55 for (int i = 0; i < 0x100; i++) 56 { 57 int e = (i & 0x0ff) - (127 - 15); 58 59 if (e <= 0 || e >= 30) 60 { 61 // 62 // Special case 63 // 64 65 eLut[i] = 0; 66 eLut[i | 0x100] = 0; 67 } 68 else 69 { 70 // 71 // Common case - normalized half, no exponent overflow possible 72 // 73 74 eLut[i] = (e << 10); 75 eLut[i | 0x100] = ((e << 10) | 0x8000); 76 } 77 } 78 } 79 80 81 //------------------------------------------------------------ 82 // Main - prints the sign-and-exponent conversion lookup table 83 //------------------------------------------------------------ 84 85 int 86 main () 87 { 88 const int tableSize = 1 << 9; 89 unsigned short eLut[tableSize]; 90 initELut (eLut); 91 92 cout << "//\n" 93 "// This is an automatically generated file.\n" 94 "// Do not edit.\n" 95 "//\n\n"; 96 97 cout << "{\n "; 98 99 for (int i = 0; i < tableSize; i++) 100 { 101 cout << setw (5) << eLut[i] << ", "; 102 103 if (i % 8 == 7) 104 { 105 cout << "\n"; 106 107 if (i < tableSize - 1) 108 cout << " "; 109 } 110 } 111 112 cout << "};\n"; 113 return 0; 114 } 115