1# Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4#
5
6# This script generates a function that converts 16-bit precision floating
7# point numbers to 32-bit.
8# It is based on ftp://ftp.fox-toolkit.org/pub/fasthalffloatconversion.pdf.
9
10def convertMantissa(i):
11    if i == 0:
12        return 0
13    elif i < 1024:
14        m = i << 13
15        e = 0
16        while not (m & 0x00800000):
17            e -= 0x00800000
18            m = m << 1
19        m &= ~0x00800000
20        e += 0x38800000
21        return m | e
22    else:
23        return 0x38000000 + ((i - 1024) << 13)
24
25def convertExponent(i):
26    if i == 0:
27        return 0
28    elif i in range(1, 31):
29        return i << 23
30    elif i == 31:
31        return 0x47800000
32    elif i == 32:
33        return 0x80000000
34    elif i in range(33, 63):
35        return 0x80000000 + ((i - 32) << 23)
36    else:
37        return 0xC7800000
38
39def convertOffset(i):
40    if i == 0 or i == 32:
41        return 0
42    else:
43        return 1024
44
45print """//
46// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
47// Use of this source code is governed by a BSD-style license that can be
48// found in the LICENSE file.
49//
50
51// This file is automatically generated.
52
53namespace gl
54{
55"""
56
57print "const static unsigned g_mantissa[2048] = {"
58for i in range(0, 2048):
59    print "    %#010x," % convertMantissa(i)
60print "};\n"
61
62print "const static unsigned g_exponent[64] = {"
63for i in range(0, 64):
64    print "    %#010x," % convertExponent(i)
65print "};\n"
66
67print "const static unsigned g_offset[64] = {"
68for i in range(0, 64):
69    print "    %#010x," % convertOffset(i)
70print "};\n"
71
72print """float float16ToFloat32(unsigned short h)
73{
74    unsigned i32 = g_mantissa[g_offset[h >> 10] + (h & 0x3ff)] + g_exponent[h >> 10];
75    return *(float*) &i32;
76}
77}
78"""
79