148129Syokota#include "libm.h"
248129Syokota
348129Syokota#if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
448129Syokotalong double sinhl(long double x)
548129Syokota{
660107Sobrien	return sinh(x);
760107Sobrien}
8270229Sse#elif LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384
948129Syokotalong double sinhl(long double x)
1048129Syokota{
1148129Syokota	union ldshape u = {x};
1248129Syokota	unsigned ex = u.i.se & 0x7fff;
1348129Syokota	long double h, t, absx;
1448129Syokota
1548129Syokota	h = 0.5;
1648129Syokota	if (u.i.se & 0x8000)
1748129Syokota		h = -h;
1848129Syokota	/* |x| */
1948129Syokota	u.i.se = ex;
2048129Syokota	absx = u.f;
2148129Syokota
2248129Syokota	/* |x| < log(LDBL_MAX) */
2348129Syokota	if (ex < 0x3fff+13 || (ex == 0x3fff+13 && u.i.m>>32 < 0xb17217f7)) {
2448129Syokota		t = expm1l(absx);
2548129Syokota		if (ex < 0x3fff) {
2648129Syokota			if (ex < 0x3fff-32)
2748129Syokota				return x;
2848129Syokota			return h*(2*t - t*t/(1+t));
29270114Sse		}
3048129Syokota		return h*(t + t/(t+1));
31270114Sse	}
32270114Sse
33270114Sse	/* |x| > log(LDBL_MAX) or nan */
34270114Sse	t = expl(0.5*absx);
35270114Sse	return h*t*t;
36270114Sse}
37270114Sse#elif LDBL_MANT_DIG == 113 && LDBL_MAX_EXP == 16384
38270114Sse// TODO: broken implementation to make things compile
39270114Sselong double sinhl(long double x)
40270114Sse{
41270114Sse	return sinh(x);
42270114Sse}
43270114Sse#endif
44270114Sse