gallium: increase table size for fast log/pow functions
authorBrian Paul <brian.paul@tungstengraphics.com>
Fri, 14 Nov 2008 19:55:05 +0000 (12:55 -0700)
committerBrian Paul <brian.paul@tungstengraphics.com>
Fri, 14 Nov 2008 19:58:12 +0000 (12:58 -0700)
The various conformance tests pass now.

src/gallium/auxiliary/util/u_math.c
src/gallium/auxiliary/util/u_math.h

index d1571cd..2811475 100644 (file)
@@ -52,7 +52,7 @@ init_log2_table(void)
 {
    unsigned i;
    for (i = 0; i < LOG2_TABLE_SIZE; i++)
-      log2_table[i] = (float) log2(1.0 + i * (1.0 / LOG2_TABLE_SIZE));
+      log2_table[i] = (float) log2(1.0 + i * (1.0 / LOG2_TABLE_SCALE));
 }
 
 
index aee69ab..ac11d70 100644 (file)
@@ -246,8 +246,9 @@ util_fast_exp(float x)
 }
 
 
-#define LOG2_TABLE_SIZE_LOG2 8
-#define LOG2_TABLE_SIZE (1 << LOG2_TABLE_SIZE_LOG2)
+#define LOG2_TABLE_SIZE_LOG2 16
+#define LOG2_TABLE_SCALE (1 << LOG2_TABLE_SIZE_LOG2)
+#define LOG2_TABLE_SIZE (LOG2_TABLE_SCALE + 1)
 extern float log2_table[LOG2_TABLE_SIZE];
 
 
@@ -258,7 +259,8 @@ util_fast_log2(float x)
    float epart, mpart;
    num.f = x;
    epart = (float)(((num.i & 0x7f800000) >> 23) - 127);
-   mpart = log2_table[(num.i & 0x007fffff) >> (23 - LOG2_TABLE_SIZE_LOG2)];
+   /* mpart = log2_table[mantissa*LOG2_TABLE_SCALE + 0.5] */
+   mpart = log2_table[((num.i & 0x007fffff) + (1 << (22 - LOG2_TABLE_SIZE_LOG2))) >> (23 - LOG2_TABLE_SIZE_LOG2)];
    return epart + mpart;
 }