177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#ifndef __DD_HEADER 277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define __DD_HEADER 377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#include <stdint.h> 577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef union { 777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao long double ld; 877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao struct { 977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao double hi; 1077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao double lo; 1177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao }s; 1277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao}DD; 1377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaotypedef union { 1577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao double d; 1677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao uint64_t x; 1777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} doublebits; 1877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 1977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#define LOWORDER(xy,xHi,xLo,yHi,yLo) \ 2077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao (((((xHi)*(yHi) - (xy)) + (xHi)*(yLo)) + (xLo)*(yHi)) + (xLo)*(yLo)) 2177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 2277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostatic inline double __attribute__((always_inline)) 2377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaofabs(double x) 2477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 2577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao doublebits result = { .d = x }; 2677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao result.x &= UINT64_C(0x7fffffffffffffff); 2777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return result.d; 2877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 2977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostatic inline double __attribute__((always_inline)) 3177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaohigh26bits(double x) 3277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 3377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao doublebits result = { .d = x }; 3477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao result.x &= UINT64_C(0xfffffffff8000000); 3577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return result.d; 3677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 3777ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 3877ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaostatic inline int __attribute__((always_inline)) 3977ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liaodifferent_sign(double x, double y) 4077ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao{ 4177ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao doublebits xsignbit = { .d = x }, ysignbit = { .d = y }; 4277ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao int result = (int)(xsignbit.x >> 63) ^ (int)(ysignbit.x >> 63); 4377ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao return result; 4477ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao} 4577ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao 4677ed6142daed1e068fbda64405d0de9845e40e1Shih-wei Liao#endif /* __DD_HEADER */ 47