* this macro.
* Both pointers/offsets are expressed in bytes.
*/
-#define ADD_POINTERS(A, B) ( (A) + (unsigned long) (B) )
+#define ADD_POINTERS(A, B) ( (GLubyte *) (A) + (uintptr_t) (B) )
/**********************************************************************/
/*@}*/
+/**********************************************************************/
+
+
+/**
+ * Sometimes we treat GLfloats as GLints. On x86 systems, moving a float
+ * as a int (thereby using integer registers instead of FP registers) is
+ * a performance win. Typically, this can be done with ordinary casts.
+ * But with gcc's -fstrict-aliasing flag (which defaults to on in gcc 3.0)
+ * these casts generate warnings.
+ * The following union typedef is used to solve that.
+ */
+typedef union { GLfloat f; GLint i; } fi_type;
+
+
/**********************************************************************
* Math macros
#define M_PI (3.1415926536)
#endif
+#ifndef M_E
+#define M_E (2.7182818284590452354)
+#endif
+
+
/* XXX this is a bit of a hack needed for compilation within XFree86 */
#ifndef FLT_MIN
#define FLT_MIN (1.0e-37)
*** IS_NEGATIVE: test if float is negative
***/
#if defined(USE_IEEE)
-#define GET_FLOAT_BITS(x) ((fi_type *) &(x))->i
-#define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) & (1<<31))
+static INLINE int GET_FLOAT_BITS( float x )
+{
+ fi_type fi;
+ fi.f = x;
+ return fi.i;
+}
+#define IS_NEGATIVE(x) (GET_FLOAT_BITS(x) < 0)
#else
#define IS_NEGATIVE(x) (x < 0.0F)
#endif
/***
- *** COPY_FLOAT: copy a float from src to dest, avoid slow FP regs if possible
+ *** COPY_FLOAT: copy a float from src to dest.
***/
-#if defined(USE_IEEE) && !defined(DEBUG)
-#define COPY_FLOAT( dst, src ) \
- ((fi_type *) &(dst))->i = ((fi_type *) (void *) &(src))->i
-#else
#define COPY_FLOAT( dst, src ) (dst) = (src)
-#endif
/***