xref: /linux/arch/mips/math-emu/dp_maddf.c (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1ea65cc9bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2e24c3becSMarkos Chandras /*
3e24c3becSMarkos Chandras  * IEEE754 floating point arithmetic
4e24c3becSMarkos Chandras  * double precision: MADDF.f (Fused Multiply Add)
5e24c3becSMarkos Chandras  * MADDF.fmt: FPR[fd] = FPR[fd] + (FPR[fs] x FPR[ft])
6e24c3becSMarkos Chandras  *
7e24c3becSMarkos Chandras  * MIPS floating point support
8e24c3becSMarkos Chandras  * Copyright (C) 2015 Imagination Technologies, Ltd.
9e24c3becSMarkos Chandras  * Author: Markos Chandras <markos.chandras@imgtec.com>
10e24c3becSMarkos Chandras  */
11e24c3becSMarkos Chandras 
12e24c3becSMarkos Chandras #include "ieee754dp.h"
13e24c3becSMarkos Chandras 
14d728f670SPaul Burton 
152cfa5825SDouglas Leung /* 128 bits shift right logical with rounding. */
srl128(u64 * hptr,u64 * lptr,int count)1695306f04SAleksandar Markovic static void srl128(u64 *hptr, u64 *lptr, int count)
172cfa5825SDouglas Leung {
182cfa5825SDouglas Leung 	u64 low;
192cfa5825SDouglas Leung 
202cfa5825SDouglas Leung 	if (count >= 128) {
212cfa5825SDouglas Leung 		*lptr = *hptr != 0 || *lptr != 0;
222cfa5825SDouglas Leung 		*hptr = 0;
232cfa5825SDouglas Leung 	} else if (count >= 64) {
242cfa5825SDouglas Leung 		if (count == 64) {
252cfa5825SDouglas Leung 			*lptr = *hptr | (*lptr != 0);
262cfa5825SDouglas Leung 		} else {
272cfa5825SDouglas Leung 			low = *lptr;
282cfa5825SDouglas Leung 			*lptr = *hptr >> (count - 64);
292cfa5825SDouglas Leung 			*lptr |= (*hptr << (128 - count)) != 0 || low != 0;
302cfa5825SDouglas Leung 		}
312cfa5825SDouglas Leung 		*hptr = 0;
322cfa5825SDouglas Leung 	} else {
332cfa5825SDouglas Leung 		low = *lptr;
342cfa5825SDouglas Leung 		*lptr = low >> count | *hptr << (64 - count);
352cfa5825SDouglas Leung 		*lptr |= (low << (64 - count)) != 0;
362cfa5825SDouglas Leung 		*hptr = *hptr >> count;
372cfa5825SDouglas Leung 	}
382cfa5825SDouglas Leung }
392cfa5825SDouglas Leung 
_dp_maddf(union ieee754dp z,union ieee754dp x,union ieee754dp y,enum maddf_flags flags)40d728f670SPaul Burton static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
41d728f670SPaul Burton 				 union ieee754dp y, enum maddf_flags flags)
42e24c3becSMarkos Chandras {
43e24c3becSMarkos Chandras 	int re;
44e24c3becSMarkos Chandras 	int rs;
45a58f85b5SAleksandar Markovic 	unsigned int lxm;
46a58f85b5SAleksandar Markovic 	unsigned int hxm;
47a58f85b5SAleksandar Markovic 	unsigned int lym;
48a58f85b5SAleksandar Markovic 	unsigned int hym;
49e24c3becSMarkos Chandras 	u64 lrm;
50e24c3becSMarkos Chandras 	u64 hrm;
512cfa5825SDouglas Leung 	u64 lzm;
522cfa5825SDouglas Leung 	u64 hzm;
53e24c3becSMarkos Chandras 	u64 t;
54e24c3becSMarkos Chandras 	u64 at;
55e24c3becSMarkos Chandras 	int s;
56e24c3becSMarkos Chandras 
57e24c3becSMarkos Chandras 	COMPXDP;
58e24c3becSMarkos Chandras 	COMPYDP;
59e2d11e1aSPaul Burton 	COMPZDP;
60e24c3becSMarkos Chandras 
61e24c3becSMarkos Chandras 	EXPLODEXDP;
62e24c3becSMarkos Chandras 	EXPLODEYDP;
63e2d11e1aSPaul Burton 	EXPLODEZDP;
64e24c3becSMarkos Chandras 
65e24c3becSMarkos Chandras 	FLUSHXDP;
66e24c3becSMarkos Chandras 	FLUSHYDP;
67e2d11e1aSPaul Burton 	FLUSHZDP;
68e24c3becSMarkos Chandras 
69e24c3becSMarkos Chandras 	ieee754_clearcx();
70e24c3becSMarkos Chandras 
71ece276deSJiaxun Yang 	rs = xs ^ ys;
72ece276deSJiaxun Yang 	if (flags & MADDF_NEGATE_PRODUCT)
73ece276deSJiaxun Yang 		rs ^= 1;
74ece276deSJiaxun Yang 	if (flags & MADDF_NEGATE_ADDITION)
75ece276deSJiaxun Yang 		zs ^= 1;
76ece276deSJiaxun Yang 
77e840be6eSAleksandar Markovic 	/*
78e840be6eSAleksandar Markovic 	 * Handle the cases when at least one of x, y or z is a NaN.
79e840be6eSAleksandar Markovic 	 * Order of precedence is sNaN, qNaN and z, x, y.
80e840be6eSAleksandar Markovic 	 */
81e840be6eSAleksandar Markovic 	if (zc == IEEE754_CLASS_SNAN)
82e24c3becSMarkos Chandras 		return ieee754dp_nanxcpt(z);
83e840be6eSAleksandar Markovic 	if (xc == IEEE754_CLASS_SNAN)
84e24c3becSMarkos Chandras 		return ieee754dp_nanxcpt(x);
85e840be6eSAleksandar Markovic 	if (yc == IEEE754_CLASS_SNAN)
86e840be6eSAleksandar Markovic 		return ieee754dp_nanxcpt(y);
87e840be6eSAleksandar Markovic 	if (zc == IEEE754_CLASS_QNAN)
88e840be6eSAleksandar Markovic 		return z;
89e840be6eSAleksandar Markovic 	if (xc == IEEE754_CLASS_QNAN)
90e840be6eSAleksandar Markovic 		return x;
91e840be6eSAleksandar Markovic 	if (yc == IEEE754_CLASS_QNAN)
92e24c3becSMarkos Chandras 		return y;
93e24c3becSMarkos Chandras 
94e840be6eSAleksandar Markovic 	if (zc == IEEE754_CLASS_DNORM)
95e840be6eSAleksandar Markovic 		DPDNORMZ;
96e840be6eSAleksandar Markovic 	/* ZERO z cases are handled separately below */
97e24c3becSMarkos Chandras 
98e840be6eSAleksandar Markovic 	switch (CLPAIR(xc, yc)) {
99e24c3becSMarkos Chandras 
100e24c3becSMarkos Chandras 	/*
101e24c3becSMarkos Chandras 	 * Infinity handling
102e24c3becSMarkos Chandras 	 */
103e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
104e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
105e24c3becSMarkos Chandras 		ieee754_setcx(IEEE754_INVALID_OPERATION);
106e24c3becSMarkos Chandras 		return ieee754dp_indef();
107e24c3becSMarkos Chandras 
108e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
109e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
110e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
111e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
112e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
113ece276deSJiaxun Yang 		if ((zc == IEEE754_CLASS_INF) && (zs != rs)) {
1140c64fe63SAleksandar Markovic 			/*
1150c64fe63SAleksandar Markovic 			 * Cases of addition of infinities with opposite signs
1160c64fe63SAleksandar Markovic 			 * or subtraction of infinities with same signs.
1170c64fe63SAleksandar Markovic 			 */
1180c64fe63SAleksandar Markovic 			ieee754_setcx(IEEE754_INVALID_OPERATION);
1190c64fe63SAleksandar Markovic 			return ieee754dp_indef();
1200c64fe63SAleksandar Markovic 		}
1210c64fe63SAleksandar Markovic 		/*
1220c64fe63SAleksandar Markovic 		 * z is here either not an infinity, or an infinity having the
123ece276deSJiaxun Yang 		 * same sign as product (x*y). The result must be an infinity,
124ece276deSJiaxun Yang 		 * and its sign is determined only by the sign of product (x*y).
1250c64fe63SAleksandar Markovic 		 */
126ece276deSJiaxun Yang 		return ieee754dp_inf(rs);
127e24c3becSMarkos Chandras 
128e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
129e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
130e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
131e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
132e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
133e24c3becSMarkos Chandras 		if (zc == IEEE754_CLASS_INF)
134e24c3becSMarkos Chandras 			return ieee754dp_inf(zs);
1357cf64ce4SAleksandar Markovic 		if (zc == IEEE754_CLASS_ZERO) {
1367cf64ce4SAleksandar Markovic 			/* Handle cases +0 + (-0) and similar ones. */
137ece276deSJiaxun Yang 			if (zs == rs)
1387cf64ce4SAleksandar Markovic 				/*
1397cf64ce4SAleksandar Markovic 				 * Cases of addition of zeros of equal signs
1407cf64ce4SAleksandar Markovic 				 * or subtraction of zeroes of opposite signs.
1417cf64ce4SAleksandar Markovic 				 * The sign of the resulting zero is in any
1427cf64ce4SAleksandar Markovic 				 * such case determined only by the sign of z.
1437cf64ce4SAleksandar Markovic 				 */
1447cf64ce4SAleksandar Markovic 				return z;
1457cf64ce4SAleksandar Markovic 
1467cf64ce4SAleksandar Markovic 			return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
1477cf64ce4SAleksandar Markovic 		}
1487cf64ce4SAleksandar Markovic 		/* x*y is here 0, and z is not 0, so just return z */
149e24c3becSMarkos Chandras 		return z;
150e24c3becSMarkos Chandras 
151e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
152e24c3becSMarkos Chandras 		DPDNORMX;
153*c9b02990SLiangliang Huang 		fallthrough;
154e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
155e840be6eSAleksandar Markovic 		if (zc == IEEE754_CLASS_INF)
156e24c3becSMarkos Chandras 			return ieee754dp_inf(zs);
157e24c3becSMarkos Chandras 		DPDNORMY;
158e24c3becSMarkos Chandras 		break;
159e24c3becSMarkos Chandras 
160e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
161e840be6eSAleksandar Markovic 		if (zc == IEEE754_CLASS_INF)
162e24c3becSMarkos Chandras 			return ieee754dp_inf(zs);
163e24c3becSMarkos Chandras 		DPDNORMX;
164e24c3becSMarkos Chandras 		break;
165e24c3becSMarkos Chandras 
166e24c3becSMarkos Chandras 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
167e840be6eSAleksandar Markovic 		if (zc == IEEE754_CLASS_INF)
168e24c3becSMarkos Chandras 			return ieee754dp_inf(zs);
1692a14b21aSAleksandar Markovic 		/* continue to real computations */
170e24c3becSMarkos Chandras 	}
171e24c3becSMarkos Chandras 
172e24c3becSMarkos Chandras 	/* Finally get to do some computation */
173e24c3becSMarkos Chandras 
174e24c3becSMarkos Chandras 	/*
175e24c3becSMarkos Chandras 	 * Do the multiplication bit first
176e24c3becSMarkos Chandras 	 *
177e24c3becSMarkos Chandras 	 * rm = xm * ym, re = xe + ye basically
178e24c3becSMarkos Chandras 	 *
179e24c3becSMarkos Chandras 	 * At this point xm and ym should have been normalized.
180e24c3becSMarkos Chandras 	 */
181e24c3becSMarkos Chandras 	assert(xm & DP_HIDDEN_BIT);
182e24c3becSMarkos Chandras 	assert(ym & DP_HIDDEN_BIT);
183e24c3becSMarkos Chandras 
184e24c3becSMarkos Chandras 	re = xe + ye;
185e24c3becSMarkos Chandras 
186e24c3becSMarkos Chandras 	/* shunt to top of word */
187e24c3becSMarkos Chandras 	xm <<= 64 - (DP_FBITS + 1);
188e24c3becSMarkos Chandras 	ym <<= 64 - (DP_FBITS + 1);
189e24c3becSMarkos Chandras 
190e24c3becSMarkos Chandras 	/*
1912cfa5825SDouglas Leung 	 * Multiply 64 bits xm and ym to give 128 bits result in hrm:lrm.
192e24c3becSMarkos Chandras 	 */
193e24c3becSMarkos Chandras 
194e24c3becSMarkos Chandras 	lxm = xm;
195e24c3becSMarkos Chandras 	hxm = xm >> 32;
196e24c3becSMarkos Chandras 	lym = ym;
197e24c3becSMarkos Chandras 	hym = ym >> 32;
198e24c3becSMarkos Chandras 
199e24c3becSMarkos Chandras 	lrm = DPXMULT(lxm, lym);
200e24c3becSMarkos Chandras 	hrm = DPXMULT(hxm, hym);
201e24c3becSMarkos Chandras 
202e24c3becSMarkos Chandras 	t = DPXMULT(lxm, hym);
203e24c3becSMarkos Chandras 
204e24c3becSMarkos Chandras 	at = lrm + (t << 32);
205e24c3becSMarkos Chandras 	hrm += at < lrm;
206e24c3becSMarkos Chandras 	lrm = at;
207e24c3becSMarkos Chandras 
208e24c3becSMarkos Chandras 	hrm = hrm + (t >> 32);
209e24c3becSMarkos Chandras 
210e24c3becSMarkos Chandras 	t = DPXMULT(hxm, lym);
211e24c3becSMarkos Chandras 
212e24c3becSMarkos Chandras 	at = lrm + (t << 32);
213e24c3becSMarkos Chandras 	hrm += at < lrm;
214e24c3becSMarkos Chandras 	lrm = at;
215e24c3becSMarkos Chandras 
216e24c3becSMarkos Chandras 	hrm = hrm + (t >> 32);
217e24c3becSMarkos Chandras 
2182cfa5825SDouglas Leung 	/* Put explicit bit at bit 126 if necessary */
2192cfa5825SDouglas Leung 	if ((int64_t)hrm < 0) {
2202cfa5825SDouglas Leung 		lrm = (hrm << 63) | (lrm >> 1);
2212cfa5825SDouglas Leung 		hrm = hrm >> 1;
222e24c3becSMarkos Chandras 		re++;
223e24c3becSMarkos Chandras 	}
224e24c3becSMarkos Chandras 
2252cfa5825SDouglas Leung 	assert(hrm & (1 << 62));
226ddbfff74SAleksandar Markovic 
2272cfa5825SDouglas Leung 	if (zc == IEEE754_CLASS_ZERO) {
228e24c3becSMarkos Chandras 		/*
2292cfa5825SDouglas Leung 		 * Move explicit bit from bit 126 to bit 55 since the
2302cfa5825SDouglas Leung 		 * ieee754dp_format code expects the mantissa to be
2312cfa5825SDouglas Leung 		 * 56 bits wide (53 + 3 rounding bits).
232e24c3becSMarkos Chandras 		 */
2332cfa5825SDouglas Leung 		srl128(&hrm, &lrm, (126 - 55));
2342cfa5825SDouglas Leung 		return ieee754dp_format(rs, re, lrm);
2352cfa5825SDouglas Leung 	}
236e24c3becSMarkos Chandras 
2372cfa5825SDouglas Leung 	/* Move explicit bit from bit 52 to bit 126 */
2382cfa5825SDouglas Leung 	lzm = 0;
2392cfa5825SDouglas Leung 	hzm = zm << 10;
2402cfa5825SDouglas Leung 	assert(hzm & (1 << 62));
2412cfa5825SDouglas Leung 
2422cfa5825SDouglas Leung 	/* Make the exponents the same */
243e24c3becSMarkos Chandras 	if (ze > re) {
244e24c3becSMarkos Chandras 		/*
245e24c3becSMarkos Chandras 		 * Have to shift y fraction right to align.
246e24c3becSMarkos Chandras 		 */
247e24c3becSMarkos Chandras 		s = ze - re;
2482cfa5825SDouglas Leung 		srl128(&hrm, &lrm, s);
249e24c3becSMarkos Chandras 		re += s;
250e24c3becSMarkos Chandras 	} else if (re > ze) {
251e24c3becSMarkos Chandras 		/*
252e24c3becSMarkos Chandras 		 * Have to shift x fraction right to align.
253e24c3becSMarkos Chandras 		 */
254e24c3becSMarkos Chandras 		s = re - ze;
2552cfa5825SDouglas Leung 		srl128(&hzm, &lzm, s);
256e24c3becSMarkos Chandras 		ze += s;
257e24c3becSMarkos Chandras 	}
258e24c3becSMarkos Chandras 	assert(ze == re);
259e24c3becSMarkos Chandras 	assert(ze <= DP_EMAX);
260e24c3becSMarkos Chandras 
2612cfa5825SDouglas Leung 	/* Do the addition */
262e24c3becSMarkos Chandras 	if (zs == rs) {
263e24c3becSMarkos Chandras 		/*
2642cfa5825SDouglas Leung 		 * Generate 128 bit result by adding two 127 bit numbers
2652cfa5825SDouglas Leung 		 * leaving result in hzm:lzm, zs and ze.
266e24c3becSMarkos Chandras 		 */
2672cfa5825SDouglas Leung 		hzm = hzm + hrm + (lzm > (lzm + lrm));
2682cfa5825SDouglas Leung 		lzm = lzm + lrm;
2692cfa5825SDouglas Leung 		if ((int64_t)hzm < 0) {        /* carry out */
2702cfa5825SDouglas Leung 			srl128(&hzm, &lzm, 1);
271e24c3becSMarkos Chandras 			ze++;
272e24c3becSMarkos Chandras 		}
273e24c3becSMarkos Chandras 	} else {
2742cfa5825SDouglas Leung 		if (hzm > hrm || (hzm == hrm && lzm >= lrm)) {
2752cfa5825SDouglas Leung 			hzm = hzm - hrm - (lzm < lrm);
2762cfa5825SDouglas Leung 			lzm = lzm - lrm;
277e24c3becSMarkos Chandras 		} else {
2782cfa5825SDouglas Leung 			hzm = hrm - hzm - (lrm < lzm);
2792cfa5825SDouglas Leung 			lzm = lrm - lzm;
280e24c3becSMarkos Chandras 			zs = rs;
281e24c3becSMarkos Chandras 		}
2822cfa5825SDouglas Leung 		if (lzm == 0 && hzm == 0)
283e24c3becSMarkos Chandras 			return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
284e24c3becSMarkos Chandras 
285e24c3becSMarkos Chandras 		/*
2862cfa5825SDouglas Leung 		 * Put explicit bit at bit 126 if necessary.
287e24c3becSMarkos Chandras 		 */
2882cfa5825SDouglas Leung 		if (hzm == 0) {
2892cfa5825SDouglas Leung 			/* left shift by 63 or 64 bits */
2902cfa5825SDouglas Leung 			if ((int64_t)lzm < 0) {
2912cfa5825SDouglas Leung 				/* MSB of lzm is the explicit bit */
2922cfa5825SDouglas Leung 				hzm = lzm >> 1;
2932cfa5825SDouglas Leung 				lzm = lzm << 63;
2942cfa5825SDouglas Leung 				ze -= 63;
2952cfa5825SDouglas Leung 			} else {
2962cfa5825SDouglas Leung 				hzm = lzm;
2972cfa5825SDouglas Leung 				lzm = 0;
2982cfa5825SDouglas Leung 				ze -= 64;
299e24c3becSMarkos Chandras 			}
300e24c3becSMarkos Chandras 		}
301e24c3becSMarkos Chandras 
3022cfa5825SDouglas Leung 		t = 0;
3032cfa5825SDouglas Leung 		while ((hzm >> (62 - t)) == 0)
3042cfa5825SDouglas Leung 			t++;
3052cfa5825SDouglas Leung 
3062cfa5825SDouglas Leung 		assert(t <= 62);
3072cfa5825SDouglas Leung 		if (t) {
3082cfa5825SDouglas Leung 			hzm = hzm << t | lzm >> (64 - t);
3092cfa5825SDouglas Leung 			lzm = lzm << t;
3102cfa5825SDouglas Leung 			ze -= t;
3112cfa5825SDouglas Leung 		}
3122cfa5825SDouglas Leung 	}
3132cfa5825SDouglas Leung 
3142cfa5825SDouglas Leung 	/*
3152cfa5825SDouglas Leung 	 * Move explicit bit from bit 126 to bit 55 since the
3162cfa5825SDouglas Leung 	 * ieee754dp_format code expects the mantissa to be
3172cfa5825SDouglas Leung 	 * 56 bits wide (53 + 3 rounding bits).
3182cfa5825SDouglas Leung 	 */
3192cfa5825SDouglas Leung 	srl128(&hzm, &lzm, (126 - 55));
3202cfa5825SDouglas Leung 
3212cfa5825SDouglas Leung 	return ieee754dp_format(zs, ze, lzm);
322e24c3becSMarkos Chandras }
323d728f670SPaul Burton 
ieee754dp_maddf(union ieee754dp z,union ieee754dp x,union ieee754dp y)324d728f670SPaul Burton union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
325d728f670SPaul Burton 				union ieee754dp y)
326d728f670SPaul Burton {
327d728f670SPaul Burton 	return _dp_maddf(z, x, y, 0);
328d728f670SPaul Burton }
329d728f670SPaul Burton 
ieee754dp_msubf(union ieee754dp z,union ieee754dp x,union ieee754dp y)330d728f670SPaul Burton union ieee754dp ieee754dp_msubf(union ieee754dp z, union ieee754dp x,
331d728f670SPaul Burton 				union ieee754dp y)
332d728f670SPaul Burton {
333ae11c061SAleksandar Markovic 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
334d728f670SPaul Burton }
335ece276deSJiaxun Yang 
ieee754dp_madd(union ieee754dp z,union ieee754dp x,union ieee754dp y)336ece276deSJiaxun Yang union ieee754dp ieee754dp_madd(union ieee754dp z, union ieee754dp x,
337ece276deSJiaxun Yang 				union ieee754dp y)
338ece276deSJiaxun Yang {
339ece276deSJiaxun Yang 	return _dp_maddf(z, x, y, 0);
340ece276deSJiaxun Yang }
341ece276deSJiaxun Yang 
ieee754dp_msub(union ieee754dp z,union ieee754dp x,union ieee754dp y)342ece276deSJiaxun Yang union ieee754dp ieee754dp_msub(union ieee754dp z, union ieee754dp x,
343ece276deSJiaxun Yang 				union ieee754dp y)
344ece276deSJiaxun Yang {
345ece276deSJiaxun Yang 	return _dp_maddf(z, x, y, MADDF_NEGATE_ADDITION);
346ece276deSJiaxun Yang }
347ece276deSJiaxun Yang 
ieee754dp_nmadd(union ieee754dp z,union ieee754dp x,union ieee754dp y)348ece276deSJiaxun Yang union ieee754dp ieee754dp_nmadd(union ieee754dp z, union ieee754dp x,
349ece276deSJiaxun Yang 				union ieee754dp y)
350ece276deSJiaxun Yang {
351ece276deSJiaxun Yang 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT|MADDF_NEGATE_ADDITION);
352ece276deSJiaxun Yang }
353ece276deSJiaxun Yang 
ieee754dp_nmsub(union ieee754dp z,union ieee754dp x,union ieee754dp y)354ece276deSJiaxun Yang union ieee754dp ieee754dp_nmsub(union ieee754dp z, union ieee754dp x,
355ece276deSJiaxun Yang 				union ieee754dp y)
356ece276deSJiaxun Yang {
357ece276deSJiaxun Yang 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
358ece276deSJiaxun Yang }
359