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