Lines Matching +full:a +full:- +full:b

1 // SPDX-License-Identifier: GPL-2.0
2 /*---------------------------------------------------------------------------+
5 | Functions to add or subtract two registers and put the result in a third. |
9 | E-mail billm@suburbia.net |
12 +---------------------------------------------------------------------------*/
14 /*---------------------------------------------------------------------------+
17 | Each function returns 0 if the answer is o.k., otherwise a non-zero |
20 +---------------------------------------------------------------------------*/
29 int add_sub_specials(FPU_REG const *a, u_char taga, u_char signa,
30 FPU_REG const *b, u_char tagb, u_char signb,
37 int FPU_add(FPU_REG const *b, u_char tagb, int deststnr, int control_w) in FPU_add() argument
39 FPU_REG *a = &st(0); in FPU_add() local
41 u_char signb = getsign(b); in FPU_add()
43 u_char signa = getsign(a); in FPU_add()
48 expa = exponent(a); in FPU_add()
49 expb = exponent(b); in FPU_add()
56 FPU_u_add(a, b, dest, control_w, signa, expa, expb); in FPU_add()
58 /* The signs are different, so do a subtraction */ in FPU_add()
59 diff = expa - expb; in FPU_add()
61 diff = a->sigh - b->sigh; /* This works only if the ms bits in FPU_add()
64 diff = a->sigl > b->sigl; in FPU_add()
66 diff = -(a->sigl < b->sigl); in FPU_add()
72 FPU_u_sub(a, b, dest, control_w, signa, in FPU_add()
76 FPU_u_sub(b, a, dest, control_w, signb, in FPU_add()
96 taga = FPU_Special(a); in FPU_add()
98 tagb = FPU_Special(b); in FPU_add()
108 FPU_to_exp16(a, &x); in FPU_add()
109 FPU_to_exp16(b, &y); in FPU_add()
110 a = &x; in FPU_add()
111 b = &y; in FPU_add()
112 expa = exponent16(a); in FPU_add()
113 expb = exponent16(b); in FPU_add()
119 return real_2op_NaN(b, tagb, deststnr, a); in FPU_add()
121 return real_2op_NaN(a, taga, deststnr, a); in FPU_add()
124 return add_sub_specials(a, taga, signa, b, tagb, signb, in FPU_add()
128 /* Subtract b from a. (a-b) -> dest */
131 FPU_REG const *a, *b; in FPU_sub() local
136 a = &st(0); in FPU_sub()
141 b = (FPU_REG *) rm; in FPU_sub()
144 b = &st(rm); in FPU_sub()
151 signa = getsign(a); in FPU_sub()
152 signb = getsign(b); in FPU_sub()
163 expa = exponent(a); in FPU_sub()
164 expb = exponent(b); in FPU_sub()
169 diff = expa - expb; in FPU_sub()
172 diff = a->sigh - b->sigh; /* Works only if ms bits are identical */ in FPU_sub()
174 diff = a->sigl > b->sigl; in FPU_sub()
176 diff = -(a->sigl < b->sigl); in FPU_sub()
181 case 0: /* P - P */ in FPU_sub()
182 case 3: /* N - N */ in FPU_sub()
184 /* |a| > |b| */ in FPU_sub()
186 FPU_u_sub(a, b, dest, control_w, signa, in FPU_sub()
198 FPU_u_sub(b, a, dest, control_w, sign, expb, in FPU_sub()
202 case 1: /* P - N */ in FPU_sub()
204 FPU_u_add(a, b, dest, control_w, SIGN_POS, expa, in FPU_sub()
207 case 2: /* N - P */ in FPU_sub()
209 FPU_u_add(a, b, dest, control_w, SIGN_NEG, expa, in FPU_sub()
215 return -1; in FPU_sub()
227 taga = FPU_Special(a); in FPU_sub()
229 tagb = FPU_Special(b); in FPU_sub()
239 FPU_to_exp16(a, &x); in FPU_sub()
240 FPU_to_exp16(b, &y); in FPU_sub()
241 a = &x; in FPU_sub()
242 b = &y; in FPU_sub()
243 expa = exponent16(a); in FPU_sub()
244 expb = exponent16(b); in FPU_sub()
252 d1 = b; in FPU_sub()
253 d2 = a; in FPU_sub()
255 d1 = a; in FPU_sub()
256 d2 = b; in FPU_sub()
259 return real_2op_NaN(b, tagb, deststnr, d1); in FPU_sub()
261 return real_2op_NaN(a, taga, deststnr, d2); in FPU_sub()
263 return real_2op_NaN(b, tagb, deststnr, d2); in FPU_sub()
266 return add_sub_specials(a, taga, signa, b, tagb, signb ^ SIGN_NEG, in FPU_sub()
271 int add_sub_specials(FPU_REG const *a, u_char taga, u_char signa, in add_sub_specials() argument
272 FPU_REG const *b, u_char tagb, u_char signb, in add_sub_specials() argument
284 FPU_copy_to_regi(a, TAG_Zero, deststnr); in add_sub_specials()
291 setsign(dest, signa); /* signa may differ from the sign of a. */ in add_sub_specials()
294 reg_copy(b, dest); in add_sub_specials()
295 if ((tagb == TW_Denormal) && (b->sigh & 0x80000000)) { in add_sub_specials()
296 /* A pseudoDenormal, convert it. */ in add_sub_specials()
301 setsign(dest, signb); /* signb may differ from the sign of b. */ in add_sub_specials()
306 reg_copy(a, dest); in add_sub_specials()
307 if ((taga == TW_Denormal) && (a->sigh & 0x80000000)) { in add_sub_specials()
308 /* A pseudoDenormal */ in add_sub_specials()
313 setsign(dest, signa); /* signa may differ from the sign of a. */ in add_sub_specials()
318 FPU_copy_to_regi(a, TAG_Special, deststnr); in add_sub_specials()
319 setsign(dest, signa); /* signa may differ from the sign of a. */ in add_sub_specials()
322 /* Infinity-Infinity is undefined. */ in add_sub_specials()
325 FPU_copy_to_regi(b, TAG_Special, deststnr); in add_sub_specials()
326 setsign(dest, signb); /* signb may differ from the sign of b. */ in add_sub_specials()