Merge branch 'llvm-cliptest-viewport'
[mesa.git] / src / gallium / auxiliary / util / u_math.h
index c4faec671cb9a893c2997857424574374f76aabb..37294b7203f1716df9f7bcdcfcfc026cbbd39efc 100644 (file)
@@ -118,6 +118,11 @@ __inline double __cdecl atan2(double val)
 #endif
 
 
+#ifndef M_SQRT2
+#define M_SQRT2 1.41421356237309504880
+#endif
+
+
 #if defined(_MSC_VER) 
 
 #if _MSC_VER < 1400 && !defined(__cplusplus) || defined(PIPE_SUBSYSTEM_WINDOWS_CE)
@@ -168,6 +173,9 @@ static INLINE float logf( float f )
 #undef logf
 #define logf(x) ((float)log((double)(x)))
 #endif /* logf */
+
+#define isfinite(x) _finite((double)(x))
+#define isnan(x) _isnan((double)(x))
 #endif
 
 static INLINE double log2( double x )
@@ -335,26 +343,25 @@ util_iround(float f)
 }
 
 
-
 /**
- * Test if x is NaN or +/- infinity.
+ * Approximate floating point comparison
  */
 static INLINE boolean
-util_is_inf_or_nan(float x)
+util_is_approx(float a, float b, float tol)
 {
-   union fi tmp;
-   tmp.f = x;
-   return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31);
+   return fabs(b - a) <= tol;
 }
 
 
 /**
- * Test whether x is a power of two.
+ * Test if x is NaN or +/- infinity.
  */
 static INLINE boolean
-util_is_pot(unsigned x)
+util_is_inf_or_nan(float x)
 {
-   return (x & (x - 1)) == 0;
+   union fi tmp;
+   tmp.f = x;
+   return !(int)((unsigned int)((tmp.i & 0x7fffffff)-0x7f800000) >> 31);
 }
 
 
@@ -506,7 +513,7 @@ util_bitcount(unsigned n)
     * one iteration per bit less than highest set bit.
     */
    unsigned bits = 0;
-   for (bits, n, bits++) {
+   for (bits; n; bits++) {
       n &= n - 1;
    }
    return bits;
@@ -520,7 +527,7 @@ util_bitcount(unsigned n)
 static INLINE uint32_t
 util_bswap32(uint32_t n)
 {
-#if defined(PIPE_CC_GCC)
+#if defined(PIPE_CC_GCC) && (PIPE_CC_GCC_VERSION >= 403)
    return __builtin_bswap32(n);
 #else
    return (n >> 24) |
@@ -531,6 +538,17 @@ util_bswap32(uint32_t n)
 }
 
 
+/**
+ * Reverse byte order of a 16 bit word.
+ */
+static INLINE uint16_t
+util_bswap16(uint16_t n)
+{
+   return (n >> 8) |
+          (n << 8);
+}
+
+
 /**
  * Clamp X to [MIN, MAX].
  * This is a macro to allow float, int, uint, etc. types.
@@ -543,13 +561,30 @@ util_bswap32(uint32_t n)
 #define MIN3( A, B, C ) MIN2( MIN2( A, B ), C )
 #define MAX3( A, B, C ) MAX2( MAX2( A, B ), C )
 
+#define MIN4( A, B, C, D ) MIN2( MIN2( A, B ), MIN2(C, D) )
+#define MAX4( A, B, C, D ) MAX2( MAX2( A, B ), MAX2(C, D) )
 
+
+/**
+ * Align a value, only works pot alignemnts.
+ */
 static INLINE int
 align(int value, int alignment)
 {
    return (value + alignment - 1) & ~(alignment - 1);
 }
 
+/**
+ * Works like align but on npot alignments.
+ */
+static INLINE size_t
+util_align_npot(size_t value, size_t alignment)
+{
+   if (value % alignment)
+      return value + (alignment - (value % alignment));
+   return value;
+}
+
 static INLINE unsigned
 u_minify(unsigned value, unsigned levels)
 {
@@ -583,6 +618,18 @@ do {                                     \
 #endif
 
 
+static INLINE uint32_t util_unsigned_fixed(float value, unsigned frac_bits)
+{
+   return value < 0 ? 0 : (uint32_t)(value * (1<<frac_bits));
+}
+
+static INLINE int32_t util_signed_fixed(float value, unsigned frac_bits)
+{
+   return (int32_t)(value * (1<<frac_bits));
+}
+
+
+
 #ifdef __cplusplus
 }
 #endif