michael@0: # Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. michael@0: # Use of this source code is governed by a BSD-style license that can be michael@0: # found in the LICENSE file. michael@0: # michael@0: michael@0: # This script generates a function that converts 16-bit precision floating michael@0: # point numbers to 32-bit. michael@0: # It is based on ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf. michael@0: michael@0: def convertMantissa(i): michael@0: if i == 0: michael@0: return 0 michael@0: elif i < 1024: michael@0: m = i << 13 michael@0: e = 0 michael@0: while not (m & 0x00800000): michael@0: e -= 0x00800000 michael@0: m = m << 1 michael@0: m &= ~0x00800000 michael@0: e += 0x38800000 michael@0: return m | e michael@0: else: michael@0: return 0x38000000 + ((i - 1024) << 13) michael@0: michael@0: def convertExponent(i): michael@0: if i == 0: michael@0: return 0 michael@0: elif i in range(1, 31): michael@0: return i << 23 michael@0: elif i == 31: michael@0: return 0x47800000 michael@0: elif i == 32: michael@0: return 0x80000000 michael@0: elif i in range(33, 63): michael@0: return 0x80000000 + ((i - 32) << 23) michael@0: else: michael@0: return 0xC7800000 michael@0: michael@0: def convertOffset(i): michael@0: if i == 0 or i == 32: michael@0: return 0 michael@0: else: michael@0: return 1024 michael@0: michael@0: print """// michael@0: // Copyright (c) 2012 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // This file is automatically generated. michael@0: michael@0: namespace gl michael@0: { michael@0: """ michael@0: michael@0: print "const static unsigned g_mantissa[2048] = {" michael@0: for i in range(0, 2048): michael@0: print " %#010x," % convertMantissa(i) michael@0: print "};\n" michael@0: michael@0: print "const static unsigned g_exponent[64] = {" michael@0: for i in range(0, 64): michael@0: print " %#010x," % convertExponent(i) michael@0: print "};\n" michael@0: michael@0: print "const static unsigned g_offset[64] = {" michael@0: for i in range(0, 64): michael@0: print " %#010x," % convertOffset(i) michael@0: print "};\n" michael@0: michael@0: print """float float16ToFloat32(unsigned short h) michael@0: { michael@0: unsigned i32 = g_mantissa[g_offset[h >> 10] + (h & 0x3ff)] + g_exponent[h >> 10]; michael@0: return *(float*) &i32; michael@0: } michael@0: } michael@0: """