1b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#ifndef __DD_HEADER 2b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#define __DD_HEADER 3b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 4dbaa3974d4c012ad500a790be5e51ce66188d15cDaniel Dunbar#include "../int_lib.h" 5b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 6b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbartypedef union { 7b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar long double ld; 8b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar struct { 9b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double hi; 10b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double lo; 118bf1e094893cb24796137b47ee0d46d18d299996Edward O'Callaghan }s; 128bf1e094893cb24796137b47ee0d46d18d299996Edward O'Callaghan}DD; 13b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 14b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbartypedef union { 15b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar double d; 16b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar uint64_t x; 17b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} doublebits; 18b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 19b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar#define LOWORDER(xy,xHi,xLo,yHi,yLo) \ 20b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar (((((xHi)*(yHi) - (xy)) + (xHi)*(yLo)) + (xLo)*(yHi)) + (xLo)*(yLo)) 21b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 22b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarstatic inline double __attribute__((always_inline)) 23b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarfabs(double x) 24b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 25b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar doublebits result = { .d = x }; 26b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar result.x &= UINT64_C(0x7fffffffffffffff); 27b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return result.d; 28b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 29b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 30b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarstatic inline double __attribute__((always_inline)) 31b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarhigh26bits(double x) 32b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 33b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar doublebits result = { .d = x }; 34b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar result.x &= UINT64_C(0xfffffffff8000000); 35b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return result.d; 36b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 37b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 38b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbarstatic inline int __attribute__((always_inline)) 39b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbardifferent_sign(double x, double y) 40b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar{ 41b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar doublebits xsignbit = { .d = x }, ysignbit = { .d = y }; 42b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar int result = (int)(xsignbit.x >> 63) ^ (int)(ysignbit.x >> 63); 43b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar return result; 44b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar} 45b3a6901e66f55b35aa9e01bcb24134e6a65ea004Daniel Dunbar 468bf1e094893cb24796137b47ee0d46d18d299996Edward O'Callaghan#endif /* __DD_HEADER */ 47