Edit

kc3-lang/angle/src/common/Float16ToFloat32.py

Branch :

  • Show log

    Commit

  • Author : Geoff Lang
    Date : 2019-05-06 13:15:35
    Hash : d7d42395
    Message : Format all of ANGLE's python code. BUG=angleproject:3421 Change-Id: I1d7282ac513c046de5d8ed87f7789290780d30a6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1595440 Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Geoff Lang <geofflang@chromium.org>

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