1214152Sed#ifndef __DD_HEADER 2214152Sed#define __DD_HEADER 3214152Sed 4236011Smarius#include "../int_lib.h" 5214152Sed 6214152Sedtypedef union { 7214152Sed long double ld; 8214152Sed struct { 9214152Sed double hi; 10214152Sed double lo; 11214152Sed }s; 12214152Sed}DD; 13214152Sed 14214152Sedtypedef union { 15214152Sed double d; 16214152Sed uint64_t x; 17214152Sed} doublebits; 18214152Sed 19214152Sed#define LOWORDER(xy,xHi,xLo,yHi,yLo) \ 20214152Sed (((((xHi)*(yHi) - (xy)) + (xHi)*(yLo)) + (xLo)*(yHi)) + (xLo)*(yLo)) 21214152Sed 22214152Sedstatic inline double __attribute__((always_inline)) 23214152Sedfabs(double x) 24214152Sed{ 25214152Sed doublebits result = { .d = x }; 26214152Sed result.x &= UINT64_C(0x7fffffffffffffff); 27214152Sed return result.d; 28214152Sed} 29214152Sed 30214152Sedstatic inline double __attribute__((always_inline)) 31214152Sedhigh26bits(double x) 32214152Sed{ 33214152Sed doublebits result = { .d = x }; 34214152Sed result.x &= UINT64_C(0xfffffffff8000000); 35214152Sed return result.d; 36214152Sed} 37214152Sed 38214152Sedstatic inline int __attribute__((always_inline)) 39214152Seddifferent_sign(double x, double y) 40214152Sed{ 41214152Sed doublebits xsignbit = { .d = x }, ysignbit = { .d = y }; 42214152Sed int result = (int)(xsignbit.x >> 63) ^ (int)(ysignbit.x >> 63); 43214152Sed return result; 44214152Sed} 45214152Sed 46214152Sed#endif /* __DD_HEADER */ 47