Edit

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

Branch :

  • Show log

    Commit

  • Author : hendrikw
    Date : 2015-09-25 11:28:50
    Hash : 75782629
    Message : Fix possible compiler errors on linux Change-Id: Ifc45446c749690eddc406f66f144304262f04664 Reviewed-on: https://chromium-review.googlesource.com/302478 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Tested-by: Corentin Wallez <cwallez@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);
    }
    }
    """