xref: /OK3568_Linux_fs/kernel/arch/mips/math-emu/dp_maddf.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * IEEE754 floating point arithmetic
4*4882a593Smuzhiyun  * double precision: MADDF.f (Fused Multiply Add)
5*4882a593Smuzhiyun  * MADDF.fmt: FPR[fd] = FPR[fd] + (FPR[fs] x FPR[ft])
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * MIPS floating point support
8*4882a593Smuzhiyun  * Copyright (C) 2015 Imagination Technologies, Ltd.
9*4882a593Smuzhiyun  * Author: Markos Chandras <markos.chandras@imgtec.com>
10*4882a593Smuzhiyun  */
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include "ieee754dp.h"
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun 
15*4882a593Smuzhiyun /* 128 bits shift right logical with rounding. */
srl128(u64 * hptr,u64 * lptr,int count)16*4882a593Smuzhiyun static void srl128(u64 *hptr, u64 *lptr, int count)
17*4882a593Smuzhiyun {
18*4882a593Smuzhiyun 	u64 low;
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun 	if (count >= 128) {
21*4882a593Smuzhiyun 		*lptr = *hptr != 0 || *lptr != 0;
22*4882a593Smuzhiyun 		*hptr = 0;
23*4882a593Smuzhiyun 	} else if (count >= 64) {
24*4882a593Smuzhiyun 		if (count == 64) {
25*4882a593Smuzhiyun 			*lptr = *hptr | (*lptr != 0);
26*4882a593Smuzhiyun 		} else {
27*4882a593Smuzhiyun 			low = *lptr;
28*4882a593Smuzhiyun 			*lptr = *hptr >> (count - 64);
29*4882a593Smuzhiyun 			*lptr |= (*hptr << (128 - count)) != 0 || low != 0;
30*4882a593Smuzhiyun 		}
31*4882a593Smuzhiyun 		*hptr = 0;
32*4882a593Smuzhiyun 	} else {
33*4882a593Smuzhiyun 		low = *lptr;
34*4882a593Smuzhiyun 		*lptr = low >> count | *hptr << (64 - count);
35*4882a593Smuzhiyun 		*lptr |= (low << (64 - count)) != 0;
36*4882a593Smuzhiyun 		*hptr = *hptr >> count;
37*4882a593Smuzhiyun 	}
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
_dp_maddf(union ieee754dp z,union ieee754dp x,union ieee754dp y,enum maddf_flags flags)40*4882a593Smuzhiyun static union ieee754dp _dp_maddf(union ieee754dp z, union ieee754dp x,
41*4882a593Smuzhiyun 				 union ieee754dp y, enum maddf_flags flags)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	int re;
44*4882a593Smuzhiyun 	int rs;
45*4882a593Smuzhiyun 	unsigned int lxm;
46*4882a593Smuzhiyun 	unsigned int hxm;
47*4882a593Smuzhiyun 	unsigned int lym;
48*4882a593Smuzhiyun 	unsigned int hym;
49*4882a593Smuzhiyun 	u64 lrm;
50*4882a593Smuzhiyun 	u64 hrm;
51*4882a593Smuzhiyun 	u64 lzm;
52*4882a593Smuzhiyun 	u64 hzm;
53*4882a593Smuzhiyun 	u64 t;
54*4882a593Smuzhiyun 	u64 at;
55*4882a593Smuzhiyun 	int s;
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	COMPXDP;
58*4882a593Smuzhiyun 	COMPYDP;
59*4882a593Smuzhiyun 	COMPZDP;
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun 	EXPLODEXDP;
62*4882a593Smuzhiyun 	EXPLODEYDP;
63*4882a593Smuzhiyun 	EXPLODEZDP;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	FLUSHXDP;
66*4882a593Smuzhiyun 	FLUSHYDP;
67*4882a593Smuzhiyun 	FLUSHZDP;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	ieee754_clearcx();
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun 	rs = xs ^ ys;
72*4882a593Smuzhiyun 	if (flags & MADDF_NEGATE_PRODUCT)
73*4882a593Smuzhiyun 		rs ^= 1;
74*4882a593Smuzhiyun 	if (flags & MADDF_NEGATE_ADDITION)
75*4882a593Smuzhiyun 		zs ^= 1;
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	/*
78*4882a593Smuzhiyun 	 * Handle the cases when at least one of x, y or z is a NaN.
79*4882a593Smuzhiyun 	 * Order of precedence is sNaN, qNaN and z, x, y.
80*4882a593Smuzhiyun 	 */
81*4882a593Smuzhiyun 	if (zc == IEEE754_CLASS_SNAN)
82*4882a593Smuzhiyun 		return ieee754dp_nanxcpt(z);
83*4882a593Smuzhiyun 	if (xc == IEEE754_CLASS_SNAN)
84*4882a593Smuzhiyun 		return ieee754dp_nanxcpt(x);
85*4882a593Smuzhiyun 	if (yc == IEEE754_CLASS_SNAN)
86*4882a593Smuzhiyun 		return ieee754dp_nanxcpt(y);
87*4882a593Smuzhiyun 	if (zc == IEEE754_CLASS_QNAN)
88*4882a593Smuzhiyun 		return z;
89*4882a593Smuzhiyun 	if (xc == IEEE754_CLASS_QNAN)
90*4882a593Smuzhiyun 		return x;
91*4882a593Smuzhiyun 	if (yc == IEEE754_CLASS_QNAN)
92*4882a593Smuzhiyun 		return y;
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	if (zc == IEEE754_CLASS_DNORM)
95*4882a593Smuzhiyun 		DPDNORMZ;
96*4882a593Smuzhiyun 	/* ZERO z cases are handled separately below */
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	switch (CLPAIR(xc, yc)) {
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	/*
101*4882a593Smuzhiyun 	 * Infinity handling
102*4882a593Smuzhiyun 	 */
103*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_ZERO):
104*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_INF):
105*4882a593Smuzhiyun 		ieee754_setcx(IEEE754_INVALID_OPERATION);
106*4882a593Smuzhiyun 		return ieee754dp_indef();
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_INF):
109*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_INF):
110*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_NORM):
111*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_DNORM):
112*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_INF, IEEE754_CLASS_INF):
113*4882a593Smuzhiyun 		if ((zc == IEEE754_CLASS_INF) && (zs != rs)) {
114*4882a593Smuzhiyun 			/*
115*4882a593Smuzhiyun 			 * Cases of addition of infinities with opposite signs
116*4882a593Smuzhiyun 			 * or subtraction of infinities with same signs.
117*4882a593Smuzhiyun 			 */
118*4882a593Smuzhiyun 			ieee754_setcx(IEEE754_INVALID_OPERATION);
119*4882a593Smuzhiyun 			return ieee754dp_indef();
120*4882a593Smuzhiyun 		}
121*4882a593Smuzhiyun 		/*
122*4882a593Smuzhiyun 		 * z is here either not an infinity, or an infinity having the
123*4882a593Smuzhiyun 		 * same sign as product (x*y). The result must be an infinity,
124*4882a593Smuzhiyun 		 * and its sign is determined only by the sign of product (x*y).
125*4882a593Smuzhiyun 		 */
126*4882a593Smuzhiyun 		return ieee754dp_inf(rs);
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_ZERO):
129*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_NORM):
130*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_ZERO, IEEE754_CLASS_DNORM):
131*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_ZERO):
132*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_ZERO):
133*4882a593Smuzhiyun 		if (zc == IEEE754_CLASS_INF)
134*4882a593Smuzhiyun 			return ieee754dp_inf(zs);
135*4882a593Smuzhiyun 		if (zc == IEEE754_CLASS_ZERO) {
136*4882a593Smuzhiyun 			/* Handle cases +0 + (-0) and similar ones. */
137*4882a593Smuzhiyun 			if (zs == rs)
138*4882a593Smuzhiyun 				/*
139*4882a593Smuzhiyun 				 * Cases of addition of zeros of equal signs
140*4882a593Smuzhiyun 				 * or subtraction of zeroes of opposite signs.
141*4882a593Smuzhiyun 				 * The sign of the resulting zero is in any
142*4882a593Smuzhiyun 				 * such case determined only by the sign of z.
143*4882a593Smuzhiyun 				 */
144*4882a593Smuzhiyun 				return z;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 			return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
147*4882a593Smuzhiyun 		}
148*4882a593Smuzhiyun 		/* x*y is here 0, and z is not 0, so just return z */
149*4882a593Smuzhiyun 		return z;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_DNORM):
152*4882a593Smuzhiyun 		DPDNORMX;
153*4882a593Smuzhiyun 		fallthrough;
154*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_DNORM):
155*4882a593Smuzhiyun 		if (zc == IEEE754_CLASS_INF)
156*4882a593Smuzhiyun 			return ieee754dp_inf(zs);
157*4882a593Smuzhiyun 		DPDNORMY;
158*4882a593Smuzhiyun 		break;
159*4882a593Smuzhiyun 
160*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_DNORM, IEEE754_CLASS_NORM):
161*4882a593Smuzhiyun 		if (zc == IEEE754_CLASS_INF)
162*4882a593Smuzhiyun 			return ieee754dp_inf(zs);
163*4882a593Smuzhiyun 		DPDNORMX;
164*4882a593Smuzhiyun 		break;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	case CLPAIR(IEEE754_CLASS_NORM, IEEE754_CLASS_NORM):
167*4882a593Smuzhiyun 		if (zc == IEEE754_CLASS_INF)
168*4882a593Smuzhiyun 			return ieee754dp_inf(zs);
169*4882a593Smuzhiyun 		/* continue to real computations */
170*4882a593Smuzhiyun 	}
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun 	/* Finally get to do some computation */
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	/*
175*4882a593Smuzhiyun 	 * Do the multiplication bit first
176*4882a593Smuzhiyun 	 *
177*4882a593Smuzhiyun 	 * rm = xm * ym, re = xe + ye basically
178*4882a593Smuzhiyun 	 *
179*4882a593Smuzhiyun 	 * At this point xm and ym should have been normalized.
180*4882a593Smuzhiyun 	 */
181*4882a593Smuzhiyun 	assert(xm & DP_HIDDEN_BIT);
182*4882a593Smuzhiyun 	assert(ym & DP_HIDDEN_BIT);
183*4882a593Smuzhiyun 
184*4882a593Smuzhiyun 	re = xe + ye;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	/* shunt to top of word */
187*4882a593Smuzhiyun 	xm <<= 64 - (DP_FBITS + 1);
188*4882a593Smuzhiyun 	ym <<= 64 - (DP_FBITS + 1);
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	/*
191*4882a593Smuzhiyun 	 * Multiply 64 bits xm and ym to give 128 bits result in hrm:lrm.
192*4882a593Smuzhiyun 	 */
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 	lxm = xm;
195*4882a593Smuzhiyun 	hxm = xm >> 32;
196*4882a593Smuzhiyun 	lym = ym;
197*4882a593Smuzhiyun 	hym = ym >> 32;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun 	lrm = DPXMULT(lxm, lym);
200*4882a593Smuzhiyun 	hrm = DPXMULT(hxm, hym);
201*4882a593Smuzhiyun 
202*4882a593Smuzhiyun 	t = DPXMULT(lxm, hym);
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun 	at = lrm + (t << 32);
205*4882a593Smuzhiyun 	hrm += at < lrm;
206*4882a593Smuzhiyun 	lrm = at;
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	hrm = hrm + (t >> 32);
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun 	t = DPXMULT(hxm, lym);
211*4882a593Smuzhiyun 
212*4882a593Smuzhiyun 	at = lrm + (t << 32);
213*4882a593Smuzhiyun 	hrm += at < lrm;
214*4882a593Smuzhiyun 	lrm = at;
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun 	hrm = hrm + (t >> 32);
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun 	/* Put explicit bit at bit 126 if necessary */
219*4882a593Smuzhiyun 	if ((int64_t)hrm < 0) {
220*4882a593Smuzhiyun 		lrm = (hrm << 63) | (lrm >> 1);
221*4882a593Smuzhiyun 		hrm = hrm >> 1;
222*4882a593Smuzhiyun 		re++;
223*4882a593Smuzhiyun 	}
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun 	assert(hrm & (1 << 62));
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	if (zc == IEEE754_CLASS_ZERO) {
228*4882a593Smuzhiyun 		/*
229*4882a593Smuzhiyun 		 * Move explicit bit from bit 126 to bit 55 since the
230*4882a593Smuzhiyun 		 * ieee754dp_format code expects the mantissa to be
231*4882a593Smuzhiyun 		 * 56 bits wide (53 + 3 rounding bits).
232*4882a593Smuzhiyun 		 */
233*4882a593Smuzhiyun 		srl128(&hrm, &lrm, (126 - 55));
234*4882a593Smuzhiyun 		return ieee754dp_format(rs, re, lrm);
235*4882a593Smuzhiyun 	}
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun 	/* Move explicit bit from bit 52 to bit 126 */
238*4882a593Smuzhiyun 	lzm = 0;
239*4882a593Smuzhiyun 	hzm = zm << 10;
240*4882a593Smuzhiyun 	assert(hzm & (1 << 62));
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun 	/* Make the exponents the same */
243*4882a593Smuzhiyun 	if (ze > re) {
244*4882a593Smuzhiyun 		/*
245*4882a593Smuzhiyun 		 * Have to shift y fraction right to align.
246*4882a593Smuzhiyun 		 */
247*4882a593Smuzhiyun 		s = ze - re;
248*4882a593Smuzhiyun 		srl128(&hrm, &lrm, s);
249*4882a593Smuzhiyun 		re += s;
250*4882a593Smuzhiyun 	} else if (re > ze) {
251*4882a593Smuzhiyun 		/*
252*4882a593Smuzhiyun 		 * Have to shift x fraction right to align.
253*4882a593Smuzhiyun 		 */
254*4882a593Smuzhiyun 		s = re - ze;
255*4882a593Smuzhiyun 		srl128(&hzm, &lzm, s);
256*4882a593Smuzhiyun 		ze += s;
257*4882a593Smuzhiyun 	}
258*4882a593Smuzhiyun 	assert(ze == re);
259*4882a593Smuzhiyun 	assert(ze <= DP_EMAX);
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	/* Do the addition */
262*4882a593Smuzhiyun 	if (zs == rs) {
263*4882a593Smuzhiyun 		/*
264*4882a593Smuzhiyun 		 * Generate 128 bit result by adding two 127 bit numbers
265*4882a593Smuzhiyun 		 * leaving result in hzm:lzm, zs and ze.
266*4882a593Smuzhiyun 		 */
267*4882a593Smuzhiyun 		hzm = hzm + hrm + (lzm > (lzm + lrm));
268*4882a593Smuzhiyun 		lzm = lzm + lrm;
269*4882a593Smuzhiyun 		if ((int64_t)hzm < 0) {        /* carry out */
270*4882a593Smuzhiyun 			srl128(&hzm, &lzm, 1);
271*4882a593Smuzhiyun 			ze++;
272*4882a593Smuzhiyun 		}
273*4882a593Smuzhiyun 	} else {
274*4882a593Smuzhiyun 		if (hzm > hrm || (hzm == hrm && lzm >= lrm)) {
275*4882a593Smuzhiyun 			hzm = hzm - hrm - (lzm < lrm);
276*4882a593Smuzhiyun 			lzm = lzm - lrm;
277*4882a593Smuzhiyun 		} else {
278*4882a593Smuzhiyun 			hzm = hrm - hzm - (lrm < lzm);
279*4882a593Smuzhiyun 			lzm = lrm - lzm;
280*4882a593Smuzhiyun 			zs = rs;
281*4882a593Smuzhiyun 		}
282*4882a593Smuzhiyun 		if (lzm == 0 && hzm == 0)
283*4882a593Smuzhiyun 			return ieee754dp_zero(ieee754_csr.rm == FPU_CSR_RD);
284*4882a593Smuzhiyun 
285*4882a593Smuzhiyun 		/*
286*4882a593Smuzhiyun 		 * Put explicit bit at bit 126 if necessary.
287*4882a593Smuzhiyun 		 */
288*4882a593Smuzhiyun 		if (hzm == 0) {
289*4882a593Smuzhiyun 			/* left shift by 63 or 64 bits */
290*4882a593Smuzhiyun 			if ((int64_t)lzm < 0) {
291*4882a593Smuzhiyun 				/* MSB of lzm is the explicit bit */
292*4882a593Smuzhiyun 				hzm = lzm >> 1;
293*4882a593Smuzhiyun 				lzm = lzm << 63;
294*4882a593Smuzhiyun 				ze -= 63;
295*4882a593Smuzhiyun 			} else {
296*4882a593Smuzhiyun 				hzm = lzm;
297*4882a593Smuzhiyun 				lzm = 0;
298*4882a593Smuzhiyun 				ze -= 64;
299*4882a593Smuzhiyun 			}
300*4882a593Smuzhiyun 		}
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun 		t = 0;
303*4882a593Smuzhiyun 		while ((hzm >> (62 - t)) == 0)
304*4882a593Smuzhiyun 			t++;
305*4882a593Smuzhiyun 
306*4882a593Smuzhiyun 		assert(t <= 62);
307*4882a593Smuzhiyun 		if (t) {
308*4882a593Smuzhiyun 			hzm = hzm << t | lzm >> (64 - t);
309*4882a593Smuzhiyun 			lzm = lzm << t;
310*4882a593Smuzhiyun 			ze -= t;
311*4882a593Smuzhiyun 		}
312*4882a593Smuzhiyun 	}
313*4882a593Smuzhiyun 
314*4882a593Smuzhiyun 	/*
315*4882a593Smuzhiyun 	 * Move explicit bit from bit 126 to bit 55 since the
316*4882a593Smuzhiyun 	 * ieee754dp_format code expects the mantissa to be
317*4882a593Smuzhiyun 	 * 56 bits wide (53 + 3 rounding bits).
318*4882a593Smuzhiyun 	 */
319*4882a593Smuzhiyun 	srl128(&hzm, &lzm, (126 - 55));
320*4882a593Smuzhiyun 
321*4882a593Smuzhiyun 	return ieee754dp_format(zs, ze, lzm);
322*4882a593Smuzhiyun }
323*4882a593Smuzhiyun 
ieee754dp_maddf(union ieee754dp z,union ieee754dp x,union ieee754dp y)324*4882a593Smuzhiyun union ieee754dp ieee754dp_maddf(union ieee754dp z, union ieee754dp x,
325*4882a593Smuzhiyun 				union ieee754dp y)
326*4882a593Smuzhiyun {
327*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, 0);
328*4882a593Smuzhiyun }
329*4882a593Smuzhiyun 
ieee754dp_msubf(union ieee754dp z,union ieee754dp x,union ieee754dp y)330*4882a593Smuzhiyun union ieee754dp ieee754dp_msubf(union ieee754dp z, union ieee754dp x,
331*4882a593Smuzhiyun 				union ieee754dp y)
332*4882a593Smuzhiyun {
333*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
334*4882a593Smuzhiyun }
335*4882a593Smuzhiyun 
ieee754dp_madd(union ieee754dp z,union ieee754dp x,union ieee754dp y)336*4882a593Smuzhiyun union ieee754dp ieee754dp_madd(union ieee754dp z, union ieee754dp x,
337*4882a593Smuzhiyun 				union ieee754dp y)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, 0);
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
ieee754dp_msub(union ieee754dp z,union ieee754dp x,union ieee754dp y)342*4882a593Smuzhiyun union ieee754dp ieee754dp_msub(union ieee754dp z, union ieee754dp x,
343*4882a593Smuzhiyun 				union ieee754dp y)
344*4882a593Smuzhiyun {
345*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, MADDF_NEGATE_ADDITION);
346*4882a593Smuzhiyun }
347*4882a593Smuzhiyun 
ieee754dp_nmadd(union ieee754dp z,union ieee754dp x,union ieee754dp y)348*4882a593Smuzhiyun union ieee754dp ieee754dp_nmadd(union ieee754dp z, union ieee754dp x,
349*4882a593Smuzhiyun 				union ieee754dp y)
350*4882a593Smuzhiyun {
351*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT|MADDF_NEGATE_ADDITION);
352*4882a593Smuzhiyun }
353*4882a593Smuzhiyun 
ieee754dp_nmsub(union ieee754dp z,union ieee754dp x,union ieee754dp y)354*4882a593Smuzhiyun union ieee754dp ieee754dp_nmsub(union ieee754dp z, union ieee754dp x,
355*4882a593Smuzhiyun 				union ieee754dp y)
356*4882a593Smuzhiyun {
357*4882a593Smuzhiyun 	return _dp_maddf(z, x, y, MADDF_NEGATE_PRODUCT);
358*4882a593Smuzhiyun }
359