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