00001 00002 // 00003 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas 00004 // Digital Ltd. LLC 00005 // 00006 // All rights reserved. 00007 // 00008 // Redistribution and use in source and binary forms, with or without 00009 // modification, are permitted provided that the following conditions are 00010 // met: 00011 // * Redistributions of source code must retain the above copyright 00012 // notice, this list of conditions and the following disclaimer. 00013 // * Redistributions in binary form must reproduce the above 00014 // copyright notice, this list of conditions and the following disclaimer 00015 // in the documentation and/or other materials provided with the 00016 // distribution. 00017 // * Neither the name of Industrial Light & Magic nor the names of 00018 // its contributors may be used to endorse or promote products derived 00019 // from this software without specific prior written permission. 00020 // 00021 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00022 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00023 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00024 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 00025 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00026 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00027 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00028 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00029 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00030 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00031 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00032 // 00034 00035 00036 00037 #include <iostream> 00038 #include <iomanip> 00039 00040 using namespace std; 00041 00042 //----------------------------------------------------- 00043 // Compute a lookup table for float-to-half conversion. 00044 // 00045 // When indexed with the combined sign and exponent of 00046 // a float, the table either returns the combined sign 00047 // and exponent of the corresponding half, or zero if 00048 // the corresponding half may not be normalized (zero, 00049 // denormalized, overflow). 00050 //----------------------------------------------------- 00051 00052 void 00053 initELut (unsigned short eLut[]) 00054 { 00055 for (int i = 0; i < 0x100; i++) 00056 { 00057 int e = (i & 0x0ff) - (127 - 15); 00058 00059 if (e <= 0 || e >= 30) 00060 { 00061 // 00062 // Special case 00063 // 00064 00065 eLut[i] = 0; 00066 eLut[i | 0x100] = 0; 00067 } 00068 else 00069 { 00070 // 00071 // Common case - normalized half, no exponent overflow possible 00072 // 00073 00074 eLut[i] = (e << 10); 00075 eLut[i | 0x100] = ((e << 10) | 0x8000); 00076 } 00077 } 00078 } 00079 00080 00081 //------------------------------------------------------------ 00082 // Main - prints the sign-and-exponent conversion lookup table 00083 //------------------------------------------------------------ 00084 00085 int 00086 main () 00087 { 00088 const int tableSize = 1 << 9; 00089 unsigned short eLut[tableSize]; 00090 initELut (eLut); 00091 00092 cout << "//\n" 00093 "// This is an automatically generated file.\n" 00094 "// Do not edit.\n" 00095 "//\n\n"; 00096 00097 cout << "{\n "; 00098 00099 for (int i = 0; i < tableSize; i++) 00100 { 00101 cout << setw (5) << eLut[i] << ", "; 00102 00103 if (i % 8 == 7) 00104 { 00105 cout << "\n"; 00106 00107 if (i < tableSize - 1) 00108 cout << " "; 00109 } 00110 } 00111 00112 cout << "};\n"; 00113 return 0; 00114 }