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