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