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