162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * IEEE754 floating point
462306a36Sopenharmony_ci * double precision internal header file
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci/*
762306a36Sopenharmony_ci * MIPS floating point support
862306a36Sopenharmony_ci * Copyright (C) 1994-2000 Algorithmics Ltd.
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/compiler.h>
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci#include "ieee754int.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#define assert(expr) ((void)0)
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define DP_EBIAS	1023
1862306a36Sopenharmony_ci#define DP_EMIN		(-1022)
1962306a36Sopenharmony_ci#define DP_EMAX		1023
2062306a36Sopenharmony_ci#define DP_FBITS	52
2162306a36Sopenharmony_ci#define DP_MBITS	52
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define DP_MBIT(x)	((u64)1 << (x))
2462306a36Sopenharmony_ci#define DP_HIDDEN_BIT	DP_MBIT(DP_FBITS)
2562306a36Sopenharmony_ci#define DP_SIGN_BIT	DP_MBIT(63)
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define DPSIGN(dp)	(dp.sign)
2862306a36Sopenharmony_ci#define DPBEXP(dp)	(dp.bexp)
2962306a36Sopenharmony_ci#define DPMANT(dp)	(dp.mant)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_cistatic inline int ieee754dp_finite(union ieee754dp x)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	return DPBEXP(x) != DP_EMAX + 1 + DP_EBIAS;
3462306a36Sopenharmony_ci}
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci/* 3bit extended double precision sticky right shift */
3762306a36Sopenharmony_ci#define XDPSRS(v,rs)	\
3862306a36Sopenharmony_ci	((rs > (DP_FBITS+3))?1:((v) >> (rs)) | ((v) << (64-(rs)) != 0))
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci#define XDPSRSX1() \
4162306a36Sopenharmony_ci	(xe++, (xm = (xm >> 1) | (xm & 1)))
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci#define XDPSRS1(v)	\
4462306a36Sopenharmony_ci	(((v) >> 1) | ((v) & 1))
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci/* 32bit * 32bit => 64bit unsigned integer multiplication */
4762306a36Sopenharmony_ci#define DPXMULT(x, y)	((u64)(x) * (u64)y)
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* convert denormal to normalized with extended exponent */
5062306a36Sopenharmony_ci#define DPDNORMx(m,e) \
5162306a36Sopenharmony_ci	while ((m >> DP_FBITS) == 0) { m <<= 1; e--; }
5262306a36Sopenharmony_ci#define DPDNORMX	DPDNORMx(xm, xe)
5362306a36Sopenharmony_ci#define DPDNORMY	DPDNORMx(ym, ye)
5462306a36Sopenharmony_ci#define DPDNORMZ	DPDNORMx(zm, ze)
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_cistatic inline union ieee754dp builddp(int s, int bx, u64 m)
5762306a36Sopenharmony_ci{
5862306a36Sopenharmony_ci	union ieee754dp r;
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	assert((s) == 0 || (s) == 1);
6162306a36Sopenharmony_ci	assert((bx) >= DP_EMIN - 1 + DP_EBIAS
6262306a36Sopenharmony_ci	       && (bx) <= DP_EMAX + 1 + DP_EBIAS);
6362306a36Sopenharmony_ci	assert(((m) >> DP_FBITS) == 0);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	r.sign = s;
6662306a36Sopenharmony_ci	r.bexp = bx;
6762306a36Sopenharmony_ci	r.mant = m;
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	return r;
7062306a36Sopenharmony_ci}
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ciextern union ieee754dp __cold ieee754dp_nanxcpt(union ieee754dp);
7362306a36Sopenharmony_ciextern union ieee754dp ieee754dp_format(int, int, u64);
74