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