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