#ifndef _MATH_PRIVATE_H #define math_opt_barrier(x) \ ({ __typeof(x) __x; \ if (sizeof (x) <= sizeof (double)) \ __asm ("" : "=x" (__x) : "0" (x)); \ else \ __asm ("" : "=t" (__x) : "0" (x)); \ __x; }) #define math_force_eval(x) \ do \ { \ if (sizeof (x) <= sizeof (double)) \ __asm __volatile ("" : : "x" (x)); \ else \ __asm __volatile ("" : : "f" (x)); \ } \ while (0) #include /* We can do a few things better on x86-64. */ /* Direct movement of float into integer register. */ #undef EXTRACT_WORDS64 #define EXTRACT_WORDS64(i,d) \ do { \ long int i_; \ asm ("movd %1, %0" : "=rm" (i_) : "x" (d)); \ (i) = i_; \ } while (0) /* And the reverse. */ #undef INSERT_WORDS64 #define INSERT_WORDS64(d,i) \ do { \ long int i_ = i; \ asm ("movd %1, %0" : "=x" (d) : "rm" (i_)); \ } while (0) /* Direct movement of float into integer register. */ #undef GET_FLOAT_WORD #define GET_FLOAT_WORD(i,d) \ do { \ int i_; \ asm ("movd %1, %0" : "=rm" (i_) : "x" (d)); \ (i) = i_; \ } while (0) /* And the reverse. */ #undef SET_FLOAT_WORD #define SET_FLOAT_WORD(d,i) \ do { \ int i_ = i; \ asm ("movd %1, %0" : "=x" (d) : "rm" (i_)); \ } while (0) #endif