19e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul/************************************************************************** 29e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2008 VMware, Inc. 49e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * All Rights Reserved. 59e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * 69e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 79e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * copy of this software and associated documentation files (the 89e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * "Software"), to deal in the Software without restriction, including 99e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * without limitation the rights to use, copy, modify, merge, publish, 109e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * distribute, sub license, and/or sell copies of the Software, and to 119e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * permit persons to whom the Software is furnished to do so, subject to 129e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * the following conditions: 139e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * 149e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * The above copyright notice and this permission notice (including the 159e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * next paragraph) shall be included in all copies or substantial portions 169e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * of the Software. 179e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * 189e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 199e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 209e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 229e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 239e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 249e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 259e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * 269e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul **************************************************************************/ 279e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 289e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 299e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul/** 309e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Math utilities and approximations for common math functions. 319e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Reduced precision is usually acceptable in shaders... 32a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul * 33a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul * "fast" is used in the names of functions which are low-precision, 34a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul * or at least lower-precision than the normal C lib functions. 359e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul */ 369e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 379e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 389e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul#ifndef U_MATH_H 399e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul#define U_MATH_H 409e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 419e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 42a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul#include "pipe/p_compiler.h" 439e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 44cbd287f094b4bd7a6030edf97f5330b4c3fa9a5cBrian Paul#include "c99_math.h" 457c1a00174b2bec102030b19b6094ebcab23fe04dDave Airlie#include <assert.h> 46b844c8e039b18a665ce2e80da0e4000708a16362José Fonseca#include <float.h> 474f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include <stdarg.h> 484f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 49c3b66566760dd44eaeed9e4df13687dc3ee69bd9Mathias Fröhlich#include "util/bitscan.h" 504f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 51237dcb4aa7c39c59bfd225ae3d73caf709be216dMark Janes#ifdef __cplusplus 52237dcb4aa7c39c59bfd225ae3d73caf709be216dMark Janesextern "C" { 53237dcb4aa7c39c59bfd225ae3d73caf709be216dMark Janes#endif 54237dcb4aa7c39c59bfd225ae3d73caf709be216dMark Janes 55237dcb4aa7c39c59bfd225ae3d73caf709be216dMark Janes 5652427f0ba703f933b70d669ae565c7aeb733236dJosé Fonseca#ifndef M_SQRT2 5752427f0ba703f933b70d669ae565c7aeb733236dJosé Fonseca#define M_SQRT2 1.41421356237309504880 5852427f0ba703f933b70d669ae565c7aeb733236dJosé Fonseca#endif 5952427f0ba703f933b70d669ae565c7aeb733236dJosé Fonseca 608415d06d90a197e16554dab98d160334fd9f9f93José Fonseca#define POW2_TABLE_SIZE_LOG2 9 618415d06d90a197e16554dab98d160334fd9f9f93José Fonseca#define POW2_TABLE_SIZE (1 << POW2_TABLE_SIZE_LOG2) 628415d06d90a197e16554dab98d160334fd9f9f93José Fonseca#define POW2_TABLE_OFFSET (POW2_TABLE_SIZE/2) 638415d06d90a197e16554dab98d160334fd9f9f93José Fonseca#define POW2_TABLE_SCALE ((float)(POW2_TABLE_SIZE/2)) 649e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paulextern float pow2_table[POW2_TABLE_SIZE]; 659e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 669e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 672e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul/** 682e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * Initialize math module. This should be called before using any 692e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * other functions in this module. 702e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 719e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paulextern void 729e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paulutil_init_math(void); 739e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 749e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 754f25420bdd834e81a3e22733304efc5261c2998aBrian Paulunion fi { 764f25420bdd834e81a3e22733304efc5261c2998aBrian Paul float f; 778415d06d90a197e16554dab98d160334fd9f9f93José Fonseca int32_t i; 788415d06d90a197e16554dab98d160334fd9f9f93José Fonseca uint32_t ui; 794f25420bdd834e81a3e22733304efc5261c2998aBrian Paul}; 809e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 819e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 82d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonunion di { 83d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton double d; 84d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton int64_t i; 85d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton uint64_t ui; 86d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton}; 87d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 88d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 899e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul/** 90f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure * Extract the IEEE float32 exponent. 91f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure */ 92a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline signed 931e594d4f5c03ff9a59ab9a692ef94d122b491211Brian Paulutil_get_float32_exponent(float x) 941e594d4f5c03ff9a59ab9a692ef94d122b491211Brian Paul{ 95f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure union fi f; 96f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 97f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure f.f = x; 98f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 99f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure return ((f.ui >> 23) & 0xff) - 127; 100f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure} 101f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 102f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure 103f9e2c24326869542c9b43220f63dd9841c6de38fMatthew McClure/** 1048415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * Fast version of 2^x 1059e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Identity: exp2(a + b) = exp2(a) * exp2(b) 1068415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * Let ipart = int(x) 1078415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * Let fpart = x - ipart; 1088415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * So, exp2(x) = exp2(ipart) * exp2(fpart) 1099e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Compute exp2(ipart) with i << ipart 1109e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul * Compute exp2(fpart) with lookup table. 1119e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul */ 112a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 1138415d06d90a197e16554dab98d160334fd9f9f93José Fonsecautil_fast_exp2(float x) 1149e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul{ 1158415d06d90a197e16554dab98d160334fd9f9f93José Fonseca int32_t ipart; 1168415d06d90a197e16554dab98d160334fd9f9f93José Fonseca float fpart, mpart; 1178415d06d90a197e16554dab98d160334fd9f9f93José Fonseca union fi epart; 118c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 1198415d06d90a197e16554dab98d160334fd9f9f93José Fonseca if(x > 129.00000f) 1208415d06d90a197e16554dab98d160334fd9f9f93José Fonseca return 3.402823466e+38f; 121c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 1222e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul if (x < -126.99999f) 1238415d06d90a197e16554dab98d160334fd9f9f93José Fonseca return 0.0f; 1248415d06d90a197e16554dab98d160334fd9f9f93José Fonseca 1258415d06d90a197e16554dab98d160334fd9f9f93José Fonseca ipart = (int32_t) x; 1268415d06d90a197e16554dab98d160334fd9f9f93José Fonseca fpart = x - (float) ipart; 127c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 1288415d06d90a197e16554dab98d160334fd9f9f93José Fonseca /* same as 1298415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * epart.f = (float) (1 << ipart) 1302e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * but faster and without integer overflow for ipart > 31 1312e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 1328415d06d90a197e16554dab98d160334fd9f9f93José Fonseca epart.i = (ipart + 127 ) << 23; 133c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 1348415d06d90a197e16554dab98d160334fd9f9f93José Fonseca mpart = pow2_table[POW2_TABLE_OFFSET + (int)(fpart * POW2_TABLE_SCALE)]; 135c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 1368415d06d90a197e16554dab98d160334fd9f9f93José Fonseca return epart.f * mpart; 1379e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul} 1389e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1399e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1409e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul/** 1418415d06d90a197e16554dab98d160334fd9f9f93José Fonseca * Fast approximation to exp(x). 1429e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul */ 143a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 1448415d06d90a197e16554dab98d160334fd9f9f93José Fonsecautil_fast_exp(float x) 1459e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul{ 1468415d06d90a197e16554dab98d160334fd9f9f93José Fonseca const float k = 1.44269f; /* = log2(e) */ 1478415d06d90a197e16554dab98d160334fd9f9f93José Fonseca return util_fast_exp2(k * x); 1489e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul} 1499e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1509e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1517e584a70c492698be18bf4d6372b50d1a1c38385Brian Paul#define LOG2_TABLE_SIZE_LOG2 16 1527e584a70c492698be18bf4d6372b50d1a1c38385Brian Paul#define LOG2_TABLE_SCALE (1 << LOG2_TABLE_SIZE_LOG2) 1537e584a70c492698be18bf4d6372b50d1a1c38385Brian Paul#define LOG2_TABLE_SIZE (LOG2_TABLE_SCALE + 1) 1548415d06d90a197e16554dab98d160334fd9f9f93José Fonsecaextern float log2_table[LOG2_TABLE_SIZE]; 1558415d06d90a197e16554dab98d160334fd9f9f93José Fonseca 1568415d06d90a197e16554dab98d160334fd9f9f93José Fonseca 1572e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul/** 1582e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * Fast approximation to log2(x). 1592e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 160a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 1618415d06d90a197e16554dab98d160334fd9f9f93José Fonsecautil_fast_log2(float x) 1629e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul{ 1639e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul union fi num; 1648415d06d90a197e16554dab98d160334fd9f9f93José Fonseca float epart, mpart; 1658415d06d90a197e16554dab98d160334fd9f9f93José Fonseca num.f = x; 1668415d06d90a197e16554dab98d160334fd9f9f93José Fonseca epart = (float)(((num.i & 0x7f800000) >> 23) - 127); 1677e584a70c492698be18bf4d6372b50d1a1c38385Brian Paul /* mpart = log2_table[mantissa*LOG2_TABLE_SCALE + 0.5] */ 1687e584a70c492698be18bf4d6372b50d1a1c38385Brian Paul mpart = log2_table[((num.i & 0x007fffff) + (1 << (22 - LOG2_TABLE_SIZE_LOG2))) >> (23 - LOG2_TABLE_SIZE_LOG2)]; 1698415d06d90a197e16554dab98d160334fd9f9f93José Fonseca return epart + mpart; 1709e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul} 1719e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1729e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 1732e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul/** 1742e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * Fast approximation to x^y. 1752e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 176a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 1779e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paulutil_fast_pow(float x, float y) 1789e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul{ 1799e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul return util_fast_exp2(util_fast_log2(x) * y); 1809e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul} 1819e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 182b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell/* Note that this counts zero as a power of two. 183b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell */ 184a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 185b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwellutil_is_power_of_two( unsigned v ) 186b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell{ 187b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell return (v & (v-1)) == 0; 188b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell} 189b1cc196e6d18494348c2974aad5d85d1b8281ce0Keith Whitwell 1909e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul 191a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul/** 192a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul * Floor(x), returned as int. 193a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul */ 194a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 195a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paulutil_ifloor(float f) 196a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul{ 197a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul int ai, bi; 198a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul double af, bf; 199a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul union fi u; 2002e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul af = (3 << 22) + 0.5 + (double) f; 2012e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul bf = (3 << 22) + 0.5 - (double) f; 202a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul u.f = (float) af; ai = u.i; 203a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul u.f = (float) bf; bi = u.i; 204a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul return (ai - bi) >> 1; 205a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul} 206a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul 207a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul 208a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul/** 209a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul * Round float to nearest int. 210a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul */ 211a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 212a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paulutil_iround(float f) 213a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul{ 214a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul#if defined(PIPE_CC_GCC) && defined(PIPE_ARCH_X86) 215a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul int r; 216a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul __asm__ ("fistpl %0" : "=m" (r) : "t" (f) : "st"); 217a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul return r; 218a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul#elif defined(PIPE_CC_MSVC) && defined(PIPE_ARCH_X86) 219a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul int r; 220a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul _asm { 2212e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul fld f 2222e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul fistp r 2232e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul } 224a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul return r; 225a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul#else 226a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul if (f >= 0.0f) 227a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul return (int) (f + 0.5f); 228a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul else 229a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul return (int) (f - 0.5f); 230a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul#endif 231a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul} 232a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul 233a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul 234b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca/** 235b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca * Approximate floating point comparison 236b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca */ 237a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 238b57e18c35cf651addecdfb2339768fbb29c257f5José Fonsecautil_is_approx(float a, float b, float tol) 239b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca{ 24029ef7a9f19265308e7852c0f8920e0f520f08df3Matt Turner return fabsf(b - a) <= tol; 241b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca} 242b57e18c35cf651addecdfb2339768fbb29c257f5José Fonseca 243a22bdd42d77bc858814f37d657fa940a520dbe56Brian Paul 2444f25420bdd834e81a3e22733304efc5261c2998aBrian Paul/** 245d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * util_is_X_inf_or_nan = test if x is NaN or +/- Inf 246d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * util_is_X_nan = test if x is NaN 247d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * util_X_inf_sign = return +1 for +Inf, -1 for -Inf, or 0 for not Inf 248d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * 249d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * NaN can be checked with x != x, however this fails with the fast math flag 250d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton **/ 251d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 252d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 253d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton/** 254d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * Single-float 2553705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul */ 256a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 2573705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paulutil_is_inf_or_nan(float x) 2583705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul{ 2593705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul union fi tmp; 2603705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul tmp.f = x; 261d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (tmp.ui & 0x7f800000) == 0x7f800000; 262d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 263d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 264d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 265a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 266d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_is_nan(float x) 267d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 268d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton union fi tmp; 269d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton tmp.f = x; 270d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (tmp.ui & 0x7fffffff) > 0x7f800000; 271d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 272d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 273d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 274a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 275d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_inf_sign(float x) 276d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 277d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton union fi tmp; 278d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton tmp.f = x; 279d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton if ((tmp.ui & 0x7fffffff) != 0x7f800000) { 280d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return 0; 281d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton } 282d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 283d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (x < 0) ? -1 : 1; 284d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 285d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 286d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 287d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton/** 288d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * Double-float 289d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton */ 290a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 291d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_is_double_inf_or_nan(double x) 292d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 293d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton union di tmp; 294d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton tmp.d = x; 29563e0e4b8f5a37f5f6a1b9a783f201d748eb312e8José Fonseca return (tmp.ui & 0x7ff0000000000000ULL) == 0x7ff0000000000000ULL; 296d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 297d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 298d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 299a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 300d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_is_double_nan(double x) 301d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 302d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton union di tmp; 303d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton tmp.d = x; 30463e0e4b8f5a37f5f6a1b9a783f201d748eb312e8José Fonseca return (tmp.ui & 0x7fffffffffffffffULL) > 0x7ff0000000000000ULL; 305d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 306d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 307d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 308a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 309d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_double_inf_sign(double x) 310d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 311d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton union di tmp; 312d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton tmp.d = x; 31363e0e4b8f5a37f5f6a1b9a783f201d748eb312e8José Fonseca if ((tmp.ui & 0x7fffffffffffffffULL) != 0x7ff0000000000000ULL) { 314d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return 0; 315d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton } 316d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 317d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (x < 0) ? -1 : 1; 318d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 319d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 320d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 321d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton/** 322d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton * Half-float 323d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton */ 324a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 325d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_is_half_inf_or_nan(int16_t x) 326d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 327d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (x & 0x7c00) == 0x7c00; 328d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 329d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 330d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 331a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline boolean 332d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_is_half_nan(int16_t x) 333d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 334d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (x & 0x7fff) > 0x7c00; 335d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton} 336d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 337d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 338a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 339d069d8ef3835c65d1fac755b26080f284f7b7b49James Bentonutil_half_inf_sign(int16_t x) 340d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton{ 341d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton if ((x & 0x7fff) != 0x7c00) { 342d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return 0; 343d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton } 344d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton 345d069d8ef3835c65d1fac755b26080f284f7b7b49James Benton return (x < 0) ? -1 : 1; 3463705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul} 3473705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul 3483705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul 3493705d03b0fbe349dee0221d982965a0590bc7cb0Brian Paul/** 3504f25420bdd834e81a3e22733304efc5261c2998aBrian Paul * Return float bits. 3514f25420bdd834e81a3e22733304efc5261c2998aBrian Paul */ 352a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 3534f25420bdd834e81a3e22733304efc5261c2998aBrian Paulfui( float f ) 3544f25420bdd834e81a3e22733304efc5261c2998aBrian Paul{ 3554f25420bdd834e81a3e22733304efc5261c2998aBrian Paul union fi fi; 3564f25420bdd834e81a3e22733304efc5261c2998aBrian Paul fi.f = f; 3574f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return fi.ui; 3584f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} 3594f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 360a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 361bfb0da9fa765242f52dc66a5acb14037ef17be94Eric Anholtuif(uint32_t ui) 362bfb0da9fa765242f52dc66a5acb14037ef17be94Eric Anholt{ 36314b9bf630c23ad060ea8bd12da2f7b18cb4f4101Brian Paul union fi fi; 36414b9bf630c23ad060ea8bd12da2f7b18cb4f4101Brian Paul fi.ui = ui; 36514b9bf630c23ad060ea8bd12da2f7b18cb4f4101Brian Paul return fi.f; 366bfb0da9fa765242f52dc66a5acb14037ef17be94Eric Anholt} 367bfb0da9fa765242f52dc66a5acb14037ef17be94Eric Anholt 3684f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 3692e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul/** 3702e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * Convert ubyte to float in [0, 1]. 3712e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * XXX a 256-entry lookup table would be slightly faster. 3722e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 373a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 3744f25420bdd834e81a3e22733304efc5261c2998aBrian Paulubyte_to_float(ubyte ub) 3754f25420bdd834e81a3e22733304efc5261c2998aBrian Paul{ 3764f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return (float) ub * (1.0f / 255.0f); 3774f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} 3784f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 3794f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 3804f25420bdd834e81a3e22733304efc5261c2998aBrian Paul/** 3814f25420bdd834e81a3e22733304efc5261c2998aBrian Paul * Convert float in [0,1] to ubyte in [0,255] with clamping. 3824f25420bdd834e81a3e22733304efc5261c2998aBrian Paul */ 383a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline ubyte 3844f25420bdd834e81a3e22733304efc5261c2998aBrian Paulfloat_to_ubyte(float f) 3854f25420bdd834e81a3e22733304efc5261c2998aBrian Paul{ 3864f25420bdd834e81a3e22733304efc5261c2998aBrian Paul union fi tmp; 3874f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 3884f25420bdd834e81a3e22733304efc5261c2998aBrian Paul tmp.f = f; 3894f25420bdd834e81a3e22733304efc5261c2998aBrian Paul if (tmp.i < 0) { 3904f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return (ubyte) 0; 3914f25420bdd834e81a3e22733304efc5261c2998aBrian Paul } 392bf2c074a2fb122bafbbe0f3c7978b89685f2698bManfred Ernst else if (tmp.i >= 0x3f800000 /* 1.0f */) { 3934f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return (ubyte) 255; 3944f25420bdd834e81a3e22733304efc5261c2998aBrian Paul } 3954f25420bdd834e81a3e22733304efc5261c2998aBrian Paul else { 3964f25420bdd834e81a3e22733304efc5261c2998aBrian Paul tmp.f = tmp.f * (255.0f/256.0f) + 32768.0f; 3974f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return (ubyte) tmp.i; 3984f25420bdd834e81a3e22733304efc5261c2998aBrian Paul } 3994f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} 4004f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 401a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline float 4028d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airliebyte_to_float_tex(int8_t b) 4038d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie{ 4048d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie return (b == -128) ? -1.0F : b * 1.0F / 127.0F; 4058d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie} 4068d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie 407a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int8_t 4088d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airliefloat_to_byte_tex(float f) 4098d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie{ 4108d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie return (int8_t) (127.0F * f); 4118d62b2aca99ba67f794dd682ed1ec49dc8826390Dave Airlie} 4124f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 413c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin/** 414c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin * Calc log base 2 415c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin */ 416a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 417c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandinutil_logbase2(unsigned n) 418c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin{ 4193492e88090d2d0c0bfbc934963b8772b45fc8880Matt Turner#if defined(HAVE___BUILTIN_CLZ) 420894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return ((sizeof(unsigned) * 8 - 1) - __builtin_clz(n | 1)); 421894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec#else 422f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul unsigned pos = 0; 423f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul if (n >= 1<<16) { n >>= 16; pos += 16; } 424f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul if (n >= 1<< 8) { n >>= 8; pos += 8; } 425f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul if (n >= 1<< 4) { n >>= 4; pos += 4; } 426f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul if (n >= 1<< 2) { n >>= 2; pos += 2; } 427f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul if (n >= 1<< 1) { pos += 1; } 428f62e1f41b4d6047e72222aebbb0b55a508269b0cBrian Paul return pos; 429894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec#endif 430c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin} 431c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 432b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle/** 433b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle * Returns the ceiling of log n base 2, and 0 when n == 0. Equivalently, 434b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle * returns the smallest x such that n <= 2**x. 435b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle */ 436b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnlestatic inline unsigned 437b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnleutil_logbase2_ceil(unsigned n) 438b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle{ 439b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle if (n <= 1) 440b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle return 0; 441b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle 442b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle return 1 + util_logbase2(n - 1); 443b3ebc229dcd5d1cc882443f9b851890b00cd9dbcNicolai Hähnle} 444c1785c19ca0716a7e85777242949a0c33e28988fPatrice Mandin 4452e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul/** 446da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton * Returns the smallest power of two >= x 447da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton */ 448a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 449da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Mantonutil_next_power_of_two(unsigned x) 450da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton{ 4513492e88090d2d0c0bfbc934963b8772b45fc8880Matt Turner#if defined(HAVE___BUILTIN_CLZ) 452894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec if (x <= 1) 453894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return 1; 454da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton 455894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return (1 << ((sizeof(unsigned) * 8) - __builtin_clz(x - 1))); 456894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec#else 457894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec unsigned val = x; 458da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton 459894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec if (x <= 1) 460894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return 1; 461da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton 462894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec if (util_is_power_of_two(x)) 463894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return x; 464894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec 465894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val--; 466894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val = (val >> 1) | val; 467894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val = (val >> 2) | val; 468894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val = (val >> 4) | val; 469894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val = (val >> 8) | val; 470894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val = (val >> 16) | val; 471894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec val++; 472894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec return val; 473894db40f122175ed85e0d32d42296f2d56cf748eBenjamin Bellec#endif 474da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton} 475da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton 476da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton 477da793b743462e84e3bca7a0ed7f24b4c942e0834Younes Manton/** 47815740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul * Return number of bits set in n. 47915740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul */ 480a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 48115740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paulutil_bitcount(unsigned n) 48215740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul{ 4833492e88090d2d0c0bfbc934963b8772b45fc8880Matt Turner#if defined(HAVE___BUILTIN_POPCOUNT) 48415740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul return __builtin_popcount(n); 48515740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul#else 486c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson /* K&R classic bitcount. 487c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson * 488c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson * For each iteration, clear the LSB from the bitfield. 489c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson * Requires only one iteration per set bit, instead of 490c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson * one iteration per bit less than highest set bit. 491c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson */ 492b14cec0b8e98195679eab5afbdba3bb47badccf2Brian Paul unsigned bits; 493b14cec0b8e98195679eab5afbdba3bb47badccf2Brian Paul for (bits = 0; n; bits++) { 494c93dcbfea7b8e1cd0f14a96bc466419bdce7eb30Corbin Simpson n &= n - 1; 49515740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul } 49615740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul return bits; 49715740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul#endif 49815740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul} 49915740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul 500af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák 501a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 502af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšákutil_bitcount64(uint64_t n) 503af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák{ 504af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák#ifdef HAVE___BUILTIN_POPCOUNTLL 505af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák return __builtin_popcountll(n); 506af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák#else 507af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák return util_bitcount(n) + util_bitcount(n >> 32); 508af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák#endif 509af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák} 510af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák 511af4f5a7c97f3ab47bbd21aa7c27d0c0aaf01f959Marek Olšák 512ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin/** 513ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin * Reverse bits in n 514ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin * Algorithm taken from: 515ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin * http://stackoverflow.com/questions/9144800/c-reverse-bits-in-unsigned-integer 516ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin */ 517a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 518ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkinutil_bitreverse(unsigned n) 519ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin{ 520ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin n = ((n >> 1) & 0x55555555u) | ((n & 0x55555555u) << 1); 521ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin n = ((n >> 2) & 0x33333333u) | ((n & 0x33333333u) << 2); 522ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin n = ((n >> 4) & 0x0f0f0f0fu) | ((n & 0x0f0f0f0fu) << 4); 523ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin n = ((n >> 8) & 0x00ff00ffu) | ((n & 0x00ff00ffu) << 8); 524ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin n = ((n >> 16) & 0xffffu) | ((n & 0xffffu) << 16); 525ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin return n; 526ab4927f3e04918fd8a53c2d91be4dfc65fe9782dIlia Mirkin} 52715740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul 52815740eb03ca8fb7eda585c612c1b36ec9df4474aBrian Paul/** 5294a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer * Convert from little endian to CPU byte order. 5304a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer */ 5314a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer 5324a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#ifdef PIPE_ARCH_BIG_ENDIAN 533a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard#define util_le64_to_cpu(x) util_bswap64(x) 5344a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#define util_le32_to_cpu(x) util_bswap32(x) 5354a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#define util_le16_to_cpu(x) util_bswap16(x) 5364a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#else 537a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard#define util_le64_to_cpu(x) (x) 5384a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#define util_le32_to_cpu(x) (x) 5394a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#define util_le16_to_cpu(x) (x) 5404a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer#endif 5414a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer 5429f30685faee90e6ac750876b89504edea0e90050Tom Stellard#define util_cpu_to_le64(x) util_le64_to_cpu(x) 5439f30685faee90e6ac750876b89504edea0e90050Tom Stellard#define util_cpu_to_le32(x) util_le32_to_cpu(x) 5449f30685faee90e6ac750876b89504edea0e90050Tom Stellard#define util_cpu_to_le16(x) util_le16_to_cpu(x) 5454a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer 5464a3be16fd2d126a84ff2f087f2a2900afa19d235Michel Dänzer/** 547e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller * Reverse byte order of a 32 bit word. 548e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller */ 549a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t 550e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumillerutil_bswap32(uint32_t n) 551e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller{ 5523492e88090d2d0c0bfbc934963b8772b45fc8880Matt Turner#if defined(HAVE___BUILTIN_BSWAP32) 553e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller return __builtin_bswap32(n); 554e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller#else 555e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller return (n >> 24) | 556e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller ((n >> 8) & 0x0000ff00) | 557e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller ((n << 8) & 0x00ff0000) | 558e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller (n << 24); 559e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller#endif 560e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller} 561e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller 562a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard/** 563a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard * Reverse byte order of a 64bit word. 564a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard */ 565a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint64_t 566a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellardutil_bswap64(uint64_t n) 567a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard{ 568a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard#if defined(HAVE___BUILTIN_BSWAP64) 569a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard return __builtin_bswap64(n); 570a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard#else 57123080e49c4e209101602ec0630923bc1c7c29689Alon Levy return ((uint64_t)util_bswap32((uint32_t)n) << 32) | 572a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard util_bswap32((n >> 32)); 573a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard#endif 574a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard} 575a9f88e2ae8632189b08f01e8a4166020df8d0d38Tom Stellard 576e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller 577e65258abf52bd1923a547f76bd7346bf5ed1c5c6Christoph Bumiller/** 578fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca * Reverse byte order of a 16 bit word. 579fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca */ 580a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint16_t 581fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonsecautil_bswap16(uint16_t n) 582fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca{ 583fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca return (n >> 8) | 584fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca (n << 8); 585fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca} 586fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca 587a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline void* 588f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellardutil_memcpy_cpu_to_le32(void * restrict dest, const void * restrict src, size_t n) 589f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard{ 590f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard#ifdef PIPE_ARCH_BIG_ENDIAN 591f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard size_t i, e; 5925fe20592d4564a259858802457a79d8016838eb0Tom Stellard assert(n % 4 == 0); 593f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard 594f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard for (i = 0, e = n / 4; i < e; i++) { 595f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard uint32_t * restrict d = (uint32_t* restrict)dest; 596f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard const uint32_t * restrict s = (const uint32_t* restrict)src; 597f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard d[i] = util_bswap32(s[i]); 598f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard } 599f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard return dest; 600f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard#else 601f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard return memcpy(dest, src, n); 602f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard#endif 603f0e0737922061f0eb38d5016c40d86226ee40e61Tom Stellard} 604fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca 605fda9a19b3465e3eb6ef74611a85021055eb78a64José Fonseca/** 6062e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * Clamp X to [MIN, MAX]. 6072e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul * This is a macro to allow float, int, uint, etc. types. 6082e9bf100143c45ed169cc2d9875dc1b528a94ba5Brian Paul */ 6094f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define CLAMP( X, MIN, MAX ) ( (X)<(MIN) ? (MIN) : ((X)>(MAX) ? (MAX) : (X)) ) 6104f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6114f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define MIN2( A, B ) ( (A)<(B) ? (A) : (B) ) 6124f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define MAX2( A, B ) ( (A)>(B) ? (A) : (B) ) 6134f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 614b8de75d53760fb359d10d6f4794f28097210cef4Marek Olšák#define MIN3( A, B, C ) ((A) < (B) ? MIN2(A, C) : MIN2(B, C)) 615b8de75d53760fb359d10d6f4794f28097210cef4Marek Olšák#define MAX3( A, B, C ) ((A) > (B) ? MAX2(A, C) : MAX2(B, C)) 61637ba97421c5cf351e2e3c7c1e41ffd72fb73f7e9Corbin Simpson 617b8de75d53760fb359d10d6f4794f28097210cef4Marek Olšák#define MIN4( A, B, C, D ) ((A) < (B) ? MIN3(A, C, D) : MIN3(B, C, D)) 618b8de75d53760fb359d10d6f4794f28097210cef4Marek Olšák#define MAX4( A, B, C, D ) ((A) > (B) ? MAX3(A, C, D) : MAX3(B, C, D)) 619e826d0e8170028da553d2018b833af7c26b8dc1bKeith Whitwell 6204f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 621ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz/** 622ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz * Align a value, only works pot alignemnts. 623ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz */ 624a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int 6254f25420bdd834e81a3e22733304efc5261c2998aBrian Paulalign(int value, int alignment) 6264f25420bdd834e81a3e22733304efc5261c2998aBrian Paul{ 6274f25420bdd834e81a3e22733304efc5261c2998aBrian Paul return (value + alignment - 1) & ~(alignment - 1); 6284f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} 6294f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6300ba0933f488cbb22ad1a221b0057ac9753130916Marek Olšákstatic inline uint64_t 6310ba0933f488cbb22ad1a221b0057ac9753130916Marek Olšákalign64(uint64_t value, unsigned alignment) 6320ba0933f488cbb22ad1a221b0057ac9753130916Marek Olšák{ 6336db93cd167d3ae04688c192806aad54a05a9d161Marek Olšák return (value + alignment - 1) & ~((uint64_t)alignment - 1); 6340ba0933f488cbb22ad1a221b0057ac9753130916Marek Olšák} 6350ba0933f488cbb22ad1a221b0057ac9753130916Marek Olšák 636ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz/** 637ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz * Works like align but on npot alignments. 638ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz */ 639a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline size_t 640ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantzutil_align_npot(size_t value, size_t alignment) 641ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz{ 642ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz if (value % alignment) 643ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz return value + (alignment - (value % alignment)); 644ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz return value; 645ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz} 646ed3d17e14c1edbbb114e1490bca5e998cd108e86Jakob Bornecrantz 647a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline unsigned 648683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwellu_minify(unsigned value, unsigned levels) 649847fcb645c1d0c69617f0cafe8e6410e13f08fa6Corbin Simpson{ 650683e35f726a182ed9fc6b6d5cb07146eebe14deaKeith Whitwell return MAX2(1, value >> levels); 651847fcb645c1d0c69617f0cafe8e6410e13f08fa6Corbin Simpson} 6524f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6534f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#ifndef COPY_4V 6544f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define COPY_4V( DST, SRC ) \ 6554f25420bdd834e81a3e22733304efc5261c2998aBrian Pauldo { \ 6564f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[0] = (SRC)[0]; \ 6574f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[1] = (SRC)[1]; \ 6584f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[2] = (SRC)[2]; \ 6594f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[3] = (SRC)[3]; \ 6604f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} while (0) 6614f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#endif 6624f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6634f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6644f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#ifndef COPY_4FV 6654f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define COPY_4FV( DST, SRC ) COPY_4V(DST, SRC) 6664f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#endif 6674f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6684f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6694f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#ifndef ASSIGN_4V 6704f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#define ASSIGN_4V( DST, V0, V1, V2, V3 ) \ 6714f25420bdd834e81a3e22733304efc5261c2998aBrian Pauldo { \ 6724f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[0] = (V0); \ 6734f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[1] = (V1); \ 6744f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[2] = (V2); \ 6754f25420bdd834e81a3e22733304efc5261c2998aBrian Paul (DST)[3] = (V3); \ 6764f25420bdd834e81a3e22733304efc5261c2998aBrian Paul} while (0) 6774f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#endif 6784f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 6794f25420bdd834e81a3e22733304efc5261c2998aBrian Paul 680a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline uint32_t 6811e594d4f5c03ff9a59ab9a692ef94d122b491211Brian Paulutil_unsigned_fixed(float value, unsigned frac_bits) 682e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell{ 683c852e960ccb5d2727ccaaf2829e89596a6be3128José Fonseca return value < 0 ? 0 : (uint32_t)(value * (1<<frac_bits)); 684e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell} 685e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell 686a2a1a5805fd617e7f3cc8be44dd79b50da07ebb9Ilia Mirkinstatic inline int32_t 6871e594d4f5c03ff9a59ab9a692ef94d122b491211Brian Paulutil_signed_fixed(float value, unsigned frac_bits) 688e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell{ 689c852e960ccb5d2727ccaaf2829e89596a6be3128José Fonseca return (int32_t)(value * (1<<frac_bits)); 690e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell} 691e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell 69263386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinunsigned 69363386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinutil_fpstate_get(void); 69463386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinunsigned 69563386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinutil_fpstate_set_denorms_to_zero(unsigned current_fpstate); 69663386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinvoid 69763386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusinutil_fpstate_set(unsigned fpstate); 69863386b2f66a6d450889cd5368bc599beb7f1efbfZack Rusin 699e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell 700e7b76000826ff4faf8bf6a834d55b50a2784c9f2Keith Whitwell 701f9c04d55d045b3cf3ffef24f805166e3995096e2Brian Paul#ifdef __cplusplus 702f9c04d55d045b3cf3ffef24f805166e3995096e2Brian Paul} 703f9c04d55d045b3cf3ffef24f805166e3995096e2Brian Paul#endif 704f9c04d55d045b3cf3ffef24f805166e3995096e2Brian Paul 7059e2b867b3f2e9afc9e9f9178788ae07f6be1f3c0Brian Paul#endif /* U_MATH_H */ 706