comparison libgcc/config/libbid/bid128_add.c @ 0:a06113de4d67

first commit
author kent <kent@cr.ie.u-ryukyu.ac.jp>
date Fri, 17 Jul 2009 14:47:48 +0900
parents
children 04ced10e8804
comparison
equal deleted inserted replaced
-1:000000000000 0:a06113de4d67
1 /* Copyright (C) 2007, 2009 Free Software Foundation, Inc.
2
3 This file is part of GCC.
4
5 GCC is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free
7 Software Foundation; either version 3, or (at your option) any later
8 version.
9
10 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 for more details.
14
15 Under Section 7 of GPL version 3, you are granted additional
16 permissions described in the GCC Runtime Library Exception, version
17 3.1, as published by the Free Software Foundation.
18
19 You should have received a copy of the GNU General Public License and
20 a copy of the GCC Runtime Library Exception along with this program;
21 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
22 <http://www.gnu.org/licenses/>. */
23
24 #include "bid_internal.h"
25
26
27 #if DECIMAL_CALL_BY_REFERENCE
28 void
29 bid64dq_add (UINT64 * pres, UINT64 * px, UINT128 * py
30 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
31 _EXC_INFO_PARAM) {
32 UINT64 x = *px;
33 #if !DECIMAL_GLOBAL_ROUNDING
34 unsigned int rnd_mode = *prnd_mode;
35 #endif
36 #else
37 UINT64
38 bid64dq_add (UINT64 x, UINT128 y
39 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
40 _EXC_INFO_PARAM) {
41 #endif
42 UINT64 res = 0xbaddbaddbaddbaddull;
43 UINT128 x1;
44
45 #if DECIMAL_CALL_BY_REFERENCE
46 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
47 bid64qq_add (&res, &x1, py
48 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
49 _EXC_INFO_ARG);
50 #else
51 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
52 res = bid64qq_add (x1, y
53 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
54 _EXC_INFO_ARG);
55 #endif
56 BID_RETURN (res);
57 }
58
59
60 #if DECIMAL_CALL_BY_REFERENCE
61 void
62 bid64qd_add (UINT64 * pres, UINT128 * px, UINT64 * py
63 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
64 _EXC_INFO_PARAM) {
65 UINT64 y = *py;
66 #if !DECIMAL_GLOBAL_ROUNDING
67 unsigned int rnd_mode = *prnd_mode;
68 #endif
69 #else
70 UINT64
71 bid64qd_add (UINT128 x, UINT64 y
72 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
73 _EXC_INFO_PARAM) {
74 #endif
75 UINT64 res = 0xbaddbaddbaddbaddull;
76 UINT128 y1;
77
78 #if DECIMAL_CALL_BY_REFERENCE
79 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
80 bid64qq_add (&res, px, &y1
81 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
82 _EXC_INFO_ARG);
83 #else
84 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
85 res = bid64qq_add (x, y1
86 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
87 _EXC_INFO_ARG);
88 #endif
89 BID_RETURN (res);
90 }
91
92
93 #if DECIMAL_CALL_BY_REFERENCE
94 void
95 bid64qq_add (UINT64 * pres, UINT128 * px, UINT128 * py
96 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
97 _EXC_INFO_PARAM) {
98 UINT128 x = *px, y = *py;
99 #if !DECIMAL_GLOBAL_ROUNDING
100 unsigned int rnd_mode = *prnd_mode;
101 #endif
102 #else
103 UINT64
104 bid64qq_add (UINT128 x, UINT128 y
105 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
106 _EXC_INFO_PARAM) {
107 #endif
108
109 UINT128 one = { {0x0000000000000001ull, 0x3040000000000000ull}
110 };
111 UINT64 res = 0xbaddbaddbaddbaddull;
112
113 BID_SWAP128 (one);
114 #if DECIMAL_CALL_BY_REFERENCE
115 bid64qqq_fma (&res, &one, &x, &y
116 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
117 _EXC_INFO_ARG);
118 #else
119 res = bid64qqq_fma (one, x, y
120 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
121 _EXC_INFO_ARG);
122 #endif
123 BID_RETURN (res);
124 }
125
126
127 #if DECIMAL_CALL_BY_REFERENCE
128 void
129 bid128dd_add (UINT128 * pres, UINT64 * px, UINT64 * py
130 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
131 _EXC_INFO_PARAM) {
132 UINT64 x = *px, y = *py;
133 #if !DECIMAL_GLOBAL_ROUNDING
134 unsigned int rnd_mode = *prnd_mode;
135 #endif
136 #else
137 UINT128
138 bid128dd_add (UINT64 x, UINT64 y
139 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
140 _EXC_INFO_PARAM) {
141 #endif
142 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
143 };
144 UINT128 x1, y1;
145
146 #if DECIMAL_CALL_BY_REFERENCE
147 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
148 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
149 bid128_add (&res, &x1, &y1
150 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
151 _EXC_INFO_ARG);
152 #else
153 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
154 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
155 res = bid128_add (x1, y1
156 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
157 _EXC_INFO_ARG);
158 #endif
159 BID_RETURN (res);
160 }
161
162
163 #if DECIMAL_CALL_BY_REFERENCE
164 void
165 bid128dq_add (UINT128 * pres, UINT64 * px, UINT128 * py
166 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
167 _EXC_INFO_PARAM) {
168 UINT64 x = *px;
169 #if !DECIMAL_GLOBAL_ROUNDING
170 unsigned int rnd_mode = *prnd_mode;
171 #endif
172 #else
173 UINT128
174 bid128dq_add (UINT64 x, UINT128 y
175 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
176 _EXC_INFO_PARAM) {
177 #endif
178 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
179 };
180 UINT128 x1;
181
182 #if DECIMAL_CALL_BY_REFERENCE
183 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
184 bid128_add (&res, &x1, py
185 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
186 _EXC_INFO_ARG);
187 #else
188 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
189 res = bid128_add (x1, y
190 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
191 _EXC_INFO_ARG);
192 #endif
193 BID_RETURN (res);
194 }
195
196
197 #if DECIMAL_CALL_BY_REFERENCE
198 void
199 bid128qd_add (UINT128 * pres, UINT128 * px, UINT64 * py
200 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
201 _EXC_INFO_PARAM) {
202 UINT64 y = *py;
203 #if !DECIMAL_GLOBAL_ROUNDING
204 unsigned int rnd_mode = *prnd_mode;
205 #endif
206 #else
207 UINT128
208 bid128qd_add (UINT128 x, UINT64 y
209 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
210 _EXC_INFO_PARAM) {
211 #endif
212 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
213 };
214 UINT128 y1;
215
216 #if DECIMAL_CALL_BY_REFERENCE
217 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
218 bid128_add (&res, px, &y1
219 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
220 _EXC_INFO_ARG);
221 #else
222 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
223 res = bid128_add (x, y1
224 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
225 _EXC_INFO_ARG);
226 #endif
227 BID_RETURN (res);
228 }
229
230
231 // bid128_add stands for bid128qq_add
232
233
234 /*****************************************************************************
235 * BID64/BID128 sub
236 ****************************************************************************/
237
238 #if DECIMAL_CALL_BY_REFERENCE
239 void
240 bid64dq_sub (UINT64 * pres, UINT64 * px, UINT128 * py
241 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
242 _EXC_INFO_PARAM) {
243 UINT64 x = *px;
244 #if !DECIMAL_GLOBAL_ROUNDING
245 unsigned int rnd_mode = *prnd_mode;
246 #endif
247 #else
248 UINT64
249 bid64dq_sub (UINT64 x, UINT128 y
250 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
251 _EXC_INFO_PARAM) {
252 #endif
253 UINT64 res = 0xbaddbaddbaddbaddull;
254 UINT128 x1;
255
256 #if DECIMAL_CALL_BY_REFERENCE
257 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
258 bid64qq_sub (&res, &x1, py
259 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
260 _EXC_INFO_ARG);
261 #else
262 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
263 res = bid64qq_sub (x1, y
264 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
265 _EXC_INFO_ARG);
266 #endif
267 BID_RETURN (res);
268 }
269
270
271 #if DECIMAL_CALL_BY_REFERENCE
272 void
273 bid64qd_sub (UINT64 * pres, UINT128 * px, UINT64 * py
274 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
275 _EXC_INFO_PARAM) {
276 UINT64 y = *py;
277 #if !DECIMAL_GLOBAL_ROUNDING
278 unsigned int rnd_mode = *prnd_mode;
279 #endif
280 #else
281 UINT64
282 bid64qd_sub (UINT128 x, UINT64 y
283 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
284 _EXC_INFO_PARAM) {
285 #endif
286 UINT64 res = 0xbaddbaddbaddbaddull;
287 UINT128 y1;
288
289 #if DECIMAL_CALL_BY_REFERENCE
290 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
291 bid64qq_sub (&res, px, &y1
292 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
293 _EXC_INFO_ARG);
294 #else
295 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
296 res = bid64qq_sub (x, y1
297 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
298 _EXC_INFO_ARG);
299 #endif
300 BID_RETURN (res);
301 }
302
303
304 #if DECIMAL_CALL_BY_REFERENCE
305 void
306 bid64qq_sub (UINT64 * pres, UINT128 * px, UINT128 * py
307 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
308 _EXC_INFO_PARAM) {
309 UINT128 x = *px, y = *py;
310 #if !DECIMAL_GLOBAL_ROUNDING
311 unsigned int rnd_mode = *prnd_mode;
312 #endif
313 #else
314 UINT64
315 bid64qq_sub (UINT128 x, UINT128 y
316 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
317 _EXC_INFO_PARAM) {
318 #endif
319
320 UINT128 one = { {0x0000000000000001ull, 0x3040000000000000ull}
321 };
322 UINT64 res = 0xbaddbaddbaddbaddull;
323 UINT64 y_sign;
324
325 BID_SWAP128 (one);
326 if ((y.w[HIGH_128W] & MASK_NAN) != MASK_NAN) { // y is not NAN
327 // change its sign
328 y_sign = y.w[HIGH_128W] & MASK_SIGN; // 0 for positive, MASK_SIGN for negative
329 if (y_sign)
330 y.w[HIGH_128W] = y.w[HIGH_128W] & 0x7fffffffffffffffull;
331 else
332 y.w[HIGH_128W] = y.w[HIGH_128W] | 0x8000000000000000ull;
333 }
334 #if DECIMAL_CALL_BY_REFERENCE
335 bid64qqq_fma (&res, &one, &x, &y
336 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
337 _EXC_INFO_ARG);
338 #else
339 res = bid64qqq_fma (one, x, y
340 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
341 _EXC_INFO_ARG);
342 #endif
343 BID_RETURN (res);
344 }
345
346
347 #if DECIMAL_CALL_BY_REFERENCE
348 void
349 bid128dd_sub (UINT128 * pres, UINT64 * px, UINT64 * py
350 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
351 _EXC_INFO_PARAM) {
352 UINT64 x = *px, y = *py;
353 #if !DECIMAL_GLOBAL_ROUNDING
354 unsigned int rnd_mode = *prnd_mode;
355 #endif
356 #else
357 UINT128
358 bid128dd_sub (UINT64 x, UINT64 y
359 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
360 _EXC_INFO_PARAM) {
361 #endif
362 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
363 };
364 UINT128 x1, y1;
365
366 #if DECIMAL_CALL_BY_REFERENCE
367 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
368 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
369 bid128_sub (&res, &x1, &y1
370 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
371 _EXC_INFO_ARG);
372 #else
373 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
374 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
375 res = bid128_sub (x1, y1
376 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
377 _EXC_INFO_ARG);
378 #endif
379 BID_RETURN (res);
380 }
381
382
383 #if DECIMAL_CALL_BY_REFERENCE
384 void
385 bid128dq_sub (UINT128 * pres, UINT64 * px, UINT128 * py
386 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
387 _EXC_INFO_PARAM) {
388 UINT64 x = *px;
389 #if !DECIMAL_GLOBAL_ROUNDING
390 unsigned int rnd_mode = *prnd_mode;
391 #endif
392 #else
393 UINT128
394 bid128dq_sub (UINT64 x, UINT128 y
395 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
396 _EXC_INFO_PARAM) {
397 #endif
398 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
399 };
400 UINT128 x1;
401
402 #if DECIMAL_CALL_BY_REFERENCE
403 bid64_to_bid128 (&x1, &x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
404 bid128_sub (&res, &x1, py
405 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
406 _EXC_INFO_ARG);
407 #else
408 x1 = bid64_to_bid128 (x _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
409 res = bid128_sub (x1, y
410 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
411 _EXC_INFO_ARG);
412 #endif
413 BID_RETURN (res);
414 }
415
416
417 #if DECIMAL_CALL_BY_REFERENCE
418 void
419 bid128qd_sub (UINT128 * pres, UINT128 * px, UINT64 * py
420 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
421 _EXC_INFO_PARAM) {
422 UINT64 y = *py;
423 #if !DECIMAL_GLOBAL_ROUNDING
424 unsigned int rnd_mode = *prnd_mode;
425 #endif
426 #else
427 UINT128
428 bid128qd_sub (UINT128 x, UINT64 y
429 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
430 _EXC_INFO_PARAM) {
431 #endif
432 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
433 };
434 UINT128 y1;
435
436 #if DECIMAL_CALL_BY_REFERENCE
437 bid64_to_bid128 (&y1, &y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
438 bid128_sub (&res, px, &y1
439 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
440 _EXC_INFO_ARG);
441 #else
442 y1 = bid64_to_bid128 (y _EXC_FLAGS_ARG _EXC_MASKS_ARG _EXC_INFO_ARG);
443 res = bid128_sub (x, y1
444 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
445 _EXC_INFO_ARG);
446 #endif
447 BID_RETURN (res);
448 }
449
450 #if DECIMAL_CALL_BY_REFERENCE
451 void
452 bid128_add (UINT128 * pres, UINT128 * px, UINT128 * py
453 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
454 _EXC_INFO_PARAM) {
455 UINT128 x = *px, y = *py;
456 #if !DECIMAL_GLOBAL_ROUNDING
457 unsigned int rnd_mode = *prnd_mode;
458 #endif
459 #else
460 UINT128
461 bid128_add (UINT128 x, UINT128 y
462 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
463 _EXC_INFO_PARAM) {
464 #endif
465 UINT128 res = { {0xbaddbaddbaddbaddull, 0xbaddbaddbaddbaddull}
466 };
467 UINT64 x_sign, y_sign, tmp_sign;
468 UINT64 x_exp, y_exp, tmp_exp; // e1 = x_exp, e2 = y_exp
469 UINT64 C1_hi, C2_hi, tmp_signif_hi;
470 UINT64 C1_lo, C2_lo, tmp_signif_lo;
471 // Note: C1.w[1], C1.w[0] represent C1_hi, C1_lo (all UINT64)
472 // Note: C2.w[1], C2.w[0] represent C2_hi, C2_lo (all UINT64)
473 UINT64 tmp64, tmp64A, tmp64B;
474 BID_UI64DOUBLE tmp1, tmp2;
475 int x_nr_bits, y_nr_bits;
476 int q1, q2, delta, scale, x1, ind, shift, tmp_inexact = 0;
477 UINT64 halfulp64;
478 UINT128 halfulp128;
479 UINT128 C1, C2;
480 UINT128 ten2m1;
481 UINT128 highf2star; // top 128 bits in f2*; low 128 bits in R256[1], R256[0]
482 UINT256 P256, Q256, R256;
483 int is_inexact = 0, is_midpoint_lt_even = 0, is_midpoint_gt_even = 0;
484 int is_inexact_lt_midpoint = 0, is_inexact_gt_midpoint = 0;
485 int second_pass = 0;
486
487 BID_SWAP128 (x);
488 BID_SWAP128 (y);
489 x_sign = x.w[1] & MASK_SIGN; // 0 for positive, MASK_SIGN for negative
490 y_sign = y.w[1] & MASK_SIGN; // 0 for positive, MASK_SIGN for negative
491
492 // check for NaN or Infinity
493 if (((x.w[1] & MASK_SPECIAL) == MASK_SPECIAL)
494 || ((y.w[1] & MASK_SPECIAL) == MASK_SPECIAL)) {
495 // x is special or y is special
496 if ((x.w[1] & MASK_NAN) == MASK_NAN) { // x is NAN
497 // check first for non-canonical NaN payload
498 if (((x.w[1] & 0x00003fffffffffffull) > 0x0000314dc6448d93ull) ||
499 (((x.w[1] & 0x00003fffffffffffull) == 0x0000314dc6448d93ull)
500 && (x.w[0] > 0x38c15b09ffffffffull))) {
501 x.w[1] = x.w[1] & 0xffffc00000000000ull;
502 x.w[0] = 0x0ull;
503 }
504 if ((x.w[1] & MASK_SNAN) == MASK_SNAN) { // x is SNAN
505 // set invalid flag
506 *pfpsf |= INVALID_EXCEPTION;
507 // return quiet (x)
508 res.w[1] = x.w[1] & 0xfc003fffffffffffull;
509 // clear out also G[6]-G[16]
510 res.w[0] = x.w[0];
511 } else { // x is QNaN
512 // return x
513 res.w[1] = x.w[1] & 0xfc003fffffffffffull;
514 // clear out G[6]-G[16]
515 res.w[0] = x.w[0];
516 // if y = SNaN signal invalid exception
517 if ((y.w[1] & MASK_SNAN) == MASK_SNAN) {
518 // set invalid flag
519 *pfpsf |= INVALID_EXCEPTION;
520 }
521 }
522 BID_SWAP128 (res);
523 BID_RETURN (res);
524 } else if ((y.w[1] & MASK_NAN) == MASK_NAN) { // y is NAN
525 // check first for non-canonical NaN payload
526 if (((y.w[1] & 0x00003fffffffffffull) > 0x0000314dc6448d93ull) ||
527 (((y.w[1] & 0x00003fffffffffffull) == 0x0000314dc6448d93ull)
528 && (y.w[0] > 0x38c15b09ffffffffull))) {
529 y.w[1] = y.w[1] & 0xffffc00000000000ull;
530 y.w[0] = 0x0ull;
531 }
532 if ((y.w[1] & MASK_SNAN) == MASK_SNAN) { // y is SNAN
533 // set invalid flag
534 *pfpsf |= INVALID_EXCEPTION;
535 // return quiet (y)
536 res.w[1] = y.w[1] & 0xfc003fffffffffffull;
537 // clear out also G[6]-G[16]
538 res.w[0] = y.w[0];
539 } else { // y is QNaN
540 // return y
541 res.w[1] = y.w[1] & 0xfc003fffffffffffull;
542 // clear out G[6]-G[16]
543 res.w[0] = y.w[0];
544 }
545 BID_SWAP128 (res);
546 BID_RETURN (res);
547 } else { // neither x not y is NaN; at least one is infinity
548 if ((x.w[1] & MASK_ANY_INF) == MASK_INF) { // x is infinity
549 if ((y.w[1] & MASK_ANY_INF) == MASK_INF) { // y is infinity
550 // if same sign, return either of them
551 if ((x.w[1] & MASK_SIGN) == (y.w[1] & MASK_SIGN)) {
552 res.w[1] = x_sign | MASK_INF;
553 res.w[0] = 0x0ull;
554 } else { // x and y are infinities of opposite signs
555 // set invalid flag
556 *pfpsf |= INVALID_EXCEPTION;
557 // return QNaN Indefinite
558 res.w[1] = 0x7c00000000000000ull;
559 res.w[0] = 0x0000000000000000ull;
560 }
561 } else { // y is 0 or finite
562 // return x
563 res.w[1] = x_sign | MASK_INF;
564 res.w[0] = 0x0ull;
565 }
566 } else { // x is not NaN or infinity, so y must be infinity
567 res.w[1] = y_sign | MASK_INF;
568 res.w[0] = 0x0ull;
569 }
570 BID_SWAP128 (res);
571 BID_RETURN (res);
572 }
573 }
574 // unpack the arguments
575
576 // unpack x
577 C1_hi = x.w[1] & MASK_COEFF;
578 C1_lo = x.w[0];
579 // test for non-canonical values:
580 // - values whose encoding begins with x00, x01, or x10 and whose
581 // coefficient is larger than 10^34 -1, or
582 // - values whose encoding begins with x1100, x1101, x1110 (if NaNs
583 // and infinitis were eliminated already this test is reduced to
584 // checking for x10x)
585
586 // x is not infinity; check for non-canonical values - treated as zero
587 if ((x.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull) {
588 // G0_G1=11; non-canonical
589 x_exp = (x.w[1] << 2) & MASK_EXP; // biased and shifted left 49 bits
590 C1_hi = 0; // significand high
591 C1_lo = 0; // significand low
592 } else { // G0_G1 != 11
593 x_exp = x.w[1] & MASK_EXP; // biased and shifted left 49 bits
594 if (C1_hi > 0x0001ed09bead87c0ull ||
595 (C1_hi == 0x0001ed09bead87c0ull
596 && C1_lo > 0x378d8e63ffffffffull)) {
597 // x is non-canonical if coefficient is larger than 10^34 -1
598 C1_hi = 0;
599 C1_lo = 0;
600 } else { // canonical
601 ;
602 }
603 }
604
605 // unpack y
606 C2_hi = y.w[1] & MASK_COEFF;
607 C2_lo = y.w[0];
608 // y is not infinity; check for non-canonical values - treated as zero
609 if ((y.w[1] & 0x6000000000000000ull) == 0x6000000000000000ull) {
610 // G0_G1=11; non-canonical
611 y_exp = (y.w[1] << 2) & MASK_EXP; // biased and shifted left 49 bits
612 C2_hi = 0; // significand high
613 C2_lo = 0; // significand low
614 } else { // G0_G1 != 11
615 y_exp = y.w[1] & MASK_EXP; // biased and shifted left 49 bits
616 if (C2_hi > 0x0001ed09bead87c0ull ||
617 (C2_hi == 0x0001ed09bead87c0ull
618 && C2_lo > 0x378d8e63ffffffffull)) {
619 // y is non-canonical if coefficient is larger than 10^34 -1
620 C2_hi = 0;
621 C2_lo = 0;
622 } else { // canonical
623 ;
624 }
625 }
626
627 if ((C1_hi == 0x0ull) && (C1_lo == 0x0ull)) {
628 // x is 0 and y is not special
629 // if y is 0 return 0 with the smaller exponent
630 if ((C2_hi == 0x0ull) && (C2_lo == 0x0ull)) {
631 if (x_exp < y_exp)
632 res.w[1] = x_exp;
633 else
634 res.w[1] = y_exp;
635 if (x_sign && y_sign)
636 res.w[1] = res.w[1] | x_sign; // both negative
637 else if (rnd_mode == ROUNDING_DOWN && x_sign != y_sign)
638 res.w[1] = res.w[1] | 0x8000000000000000ull; // -0
639 // else; // res = +0
640 res.w[0] = 0;
641 } else {
642 // for 0 + y return y, with the preferred exponent
643 if (y_exp <= x_exp) {
644 res.w[1] = y.w[1];
645 res.w[0] = y.w[0];
646 } else { // if y_exp > x_exp
647 // return (C2 * 10^scale) * 10^(y_exp - scale)
648 // where scale = min (P34-q2, y_exp-x_exp)
649 // determine q2 = nr. of decimal digits in y
650 // determine first the nr. of bits in y (y_nr_bits)
651
652 if (C2_hi == 0) { // y_bits is the nr. of bits in C2_lo
653 if (C2_lo >= 0x0020000000000000ull) { // y >= 2^53
654 // split the 64-bit value in two 32-bit halves to avoid
655 // rounding errors
656 if (C2_lo >= 0x0000000100000000ull) { // y >= 2^32
657 tmp2.d = (double) (C2_lo >> 32); // exact conversion
658 y_nr_bits =
659 32 +
660 ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
661 } else { // y < 2^32
662 tmp2.d = (double) (C2_lo); // exact conversion
663 y_nr_bits =
664 ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
665 }
666 } else { // if y < 2^53
667 tmp2.d = (double) C2_lo; // exact conversion
668 y_nr_bits =
669 ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
670 }
671 } else { // C2_hi != 0 => nr. bits = 64 + nr_bits (C2_hi)
672 tmp2.d = (double) C2_hi; // exact conversion
673 y_nr_bits =
674 64 + ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
675 }
676 q2 = nr_digits[y_nr_bits].digits;
677 if (q2 == 0) {
678 q2 = nr_digits[y_nr_bits].digits1;
679 if (C2_hi > nr_digits[y_nr_bits].threshold_hi ||
680 (C2_hi == nr_digits[y_nr_bits].threshold_hi &&
681 C2_lo >= nr_digits[y_nr_bits].threshold_lo))
682 q2++;
683 }
684 // return (C2 * 10^scale) * 10^(y_exp - scale)
685 // where scale = min (P34-q2, y_exp-x_exp)
686 scale = P34 - q2;
687 ind = (y_exp - x_exp) >> 49;
688 if (ind < scale)
689 scale = ind;
690 if (scale == 0) {
691 res.w[1] = y.w[1];
692 res.w[0] = y.w[0];
693 } else if (q2 <= 19) { // y fits in 64 bits
694 if (scale <= 19) { // 10^scale fits in 64 bits
695 // 64 x 64 C2_lo * ten2k64[scale]
696 __mul_64x64_to_128MACH (res, C2_lo, ten2k64[scale]);
697 } else { // 10^scale fits in 128 bits
698 // 64 x 128 C2_lo * ten2k128[scale - 20]
699 __mul_128x64_to_128 (res, C2_lo, ten2k128[scale - 20]);
700 }
701 } else { // y fits in 128 bits, but 10^scale must fit in 64 bits
702 // 64 x 128 ten2k64[scale] * C2
703 C2.w[1] = C2_hi;
704 C2.w[0] = C2_lo;
705 __mul_128x64_to_128 (res, ten2k64[scale], C2);
706 }
707 // subtract scale from the exponent
708 y_exp = y_exp - ((UINT64) scale << 49);
709 res.w[1] = res.w[1] | y_sign | y_exp;
710 }
711 }
712 BID_SWAP128 (res);
713 BID_RETURN (res);
714 } else if ((C2_hi == 0x0ull) && (C2_lo == 0x0ull)) {
715 // y is 0 and x is not special, and not zero
716 // for x + 0 return x, with the preferred exponent
717 if (x_exp <= y_exp) {
718 res.w[1] = x.w[1];
719 res.w[0] = x.w[0];
720 } else { // if x_exp > y_exp
721 // return (C1 * 10^scale) * 10^(x_exp - scale)
722 // where scale = min (P34-q1, x_exp-y_exp)
723 // determine q1 = nr. of decimal digits in x
724 // determine first the nr. of bits in x
725 if (C1_hi == 0) { // x_bits is the nr. of bits in C1_lo
726 if (C1_lo >= 0x0020000000000000ull) { // x >= 2^53
727 // split the 64-bit value in two 32-bit halves to avoid
728 // rounding errors
729 if (C1_lo >= 0x0000000100000000ull) { // x >= 2^32
730 tmp1.d = (double) (C1_lo >> 32); // exact conversion
731 x_nr_bits =
732 32 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) -
733 0x3ff);
734 } else { // x < 2^32
735 tmp1.d = (double) (C1_lo); // exact conversion
736 x_nr_bits =
737 ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
738 }
739 } else { // if x < 2^53
740 tmp1.d = (double) C1_lo; // exact conversion
741 x_nr_bits =
742 ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
743 }
744 } else { // C1_hi != 0 => nr. bits = 64 + nr_bits (C1_hi)
745 tmp1.d = (double) C1_hi; // exact conversion
746 x_nr_bits =
747 64 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
748 }
749 q1 = nr_digits[x_nr_bits].digits;
750 if (q1 == 0) {
751 q1 = nr_digits[x_nr_bits].digits1;
752 if (C1_hi > nr_digits[x_nr_bits].threshold_hi ||
753 (C1_hi == nr_digits[x_nr_bits].threshold_hi &&
754 C1_lo >= nr_digits[x_nr_bits].threshold_lo))
755 q1++;
756 }
757 // return (C1 * 10^scale) * 10^(x_exp - scale)
758 // where scale = min (P34-q1, x_exp-y_exp)
759 scale = P34 - q1;
760 ind = (x_exp - y_exp) >> 49;
761 if (ind < scale)
762 scale = ind;
763 if (scale == 0) {
764 res.w[1] = x.w[1];
765 res.w[0] = x.w[0];
766 } else if (q1 <= 19) { // x fits in 64 bits
767 if (scale <= 19) { // 10^scale fits in 64 bits
768 // 64 x 64 C1_lo * ten2k64[scale]
769 __mul_64x64_to_128MACH (res, C1_lo, ten2k64[scale]);
770 } else { // 10^scale fits in 128 bits
771 // 64 x 128 C1_lo * ten2k128[scale - 20]
772 __mul_128x64_to_128 (res, C1_lo, ten2k128[scale - 20]);
773 }
774 } else { // x fits in 128 bits, but 10^scale must fit in 64 bits
775 // 64 x 128 ten2k64[scale] * C1
776 C1.w[1] = C1_hi;
777 C1.w[0] = C1_lo;
778 __mul_128x64_to_128 (res, ten2k64[scale], C1);
779 }
780 // subtract scale from the exponent
781 x_exp = x_exp - ((UINT64) scale << 49);
782 res.w[1] = res.w[1] | x_sign | x_exp;
783 }
784 BID_SWAP128 (res);
785 BID_RETURN (res);
786 } else { // x and y are not canonical, not special, and are not zero
787 // note that the result may still be zero, and then it has to have the
788 // preferred exponent
789 if (x_exp < y_exp) { // if exp_x < exp_y then swap x and y
790 tmp_sign = x_sign;
791 tmp_exp = x_exp;
792 tmp_signif_hi = C1_hi;
793 tmp_signif_lo = C1_lo;
794 x_sign = y_sign;
795 x_exp = y_exp;
796 C1_hi = C2_hi;
797 C1_lo = C2_lo;
798 y_sign = tmp_sign;
799 y_exp = tmp_exp;
800 C2_hi = tmp_signif_hi;
801 C2_lo = tmp_signif_lo;
802 }
803 // q1 = nr. of decimal digits in x
804 // determine first the nr. of bits in x
805 if (C1_hi == 0) { // x_bits is the nr. of bits in C1_lo
806 if (C1_lo >= 0x0020000000000000ull) { // x >= 2^53
807 //split the 64-bit value in two 32-bit halves to avoid rounding errors
808 if (C1_lo >= 0x0000000100000000ull) { // x >= 2^32
809 tmp1.d = (double) (C1_lo >> 32); // exact conversion
810 x_nr_bits =
811 32 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
812 } else { // x < 2^32
813 tmp1.d = (double) (C1_lo); // exact conversion
814 x_nr_bits =
815 ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
816 }
817 } else { // if x < 2^53
818 tmp1.d = (double) C1_lo; // exact conversion
819 x_nr_bits =
820 ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
821 }
822 } else { // C1_hi != 0 => nr. bits = 64 + nr_bits (C1_hi)
823 tmp1.d = (double) C1_hi; // exact conversion
824 x_nr_bits =
825 64 + ((((unsigned int) (tmp1.ui64 >> 52)) & 0x7ff) - 0x3ff);
826 }
827
828 q1 = nr_digits[x_nr_bits].digits;
829 if (q1 == 0) {
830 q1 = nr_digits[x_nr_bits].digits1;
831 if (C1_hi > nr_digits[x_nr_bits].threshold_hi ||
832 (C1_hi == nr_digits[x_nr_bits].threshold_hi &&
833 C1_lo >= nr_digits[x_nr_bits].threshold_lo))
834 q1++;
835 }
836 // q2 = nr. of decimal digits in y
837 // determine first the nr. of bits in y (y_nr_bits)
838 if (C2_hi == 0) { // y_bits is the nr. of bits in C2_lo
839 if (C2_lo >= 0x0020000000000000ull) { // y >= 2^53
840 //split the 64-bit value in two 32-bit halves to avoid rounding errors
841 if (C2_lo >= 0x0000000100000000ull) { // y >= 2^32
842 tmp2.d = (double) (C2_lo >> 32); // exact conversion
843 y_nr_bits =
844 32 + ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
845 } else { // y < 2^32
846 tmp2.d = (double) (C2_lo); // exact conversion
847 y_nr_bits =
848 ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
849 }
850 } else { // if y < 2^53
851 tmp2.d = (double) C2_lo; // exact conversion
852 y_nr_bits =
853 ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
854 }
855 } else { // C2_hi != 0 => nr. bits = 64 + nr_bits (C2_hi)
856 tmp2.d = (double) C2_hi; // exact conversion
857 y_nr_bits =
858 64 + ((((unsigned int) (tmp2.ui64 >> 52)) & 0x7ff) - 0x3ff);
859 }
860
861 q2 = nr_digits[y_nr_bits].digits;
862 if (q2 == 0) {
863 q2 = nr_digits[y_nr_bits].digits1;
864 if (C2_hi > nr_digits[y_nr_bits].threshold_hi ||
865 (C2_hi == nr_digits[y_nr_bits].threshold_hi &&
866 C2_lo >= nr_digits[y_nr_bits].threshold_lo))
867 q2++;
868 }
869
870 delta = q1 + (int) (x_exp >> 49) - q2 - (int) (y_exp >> 49);
871
872 if (delta >= P34) {
873 // round the result directly because 0 < C2 < ulp (C1 * 10^(x_exp-e2))
874 // n = C1 * 10^e1 or n = C1 +/- 10^(q1-P34)) * 10^e1
875 // the result is inexact; the preferred exponent is the least possible
876
877 if (delta >= P34 + 1) {
878 // for RN the result is the operand with the larger magnitude,
879 // possibly scaled up by 10^(P34-q1)
880 // an overflow cannot occur in this case (rounding to nearest)
881 if (q1 < P34) { // scale C1 up by 10^(P34-q1)
882 // Note: because delta >= P34+1 it is certain that
883 // x_exp - ((UINT64)scale << 49) will stay above e_min
884 scale = P34 - q1;
885 if (q1 <= 19) { // C1 fits in 64 bits
886 // 1 <= q1 <= 19 => 15 <= scale <= 33
887 if (scale <= 19) { // 10^scale fits in 64 bits
888 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
889 } else { // if 20 <= scale <= 33
890 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
891 // (C1 * 10^(scale-19)) fits in 64 bits
892 C1_lo = C1_lo * ten2k64[scale - 19];
893 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
894 }
895 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
896 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
897 C1.w[1] = C1_hi;
898 C1.w[0] = C1_lo;
899 // C1 = ten2k64[P34 - q1] * C1
900 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
901 }
902 x_exp = x_exp - ((UINT64) scale << 49);
903 C1_hi = C1.w[1];
904 C1_lo = C1.w[0];
905 }
906 // some special cases arise: if delta = P34 + 1 and C1 = 10^(P34-1)
907 // (after scaling) and x_sign != y_sign and C2 > 5*10^(q2-1) =>
908 // subtract 1 ulp
909 // Note: do this only for rounding to nearest; for other rounding
910 // modes the correction will be applied next
911 if ((rnd_mode == ROUNDING_TO_NEAREST
912 || rnd_mode == ROUNDING_TIES_AWAY) && delta == (P34 + 1)
913 && C1_hi == 0x0000314dc6448d93ull
914 && C1_lo == 0x38c15b0a00000000ull && x_sign != y_sign
915 && ((q2 <= 19 && C2_lo > midpoint64[q2 - 1]) || (q2 >= 20
916 && (C2_hi >
917 midpoint128
918 [q2 -
919 20].
920 w[1]
921 ||
922 (C2_hi
923 ==
924 midpoint128
925 [q2 -
926 20].
927 w[1]
928 &&
929 C2_lo
930 >
931 midpoint128
932 [q2 -
933 20].
934 w
935 [0])))))
936 {
937 // C1 = 10^34 - 1 and decrement x_exp by 1 (no underflow possible)
938 C1_hi = 0x0001ed09bead87c0ull;
939 C1_lo = 0x378d8e63ffffffffull;
940 x_exp = x_exp - EXP_P1;
941 }
942 if (rnd_mode != ROUNDING_TO_NEAREST) {
943 if ((rnd_mode == ROUNDING_DOWN && x_sign && y_sign) ||
944 (rnd_mode == ROUNDING_UP && !x_sign && !y_sign)) {
945 // add 1 ulp and then check for overflow
946 C1_lo = C1_lo + 1;
947 if (C1_lo == 0) { // rounding overflow in the low 64 bits
948 C1_hi = C1_hi + 1;
949 }
950 if (C1_hi == 0x0001ed09bead87c0ull
951 && C1_lo == 0x378d8e6400000000ull) {
952 // C1 = 10^34 => rounding overflow
953 C1_hi = 0x0000314dc6448d93ull;
954 C1_lo = 0x38c15b0a00000000ull; // 10^33
955 x_exp = x_exp + EXP_P1;
956 if (x_exp == EXP_MAX_P1) { // overflow
957 C1_hi = 0x7800000000000000ull; // +inf
958 C1_lo = 0x0ull;
959 x_exp = 0; // x_sign is preserved
960 // set overflow flag (the inexact flag was set too)
961 *pfpsf |= OVERFLOW_EXCEPTION;
962 }
963 }
964 } else if ((rnd_mode == ROUNDING_DOWN && !x_sign && y_sign) ||
965 (rnd_mode == ROUNDING_UP && x_sign && !y_sign) ||
966 (rnd_mode == ROUNDING_TO_ZERO
967 && x_sign != y_sign)) {
968 // subtract 1 ulp from C1
969 // Note: because delta >= P34 + 1 the result cannot be zero
970 C1_lo = C1_lo - 1;
971 if (C1_lo == 0xffffffffffffffffull)
972 C1_hi = C1_hi - 1;
973 // if the coefficient is 10^33 - 1 then make it 10^34 - 1 and
974 // decrease the exponent by 1 (because delta >= P34 + 1 the
975 // exponent will not become less than e_min)
976 // 10^33 - 1 = 0x0000314dc6448d9338c15b09ffffffff
977 // 10^34 - 1 = 0x0001ed09bead87c0378d8e63ffffffff
978 if (C1_hi == 0x0000314dc6448d93ull
979 && C1_lo == 0x38c15b09ffffffffull) {
980 // make C1 = 10^34 - 1
981 C1_hi = 0x0001ed09bead87c0ull;
982 C1_lo = 0x378d8e63ffffffffull;
983 x_exp = x_exp - EXP_P1;
984 }
985 } else {
986 ; // the result is already correct
987 }
988 }
989 // set the inexact flag
990 *pfpsf |= INEXACT_EXCEPTION;
991 // assemble the result
992 res.w[1] = x_sign | x_exp | C1_hi;
993 res.w[0] = C1_lo;
994 } else { // delta = P34
995 // in most cases, the smaller operand may be < or = or > 1/2 ulp of the
996 // larger operand
997 // however, the case C1 = 10^(q1-1) and x_sign != y_sign is special due
998 // to accuracy loss after subtraction, and will be treated separately
999 if (x_sign == y_sign || (q1 <= 20
1000 && (C1_hi != 0
1001 || C1_lo != ten2k64[q1 - 1]))
1002 || (q1 >= 21 && (C1_hi != ten2k128[q1 - 21].w[1]
1003 || C1_lo != ten2k128[q1 - 21].w[0]))) {
1004 // if x_sign == y_sign or C1 != 10^(q1-1)
1005 // compare C2 with 1/2 ulp = 5 * 10^(q2-1), the latter read from table
1006 // Note: cases q1<=19 and q1>=20 can be coalesced at some latency cost
1007 if (q2 <= 19) { // C2 and 5*10^(q2-1) both fit in 64 bits
1008 halfulp64 = midpoint64[q2 - 1]; // 5 * 10^(q2-1)
1009 if (C2_lo < halfulp64) { // n2 < 1/2 ulp (n1)
1010 // for RN the result is the operand with the larger magnitude,
1011 // possibly scaled up by 10^(P34-q1)
1012 // an overflow cannot occur in this case (rounding to nearest)
1013 if (q1 < P34) { // scale C1 up by 10^(P34-q1)
1014 // Note: because delta = P34 it is certain that
1015 // x_exp - ((UINT64)scale << 49) will stay above e_min
1016 scale = P34 - q1;
1017 if (q1 <= 19) { // C1 fits in 64 bits
1018 // 1 <= q1 <= 19 => 15 <= scale <= 33
1019 if (scale <= 19) { // 10^scale fits in 64 bits
1020 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1021 } else { // if 20 <= scale <= 33
1022 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1023 // (C1 * 10^(scale-19)) fits in 64 bits
1024 C1_lo = C1_lo * ten2k64[scale - 19];
1025 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1026 }
1027 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1028 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1029 C1.w[1] = C1_hi;
1030 C1.w[0] = C1_lo;
1031 // C1 = ten2k64[P34 - q1] * C1
1032 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1033 }
1034 x_exp = x_exp - ((UINT64) scale << 49);
1035 C1_hi = C1.w[1];
1036 C1_lo = C1.w[0];
1037 }
1038 if (rnd_mode != ROUNDING_TO_NEAREST) {
1039 if ((rnd_mode == ROUNDING_DOWN && x_sign && y_sign) ||
1040 (rnd_mode == ROUNDING_UP && !x_sign && !y_sign)) {
1041 // add 1 ulp and then check for overflow
1042 C1_lo = C1_lo + 1;
1043 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1044 C1_hi = C1_hi + 1;
1045 }
1046 if (C1_hi == 0x0001ed09bead87c0ull
1047 && C1_lo == 0x378d8e6400000000ull) {
1048 // C1 = 10^34 => rounding overflow
1049 C1_hi = 0x0000314dc6448d93ull;
1050 C1_lo = 0x38c15b0a00000000ull; // 10^33
1051 x_exp = x_exp + EXP_P1;
1052 if (x_exp == EXP_MAX_P1) { // overflow
1053 C1_hi = 0x7800000000000000ull; // +inf
1054 C1_lo = 0x0ull;
1055 x_exp = 0; // x_sign is preserved
1056 // set overflow flag (the inexact flag was set too)
1057 *pfpsf |= OVERFLOW_EXCEPTION;
1058 }
1059 }
1060 } else
1061 if ((rnd_mode == ROUNDING_DOWN && !x_sign && y_sign)
1062 || (rnd_mode == ROUNDING_UP && x_sign && !y_sign)
1063 || (rnd_mode == ROUNDING_TO_ZERO
1064 && x_sign != y_sign)) {
1065 // subtract 1 ulp from C1
1066 // Note: because delta >= P34 + 1 the result cannot be zero
1067 C1_lo = C1_lo - 1;
1068 if (C1_lo == 0xffffffffffffffffull)
1069 C1_hi = C1_hi - 1;
1070 // if the coefficient is 10^33-1 then make it 10^34-1 and
1071 // decrease the exponent by 1 (because delta >= P34 + 1 the
1072 // exponent will not become less than e_min)
1073 // 10^33 - 1 = 0x0000314dc6448d9338c15b09ffffffff
1074 // 10^34 - 1 = 0x0001ed09bead87c0378d8e63ffffffff
1075 if (C1_hi == 0x0000314dc6448d93ull
1076 && C1_lo == 0x38c15b09ffffffffull) {
1077 // make C1 = 10^34 - 1
1078 C1_hi = 0x0001ed09bead87c0ull;
1079 C1_lo = 0x378d8e63ffffffffull;
1080 x_exp = x_exp - EXP_P1;
1081 }
1082 } else {
1083 ; // the result is already correct
1084 }
1085 }
1086 // set the inexact flag
1087 *pfpsf |= INEXACT_EXCEPTION;
1088 // assemble the result
1089 res.w[1] = x_sign | x_exp | C1_hi;
1090 res.w[0] = C1_lo;
1091 } else if ((C2_lo == halfulp64)
1092 && (q1 < P34 || ((C1_lo & 0x1) == 0))) {
1093 // n2 = 1/2 ulp (n1) and C1 is even
1094 // the result is the operand with the larger magnitude,
1095 // possibly scaled up by 10^(P34-q1)
1096 // an overflow cannot occur in this case (rounding to nearest)
1097 if (q1 < P34) { // scale C1 up by 10^(P34-q1)
1098 // Note: because delta = P34 it is certain that
1099 // x_exp - ((UINT64)scale << 49) will stay above e_min
1100 scale = P34 - q1;
1101 if (q1 <= 19) { // C1 fits in 64 bits
1102 // 1 <= q1 <= 19 => 15 <= scale <= 33
1103 if (scale <= 19) { // 10^scale fits in 64 bits
1104 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1105 } else { // if 20 <= scale <= 33
1106 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1107 // (C1 * 10^(scale-19)) fits in 64 bits
1108 C1_lo = C1_lo * ten2k64[scale - 19];
1109 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1110 }
1111 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1112 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1113 C1.w[1] = C1_hi;
1114 C1.w[0] = C1_lo;
1115 // C1 = ten2k64[P34 - q1] * C1
1116 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1117 }
1118 x_exp = x_exp - ((UINT64) scale << 49);
1119 C1_hi = C1.w[1];
1120 C1_lo = C1.w[0];
1121 }
1122 if ((rnd_mode == ROUNDING_TO_NEAREST && x_sign == y_sign
1123 && (C1_lo & 0x01)) || (rnd_mode == ROUNDING_TIES_AWAY
1124 && x_sign == y_sign)
1125 || (rnd_mode == ROUNDING_UP && !x_sign && !y_sign)
1126 || (rnd_mode == ROUNDING_DOWN && x_sign && y_sign)) {
1127 // add 1 ulp and then check for overflow
1128 C1_lo = C1_lo + 1;
1129 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1130 C1_hi = C1_hi + 1;
1131 }
1132 if (C1_hi == 0x0001ed09bead87c0ull
1133 && C1_lo == 0x378d8e6400000000ull) {
1134 // C1 = 10^34 => rounding overflow
1135 C1_hi = 0x0000314dc6448d93ull;
1136 C1_lo = 0x38c15b0a00000000ull; // 10^33
1137 x_exp = x_exp + EXP_P1;
1138 if (x_exp == EXP_MAX_P1) { // overflow
1139 C1_hi = 0x7800000000000000ull; // +inf
1140 C1_lo = 0x0ull;
1141 x_exp = 0; // x_sign is preserved
1142 // set overflow flag (the inexact flag was set too)
1143 *pfpsf |= OVERFLOW_EXCEPTION;
1144 }
1145 }
1146 } else
1147 if ((rnd_mode == ROUNDING_TO_NEAREST && x_sign != y_sign
1148 && (C1_lo & 0x01)) || (rnd_mode == ROUNDING_DOWN
1149 && !x_sign && y_sign)
1150 || (rnd_mode == ROUNDING_UP && x_sign && !y_sign)
1151 || (rnd_mode == ROUNDING_TO_ZERO
1152 && x_sign != y_sign)) {
1153 // subtract 1 ulp from C1
1154 // Note: because delta >= P34 + 1 the result cannot be zero
1155 C1_lo = C1_lo - 1;
1156 if (C1_lo == 0xffffffffffffffffull)
1157 C1_hi = C1_hi - 1;
1158 // if the coefficient is 10^33 - 1 then make it 10^34 - 1
1159 // and decrease the exponent by 1 (because delta >= P34 + 1
1160 // the exponent will not become less than e_min)
1161 // 10^33 - 1 = 0x0000314dc6448d9338c15b09ffffffff
1162 // 10^34 - 1 = 0x0001ed09bead87c0378d8e63ffffffff
1163 if (C1_hi == 0x0000314dc6448d93ull
1164 && C1_lo == 0x38c15b09ffffffffull) {
1165 // make C1 = 10^34 - 1
1166 C1_hi = 0x0001ed09bead87c0ull;
1167 C1_lo = 0x378d8e63ffffffffull;
1168 x_exp = x_exp - EXP_P1;
1169 }
1170 } else {
1171 ; // the result is already correct
1172 }
1173 // set the inexact flag
1174 *pfpsf |= INEXACT_EXCEPTION;
1175 // assemble the result
1176 res.w[1] = x_sign | x_exp | C1_hi;
1177 res.w[0] = C1_lo;
1178 } else { // if C2_lo > halfulp64 ||
1179 // (C2_lo == halfulp64 && q1 == P34 && ((C1_lo & 0x1) == 1)), i.e.
1180 // 1/2 ulp(n1) < n2 < 1 ulp(n1) or n2 = 1/2 ulp(n1) and C1 odd
1181 // res = x+1 ulp if n1*n2 > 0 and res = x-1 ulp if n1*n2 < 0
1182 if (q1 < P34) { // then 1 ulp = 10^(e1+q1-P34) < 10^e1
1183 // Note: if (q1 == P34) then 1 ulp = 10^(e1+q1-P34) = 10^e1
1184 // because q1 < P34 we must first replace C1 by
1185 // C1 * 10^(P34-q1), and must decrease the exponent by
1186 // (P34-q1) (it will still be at least e_min)
1187 scale = P34 - q1;
1188 if (q1 <= 19) { // C1 fits in 64 bits
1189 // 1 <= q1 <= 19 => 15 <= scale <= 33
1190 if (scale <= 19) { // 10^scale fits in 64 bits
1191 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1192 } else { // if 20 <= scale <= 33
1193 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1194 // (C1 * 10^(scale-19)) fits in 64 bits
1195 C1_lo = C1_lo * ten2k64[scale - 19];
1196 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1197 }
1198 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1199 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1200 C1.w[1] = C1_hi;
1201 C1.w[0] = C1_lo;
1202 // C1 = ten2k64[P34 - q1] * C1
1203 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1204 }
1205 x_exp = x_exp - ((UINT64) scale << 49);
1206 C1_hi = C1.w[1];
1207 C1_lo = C1.w[0];
1208 // check for rounding overflow
1209 if (C1_hi == 0x0001ed09bead87c0ull
1210 && C1_lo == 0x378d8e6400000000ull) {
1211 // C1 = 10^34 => rounding overflow
1212 C1_hi = 0x0000314dc6448d93ull;
1213 C1_lo = 0x38c15b0a00000000ull; // 10^33
1214 x_exp = x_exp + EXP_P1;
1215 }
1216 }
1217 if ((rnd_mode == ROUNDING_TO_NEAREST && x_sign != y_sign)
1218 || (rnd_mode == ROUNDING_TIES_AWAY && x_sign != y_sign
1219 && C2_lo != halfulp64)
1220 || (rnd_mode == ROUNDING_DOWN && !x_sign && y_sign)
1221 || (rnd_mode == ROUNDING_UP && x_sign && !y_sign)
1222 || (rnd_mode == ROUNDING_TO_ZERO
1223 && x_sign != y_sign)) {
1224 // the result is x - 1
1225 // for RN n1 * n2 < 0; underflow not possible
1226 C1_lo = C1_lo - 1;
1227 if (C1_lo == 0xffffffffffffffffull)
1228 C1_hi--;
1229 // check if we crossed into the lower decade
1230 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
1231 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
1232 C1_lo = 0x378d8e63ffffffffull;
1233 x_exp = x_exp - EXP_P1; // no underflow, because n1 >> n2
1234 }
1235 } else
1236 if ((rnd_mode == ROUNDING_TO_NEAREST
1237 && x_sign == y_sign)
1238 || (rnd_mode == ROUNDING_TIES_AWAY
1239 && x_sign == y_sign)
1240 || (rnd_mode == ROUNDING_DOWN && x_sign && y_sign)
1241 || (rnd_mode == ROUNDING_UP && !x_sign
1242 && !y_sign)) {
1243 // the result is x + 1
1244 // for RN x_sign = y_sign, i.e. n1*n2 > 0
1245 C1_lo = C1_lo + 1;
1246 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1247 C1_hi = C1_hi + 1;
1248 }
1249 if (C1_hi == 0x0001ed09bead87c0ull
1250 && C1_lo == 0x378d8e6400000000ull) {
1251 // C1 = 10^34 => rounding overflow
1252 C1_hi = 0x0000314dc6448d93ull;
1253 C1_lo = 0x38c15b0a00000000ull; // 10^33
1254 x_exp = x_exp + EXP_P1;
1255 if (x_exp == EXP_MAX_P1) { // overflow
1256 C1_hi = 0x7800000000000000ull; // +inf
1257 C1_lo = 0x0ull;
1258 x_exp = 0; // x_sign is preserved
1259 // set the overflow flag
1260 *pfpsf |= OVERFLOW_EXCEPTION;
1261 }
1262 }
1263 } else {
1264 ; // the result is x
1265 }
1266 // set the inexact flag
1267 *pfpsf |= INEXACT_EXCEPTION;
1268 // assemble the result
1269 res.w[1] = x_sign | x_exp | C1_hi;
1270 res.w[0] = C1_lo;
1271 }
1272 } else { // if q2 >= 20 then 5*10^(q2-1) and C2 (the latter in
1273 // most cases) fit only in more than 64 bits
1274 halfulp128 = midpoint128[q2 - 20]; // 5 * 10^(q2-1)
1275 if ((C2_hi < halfulp128.w[1])
1276 || (C2_hi == halfulp128.w[1]
1277 && C2_lo < halfulp128.w[0])) {
1278 // n2 < 1/2 ulp (n1)
1279 // the result is the operand with the larger magnitude,
1280 // possibly scaled up by 10^(P34-q1)
1281 // an overflow cannot occur in this case (rounding to nearest)
1282 if (q1 < P34) { // scale C1 up by 10^(P34-q1)
1283 // Note: because delta = P34 it is certain that
1284 // x_exp - ((UINT64)scale << 49) will stay above e_min
1285 scale = P34 - q1;
1286 if (q1 <= 19) { // C1 fits in 64 bits
1287 // 1 <= q1 <= 19 => 15 <= scale <= 33
1288 if (scale <= 19) { // 10^scale fits in 64 bits
1289 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1290 } else { // if 20 <= scale <= 33
1291 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1292 // (C1 * 10^(scale-19)) fits in 64 bits
1293 C1_lo = C1_lo * ten2k64[scale - 19];
1294 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1295 }
1296 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1297 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1298 C1.w[1] = C1_hi;
1299 C1.w[0] = C1_lo;
1300 // C1 = ten2k64[P34 - q1] * C1
1301 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1302 }
1303 C1_hi = C1.w[1];
1304 C1_lo = C1.w[0];
1305 x_exp = x_exp - ((UINT64) scale << 49);
1306 }
1307 if (rnd_mode != ROUNDING_TO_NEAREST) {
1308 if ((rnd_mode == ROUNDING_DOWN && x_sign && y_sign) ||
1309 (rnd_mode == ROUNDING_UP && !x_sign && !y_sign)) {
1310 // add 1 ulp and then check for overflow
1311 C1_lo = C1_lo + 1;
1312 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1313 C1_hi = C1_hi + 1;
1314 }
1315 if (C1_hi == 0x0001ed09bead87c0ull
1316 && C1_lo == 0x378d8e6400000000ull) {
1317 // C1 = 10^34 => rounding overflow
1318 C1_hi = 0x0000314dc6448d93ull;
1319 C1_lo = 0x38c15b0a00000000ull; // 10^33
1320 x_exp = x_exp + EXP_P1;
1321 if (x_exp == EXP_MAX_P1) { // overflow
1322 C1_hi = 0x7800000000000000ull; // +inf
1323 C1_lo = 0x0ull;
1324 x_exp = 0; // x_sign is preserved
1325 // set overflow flag (the inexact flag was set too)
1326 *pfpsf |= OVERFLOW_EXCEPTION;
1327 }
1328 }
1329 } else
1330 if ((rnd_mode == ROUNDING_DOWN && !x_sign && y_sign)
1331 || (rnd_mode == ROUNDING_UP && x_sign && !y_sign)
1332 || (rnd_mode == ROUNDING_TO_ZERO
1333 && x_sign != y_sign)) {
1334 // subtract 1 ulp from C1
1335 // Note: because delta >= P34 + 1 the result cannot be zero
1336 C1_lo = C1_lo - 1;
1337 if (C1_lo == 0xffffffffffffffffull)
1338 C1_hi = C1_hi - 1;
1339 // if the coefficient is 10^33-1 then make it 10^34-1 and
1340 // decrease the exponent by 1 (because delta >= P34 + 1 the
1341 // exponent will not become less than e_min)
1342 // 10^33 - 1 = 0x0000314dc6448d9338c15b09ffffffff
1343 // 10^34 - 1 = 0x0001ed09bead87c0378d8e63ffffffff
1344 if (C1_hi == 0x0000314dc6448d93ull
1345 && C1_lo == 0x38c15b09ffffffffull) {
1346 // make C1 = 10^34 - 1
1347 C1_hi = 0x0001ed09bead87c0ull;
1348 C1_lo = 0x378d8e63ffffffffull;
1349 x_exp = x_exp - EXP_P1;
1350 }
1351 } else {
1352 ; // the result is already correct
1353 }
1354 }
1355 // set the inexact flag
1356 *pfpsf |= INEXACT_EXCEPTION;
1357 // assemble the result
1358 res.w[1] = x_sign | x_exp | C1_hi;
1359 res.w[0] = C1_lo;
1360 } else if ((C2_hi == halfulp128.w[1]
1361 && C2_lo == halfulp128.w[0])
1362 && (q1 < P34 || ((C1_lo & 0x1) == 0))) {
1363 // midpoint & lsb in C1 is 0
1364 // n2 = 1/2 ulp (n1) and C1 is even
1365 // the result is the operand with the larger magnitude,
1366 // possibly scaled up by 10^(P34-q1)
1367 // an overflow cannot occur in this case (rounding to nearest)
1368 if (q1 < P34) { // scale C1 up by 10^(P34-q1)
1369 // Note: because delta = P34 it is certain that
1370 // x_exp - ((UINT64)scale << 49) will stay above e_min
1371 scale = P34 - q1;
1372 if (q1 <= 19) { // C1 fits in 64 bits
1373 // 1 <= q1 <= 19 => 15 <= scale <= 33
1374 if (scale <= 19) { // 10^scale fits in 64 bits
1375 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1376 } else { // if 20 <= scale <= 33
1377 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1378 // (C1 * 10^(scale-19)) fits in 64 bits
1379 C1_lo = C1_lo * ten2k64[scale - 19];
1380 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1381 }
1382 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1383 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1384 C1.w[1] = C1_hi;
1385 C1.w[0] = C1_lo;
1386 // C1 = ten2k64[P34 - q1] * C1
1387 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1388 }
1389 x_exp = x_exp - ((UINT64) scale << 49);
1390 C1_hi = C1.w[1];
1391 C1_lo = C1.w[0];
1392 }
1393 if (rnd_mode != ROUNDING_TO_NEAREST) {
1394 if ((rnd_mode == ROUNDING_TIES_AWAY && x_sign == y_sign)
1395 || (rnd_mode == ROUNDING_UP && !y_sign)) {
1396 // add 1 ulp and then check for overflow
1397 C1_lo = C1_lo + 1;
1398 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1399 C1_hi = C1_hi + 1;
1400 }
1401 if (C1_hi == 0x0001ed09bead87c0ull
1402 && C1_lo == 0x378d8e6400000000ull) {
1403 // C1 = 10^34 => rounding overflow
1404 C1_hi = 0x0000314dc6448d93ull;
1405 C1_lo = 0x38c15b0a00000000ull; // 10^33
1406 x_exp = x_exp + EXP_P1;
1407 if (x_exp == EXP_MAX_P1) { // overflow
1408 C1_hi = 0x7800000000000000ull; // +inf
1409 C1_lo = 0x0ull;
1410 x_exp = 0; // x_sign is preserved
1411 // set overflow flag (the inexact flag was set too)
1412 *pfpsf |= OVERFLOW_EXCEPTION;
1413 }
1414 }
1415 } else if ((rnd_mode == ROUNDING_DOWN && y_sign)
1416 || (rnd_mode == ROUNDING_TO_ZERO
1417 && x_sign != y_sign)) {
1418 // subtract 1 ulp from C1
1419 // Note: because delta >= P34 + 1 the result cannot be zero
1420 C1_lo = C1_lo - 1;
1421 if (C1_lo == 0xffffffffffffffffull)
1422 C1_hi = C1_hi - 1;
1423 // if the coefficient is 10^33 - 1 then make it 10^34 - 1
1424 // and decrease the exponent by 1 (because delta >= P34 + 1
1425 // the exponent will not become less than e_min)
1426 // 10^33 - 1 = 0x0000314dc6448d9338c15b09ffffffff
1427 // 10^34 - 1 = 0x0001ed09bead87c0378d8e63ffffffff
1428 if (C1_hi == 0x0000314dc6448d93ull
1429 && C1_lo == 0x38c15b09ffffffffull) {
1430 // make C1 = 10^34 - 1
1431 C1_hi = 0x0001ed09bead87c0ull;
1432 C1_lo = 0x378d8e63ffffffffull;
1433 x_exp = x_exp - EXP_P1;
1434 }
1435 } else {
1436 ; // the result is already correct
1437 }
1438 }
1439 // set the inexact flag
1440 *pfpsf |= INEXACT_EXCEPTION;
1441 // assemble the result
1442 res.w[1] = x_sign | x_exp | C1_hi;
1443 res.w[0] = C1_lo;
1444 } else { // if C2 > halfulp128 ||
1445 // (C2 == halfulp128 && q1 == P34 && ((C1 & 0x1) == 1)), i.e.
1446 // 1/2 ulp(n1) < n2 < 1 ulp(n1) or n2 = 1/2 ulp(n1) and C1 odd
1447 // res = x+1 ulp if n1*n2 > 0 and res = x-1 ulp if n1*n2 < 0
1448 if (q1 < P34) { // then 1 ulp = 10^(e1+q1-P34) < 10^e1
1449 // Note: if (q1 == P34) then 1 ulp = 10^(e1+q1-P34) = 10^e1
1450 // because q1 < P34 we must first replace C1 by C1*10^(P34-q1),
1451 // and must decrease the exponent by (P34-q1) (it will still be
1452 // at least e_min)
1453 scale = P34 - q1;
1454 if (q1 <= 19) { // C1 fits in 64 bits
1455 // 1 <= q1 <= 19 => 15 <= scale <= 33
1456 if (scale <= 19) { // 10^scale fits in 64 bits
1457 __mul_64x64_to_128MACH (C1, ten2k64[scale], C1_lo);
1458 } else { // if 20 <= scale <= 33
1459 // C1 * 10^scale = (C1 * 10^(scale-19)) * 10^19 where
1460 // (C1 * 10^(scale-19)) fits in 64 bits
1461 C1_lo = C1_lo * ten2k64[scale - 19];
1462 __mul_64x64_to_128MACH (C1, ten2k64[19], C1_lo);
1463 }
1464 } else { //if 20 <= q1 <= 33=P34-1 then C1 fits only in 128 bits
1465 // => 1 <= P34 - q1 <= 14 so 10^(P34-q1) fits in 64 bits
1466 C1.w[1] = C1_hi;
1467 C1.w[0] = C1_lo;
1468 // C1 = ten2k64[P34 - q1] * C1
1469 __mul_128x64_to_128 (C1, ten2k64[P34 - q1], C1);
1470 }
1471 C1_hi = C1.w[1];
1472 C1_lo = C1.w[0];
1473 x_exp = x_exp - ((UINT64) scale << 49);
1474 }
1475 if ((rnd_mode == ROUNDING_TO_NEAREST && x_sign != y_sign)
1476 || (rnd_mode == ROUNDING_TIES_AWAY && x_sign != y_sign
1477 && (C2_hi != halfulp128.w[1]
1478 || C2_lo != halfulp128.w[0]))
1479 || (rnd_mode == ROUNDING_DOWN && !x_sign && y_sign)
1480 || (rnd_mode == ROUNDING_UP && x_sign && !y_sign)
1481 || (rnd_mode == ROUNDING_TO_ZERO
1482 && x_sign != y_sign)) {
1483 // the result is x - 1
1484 // for RN n1 * n2 < 0; underflow not possible
1485 C1_lo = C1_lo - 1;
1486 if (C1_lo == 0xffffffffffffffffull)
1487 C1_hi--;
1488 // check if we crossed into the lower decade
1489 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
1490 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
1491 C1_lo = 0x378d8e63ffffffffull;
1492 x_exp = x_exp - EXP_P1; // no underflow, because n1 >> n2
1493 }
1494 } else
1495 if ((rnd_mode == ROUNDING_TO_NEAREST
1496 && x_sign == y_sign)
1497 || (rnd_mode == ROUNDING_TIES_AWAY
1498 && x_sign == y_sign)
1499 || (rnd_mode == ROUNDING_DOWN && x_sign && y_sign)
1500 || (rnd_mode == ROUNDING_UP && !x_sign
1501 && !y_sign)) {
1502 // the result is x + 1
1503 // for RN x_sign = y_sign, i.e. n1*n2 > 0
1504 C1_lo = C1_lo + 1;
1505 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1506 C1_hi = C1_hi + 1;
1507 }
1508 if (C1_hi == 0x0001ed09bead87c0ull
1509 && C1_lo == 0x378d8e6400000000ull) {
1510 // C1 = 10^34 => rounding overflow
1511 C1_hi = 0x0000314dc6448d93ull;
1512 C1_lo = 0x38c15b0a00000000ull; // 10^33
1513 x_exp = x_exp + EXP_P1;
1514 if (x_exp == EXP_MAX_P1) { // overflow
1515 C1_hi = 0x7800000000000000ull; // +inf
1516 C1_lo = 0x0ull;
1517 x_exp = 0; // x_sign is preserved
1518 // set the overflow flag
1519 *pfpsf |= OVERFLOW_EXCEPTION;
1520 }
1521 }
1522 } else {
1523 ; // the result is x
1524 }
1525 // set the inexact flag
1526 *pfpsf |= INEXACT_EXCEPTION;
1527 // assemble the result
1528 res.w[1] = x_sign | x_exp | C1_hi;
1529 res.w[0] = C1_lo;
1530 }
1531 } // end q1 >= 20
1532 // end case where C1 != 10^(q1-1)
1533 } else { // C1 = 10^(q1-1) and x_sign != y_sign
1534 // instead of C' = (C1 * 10^(e1-e2) + C2)rnd,P34
1535 // calculate C' = C1 * 10^(e1-e2-x1) + (C2 * 10^(-x1))rnd,P34
1536 // where x1 = q2 - 1, 0 <= x1 <= P34 - 1
1537 // Because C1 = 10^(q1-1) and x_sign != y_sign, C' will have P34
1538 // digits and n = C' * 10^(e2+x1)
1539 // If the result has P34+1 digits, redo the steps above with x1+1
1540 // If the result has P34-1 digits or less, redo the steps above with
1541 // x1-1 but only if initially x1 >= 1
1542 // NOTE: these two steps can be improved, e.g we could guess if
1543 // P34+1 or P34-1 digits will be obtained by adding/subtracting
1544 // just the top 64 bits of the two operands
1545 // The result cannot be zero, and it cannot overflow
1546 x1 = q2 - 1; // 0 <= x1 <= P34-1
1547 // Calculate C1 * 10^(e1-e2-x1) where 1 <= e1-e2-x1 <= P34
1548 // scale = (int)(e1 >> 49) - (int)(e2 >> 49) - x1; 0 <= scale <= P34-1
1549 scale = P34 - q1 + 1; // scale=e1-e2-x1 = P34+1-q1; 1<=scale<=P34
1550 // either C1 or 10^(e1-e2-x1) may not fit is 64 bits,
1551 // but their product fits with certainty in 128 bits
1552 if (scale >= 20) { //10^(e1-e2-x1) doesn't fit in 64 bits, but C1 does
1553 __mul_128x64_to_128 (C1, C1_lo, ten2k128[scale - 20]);
1554 } else { // if (scale >= 1
1555 // if 1 <= scale <= 19 then 10^(e1-e2-x1) fits in 64 bits
1556 if (q1 <= 19) { // C1 fits in 64 bits
1557 __mul_64x64_to_128MACH (C1, C1_lo, ten2k64[scale]);
1558 } else { // q1 >= 20
1559 C1.w[1] = C1_hi;
1560 C1.w[0] = C1_lo;
1561 __mul_128x64_to_128 (C1, ten2k64[scale], C1);
1562 }
1563 }
1564 tmp64 = C1.w[0]; // C1.w[1], C1.w[0] contains C1 * 10^(e1-e2-x1)
1565
1566 // now round C2 to q2-x1 = 1 decimal digit
1567 // C2' = C2 + 1/2 * 10^x1 = C2 + 5 * 10^(x1-1)
1568 ind = x1 - 1; // -1 <= ind <= P34 - 2
1569 if (ind >= 0) { // if (x1 >= 1)
1570 C2.w[0] = C2_lo;
1571 C2.w[1] = C2_hi;
1572 if (ind <= 18) {
1573 C2.w[0] = C2.w[0] + midpoint64[ind];
1574 if (C2.w[0] < C2_lo)
1575 C2.w[1]++;
1576 } else { // 19 <= ind <= 32
1577 C2.w[0] = C2.w[0] + midpoint128[ind - 19].w[0];
1578 C2.w[1] = C2.w[1] + midpoint128[ind - 19].w[1];
1579 if (C2.w[0] < C2_lo)
1580 C2.w[1]++;
1581 }
1582 // the approximation of 10^(-x1) was rounded up to 118 bits
1583 __mul_128x128_to_256 (R256, C2, ten2mk128[ind]); // R256 = C2*, f2*
1584 // calculate C2* and f2*
1585 // C2* is actually floor(C2*) in this case
1586 // C2* and f2* need shifting and masking, as shown by
1587 // shiftright128[] and maskhigh128[]
1588 // the top Ex bits of 10^(-x1) are T* = ten2mk128trunc[ind], e.g.
1589 // if x1=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
1590 // if (0 < f2* < 10^(-x1)) then
1591 // if floor(C1+C2*) is even then C2* = floor(C2*) - logical right
1592 // shift; C2* has p decimal digits, correct by Prop. 1)
1593 // else if floor(C1+C2*) is odd C2* = floor(C2*)-1 (logical right
1594 // shift; C2* has p decimal digits, correct by Pr. 1)
1595 // else
1596 // C2* = floor(C2*) (logical right shift; C has p decimal digits,
1597 // correct by Property 1)
1598 // n = C2* * 10^(e2+x1)
1599
1600 if (ind <= 2) {
1601 highf2star.w[1] = 0x0;
1602 highf2star.w[0] = 0x0; // low f2* ok
1603 } else if (ind <= 21) {
1604 highf2star.w[1] = 0x0;
1605 highf2star.w[0] = R256.w[2] & maskhigh128[ind]; // low f2* ok
1606 } else {
1607 highf2star.w[1] = R256.w[3] & maskhigh128[ind];
1608 highf2star.w[0] = R256.w[2]; // low f2* is ok
1609 }
1610 // shift right C2* by Ex-128 = shiftright128[ind]
1611 if (ind >= 3) {
1612 shift = shiftright128[ind];
1613 if (shift < 64) { // 3 <= shift <= 63
1614 R256.w[2] =
1615 (R256.w[2] >> shift) | (R256.w[3] << (64 - shift));
1616 R256.w[3] = (R256.w[3] >> shift);
1617 } else { // 66 <= shift <= 102
1618 R256.w[2] = (R256.w[3] >> (shift - 64));
1619 R256.w[3] = 0x0ULL;
1620 }
1621 }
1622 // redundant
1623 is_inexact_lt_midpoint = 0;
1624 is_inexact_gt_midpoint = 0;
1625 is_midpoint_lt_even = 0;
1626 is_midpoint_gt_even = 0;
1627 // determine inexactness of the rounding of C2*
1628 // (cannot be followed by a second rounding)
1629 // if (0 < f2* - 1/2 < 10^(-x1)) then
1630 // the result is exact
1631 // else (if f2* - 1/2 > T* then)
1632 // the result of is inexact
1633 if (ind <= 2) {
1634 if (R256.w[1] > 0x8000000000000000ull ||
1635 (R256.w[1] == 0x8000000000000000ull
1636 && R256.w[0] > 0x0ull)) {
1637 // f2* > 1/2 and the result may be exact
1638 tmp64A = R256.w[1] - 0x8000000000000000ull; // f* - 1/2
1639 if ((tmp64A > ten2mk128trunc[ind].w[1]
1640 || (tmp64A == ten2mk128trunc[ind].w[1]
1641 && R256.w[0] >= ten2mk128trunc[ind].w[0]))) {
1642 // set the inexact flag
1643 *pfpsf |= INEXACT_EXCEPTION;
1644 // this rounding is applied to C2 only!
1645 // x_sign != y_sign
1646 is_inexact_gt_midpoint = 1;
1647 } // else the result is exact
1648 // rounding down, unless a midpoint in [ODD, EVEN]
1649 } else { // the result is inexact; f2* <= 1/2
1650 // set the inexact flag
1651 *pfpsf |= INEXACT_EXCEPTION;
1652 // this rounding is applied to C2 only!
1653 // x_sign != y_sign
1654 is_inexact_lt_midpoint = 1;
1655 }
1656 } else if (ind <= 21) { // if 3 <= ind <= 21
1657 if (highf2star.w[1] > 0x0 || (highf2star.w[1] == 0x0
1658 && highf2star.w[0] >
1659 onehalf128[ind])
1660 || (highf2star.w[1] == 0x0
1661 && highf2star.w[0] == onehalf128[ind]
1662 && (R256.w[1] || R256.w[0]))) {
1663 // f2* > 1/2 and the result may be exact
1664 // Calculate f2* - 1/2
1665 tmp64A = highf2star.w[0] - onehalf128[ind];
1666 tmp64B = highf2star.w[1];
1667 if (tmp64A > highf2star.w[0])
1668 tmp64B--;
1669 if (tmp64B || tmp64A
1670 || R256.w[1] > ten2mk128trunc[ind].w[1]
1671 || (R256.w[1] == ten2mk128trunc[ind].w[1]
1672 && R256.w[0] > ten2mk128trunc[ind].w[0])) {
1673 // set the inexact flag
1674 *pfpsf |= INEXACT_EXCEPTION;
1675 // this rounding is applied to C2 only!
1676 // x_sign != y_sign
1677 is_inexact_gt_midpoint = 1;
1678 } // else the result is exact
1679 } else { // the result is inexact; f2* <= 1/2
1680 // set the inexact flag
1681 *pfpsf |= INEXACT_EXCEPTION;
1682 // this rounding is applied to C2 only!
1683 // x_sign != y_sign
1684 is_inexact_lt_midpoint = 1;
1685 }
1686 } else { // if 22 <= ind <= 33
1687 if (highf2star.w[1] > onehalf128[ind]
1688 || (highf2star.w[1] == onehalf128[ind]
1689 && (highf2star.w[0] || R256.w[1]
1690 || R256.w[0]))) {
1691 // f2* > 1/2 and the result may be exact
1692 // Calculate f2* - 1/2
1693 // tmp64A = highf2star.w[0];
1694 tmp64B = highf2star.w[1] - onehalf128[ind];
1695 if (tmp64B || highf2star.w[0]
1696 || R256.w[1] > ten2mk128trunc[ind].w[1]
1697 || (R256.w[1] == ten2mk128trunc[ind].w[1]
1698 && R256.w[0] > ten2mk128trunc[ind].w[0])) {
1699 // set the inexact flag
1700 *pfpsf |= INEXACT_EXCEPTION;
1701 // this rounding is applied to C2 only!
1702 // x_sign != y_sign
1703 is_inexact_gt_midpoint = 1;
1704 } // else the result is exact
1705 } else { // the result is inexact; f2* <= 1/2
1706 // set the inexact flag
1707 *pfpsf |= INEXACT_EXCEPTION;
1708 // this rounding is applied to C2 only!
1709 // x_sign != y_sign
1710 is_inexact_lt_midpoint = 1;
1711 }
1712 }
1713 // check for midpoints after determining inexactness
1714 if ((R256.w[1] || R256.w[0]) && (highf2star.w[1] == 0)
1715 && (highf2star.w[0] == 0)
1716 && (R256.w[1] < ten2mk128trunc[ind].w[1]
1717 || (R256.w[1] == ten2mk128trunc[ind].w[1]
1718 && R256.w[0] <= ten2mk128trunc[ind].w[0]))) {
1719 // the result is a midpoint
1720 if ((tmp64 + R256.w[2]) & 0x01) { // MP in [EVEN, ODD]
1721 // if floor(C2*) is odd C = floor(C2*) - 1; the result may be 0
1722 R256.w[2]--;
1723 if (R256.w[2] == 0xffffffffffffffffull)
1724 R256.w[3]--;
1725 // this rounding is applied to C2 only!
1726 // x_sign != y_sign
1727 is_midpoint_lt_even = 1;
1728 is_inexact_lt_midpoint = 0;
1729 is_inexact_gt_midpoint = 0;
1730 } else {
1731 // else MP in [ODD, EVEN]
1732 // this rounding is applied to C2 only!
1733 // x_sign != y_sign
1734 is_midpoint_gt_even = 1;
1735 is_inexact_lt_midpoint = 0;
1736 is_inexact_gt_midpoint = 0;
1737 }
1738 }
1739 } else { // if (ind == -1) only when x1 = 0
1740 R256.w[2] = C2_lo;
1741 R256.w[3] = C2_hi;
1742 is_midpoint_lt_even = 0;
1743 is_midpoint_gt_even = 0;
1744 is_inexact_lt_midpoint = 0;
1745 is_inexact_gt_midpoint = 0;
1746 }
1747 // and now subtract C1 * 10^(e1-e2-x1) - (C2 * 10^(-x1))rnd,P34
1748 // because x_sign != y_sign this last operation is exact
1749 C1.w[0] = C1.w[0] - R256.w[2];
1750 C1.w[1] = C1.w[1] - R256.w[3];
1751 if (C1.w[0] > tmp64)
1752 C1.w[1]--; // borrow
1753 if (C1.w[1] >= 0x8000000000000000ull) { // negative coefficient!
1754 C1.w[0] = ~C1.w[0];
1755 C1.w[0]++;
1756 C1.w[1] = ~C1.w[1];
1757 if (C1.w[0] == 0x0)
1758 C1.w[1]++;
1759 tmp_sign = y_sign; // the result will have the sign of y
1760 } else {
1761 tmp_sign = x_sign;
1762 }
1763 // the difference has exactly P34 digits
1764 x_sign = tmp_sign;
1765 if (x1 >= 1)
1766 y_exp = y_exp + ((UINT64) x1 << 49);
1767 C1_hi = C1.w[1];
1768 C1_lo = C1.w[0];
1769 // general correction from RN to RA, RM, RP, RZ; result uses y_exp
1770 if (rnd_mode != ROUNDING_TO_NEAREST) {
1771 if ((!x_sign
1772 && ((rnd_mode == ROUNDING_UP && is_inexact_lt_midpoint)
1773 ||
1774 ((rnd_mode == ROUNDING_TIES_AWAY
1775 || rnd_mode == ROUNDING_UP)
1776 && is_midpoint_gt_even))) || (x_sign
1777 &&
1778 ((rnd_mode ==
1779 ROUNDING_DOWN
1780 &&
1781 is_inexact_lt_midpoint)
1782 ||
1783 ((rnd_mode ==
1784 ROUNDING_TIES_AWAY
1785 || rnd_mode ==
1786 ROUNDING_DOWN)
1787 &&
1788 is_midpoint_gt_even))))
1789 {
1790 // C1 = C1 + 1
1791 C1_lo = C1_lo + 1;
1792 if (C1_lo == 0) { // rounding overflow in the low 64 bits
1793 C1_hi = C1_hi + 1;
1794 }
1795 if (C1_hi == 0x0001ed09bead87c0ull
1796 && C1_lo == 0x378d8e6400000000ull) {
1797 // C1 = 10^34 => rounding overflow
1798 C1_hi = 0x0000314dc6448d93ull;
1799 C1_lo = 0x38c15b0a00000000ull; // 10^33
1800 y_exp = y_exp + EXP_P1;
1801 }
1802 } else if ((is_midpoint_lt_even || is_inexact_gt_midpoint)
1803 &&
1804 ((x_sign
1805 && (rnd_mode == ROUNDING_UP
1806 || rnd_mode == ROUNDING_TO_ZERO))
1807 || (!x_sign
1808 && (rnd_mode == ROUNDING_DOWN
1809 || rnd_mode == ROUNDING_TO_ZERO)))) {
1810 // C1 = C1 - 1
1811 C1_lo = C1_lo - 1;
1812 if (C1_lo == 0xffffffffffffffffull)
1813 C1_hi--;
1814 // check if we crossed into the lower decade
1815 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
1816 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
1817 C1_lo = 0x378d8e63ffffffffull;
1818 y_exp = y_exp - EXP_P1;
1819 // no underflow, because delta + q2 >= P34 + 1
1820 }
1821 } else {
1822 ; // exact, the result is already correct
1823 }
1824 }
1825 // assemble the result
1826 res.w[1] = x_sign | y_exp | C1_hi;
1827 res.w[0] = C1_lo;
1828 }
1829 } // end delta = P34
1830 } else { // if (|delta| <= P34 - 1)
1831 if (delta >= 0) { // if (0 <= delta <= P34 - 1)
1832 if (delta <= P34 - 1 - q2) {
1833 // calculate C' directly; the result is exact
1834 // in this case 1<=q1<=P34-1, 1<=q2<=P34-1 and 0 <= e1-e2 <= P34-2
1835 // The coefficient of the result is C1 * 10^(e1-e2) + C2 and the
1836 // exponent is e2; either C1 or 10^(e1-e2) may not fit is 64 bits,
1837 // but their product fits with certainty in 128 bits (actually in 113)
1838 scale = delta - q1 + q2; // scale = (int)(e1 >> 49) - (int)(e2 >> 49)
1839
1840 if (scale >= 20) { // 10^(e1-e2) does not fit in 64 bits, but C1 does
1841 __mul_128x64_to_128 (C1, C1_lo, ten2k128[scale - 20]);
1842 C1_hi = C1.w[1];
1843 C1_lo = C1.w[0];
1844 } else if (scale >= 1) {
1845 // if 1 <= scale <= 19 then 10^(e1-e2) fits in 64 bits
1846 if (q1 <= 19) { // C1 fits in 64 bits
1847 __mul_64x64_to_128MACH (C1, C1_lo, ten2k64[scale]);
1848 } else { // q1 >= 20
1849 C1.w[1] = C1_hi;
1850 C1.w[0] = C1_lo;
1851 __mul_128x64_to_128 (C1, ten2k64[scale], C1);
1852 }
1853 C1_hi = C1.w[1];
1854 C1_lo = C1.w[0];
1855 } else { // if (scale == 0) C1 is unchanged
1856 C1.w[0] = C1_lo; // C1.w[1] = C1_hi;
1857 }
1858 // now add C2
1859 if (x_sign == y_sign) {
1860 // the result cannot overflow
1861 C1_lo = C1_lo + C2_lo;
1862 C1_hi = C1_hi + C2_hi;
1863 if (C1_lo < C1.w[0])
1864 C1_hi++;
1865 } else { // if x_sign != y_sign
1866 C1_lo = C1_lo - C2_lo;
1867 C1_hi = C1_hi - C2_hi;
1868 if (C1_lo > C1.w[0])
1869 C1_hi--;
1870 // the result can be zero, but it cannot overflow
1871 if (C1_lo == 0 && C1_hi == 0) {
1872 // assemble the result
1873 if (x_exp < y_exp)
1874 res.w[1] = x_exp;
1875 else
1876 res.w[1] = y_exp;
1877 res.w[0] = 0;
1878 if (rnd_mode == ROUNDING_DOWN) {
1879 res.w[1] |= 0x8000000000000000ull;
1880 }
1881 BID_SWAP128 (res);
1882 BID_RETURN (res);
1883 }
1884 if (C1_hi >= 0x8000000000000000ull) { // negative coefficient!
1885 C1_lo = ~C1_lo;
1886 C1_lo++;
1887 C1_hi = ~C1_hi;
1888 if (C1_lo == 0x0)
1889 C1_hi++;
1890 x_sign = y_sign; // the result will have the sign of y
1891 }
1892 }
1893 // assemble the result
1894 res.w[1] = x_sign | y_exp | C1_hi;
1895 res.w[0] = C1_lo;
1896 } else if (delta == P34 - q2) {
1897 // calculate C' directly; the result may be inexact if it requires
1898 // P34+1 decimal digits; in this case the 'cutoff' point for addition
1899 // is at the position of the lsb of C2, so 0 <= e1-e2 <= P34-1
1900 // The coefficient of the result is C1 * 10^(e1-e2) + C2 and the
1901 // exponent is e2; either C1 or 10^(e1-e2) may not fit is 64 bits,
1902 // but their product fits with certainty in 128 bits (actually in 113)
1903 scale = delta - q1 + q2; // scale = (int)(e1 >> 49) - (int)(e2 >> 49)
1904 if (scale >= 20) { // 10^(e1-e2) does not fit in 64 bits, but C1 does
1905 __mul_128x64_to_128 (C1, C1_lo, ten2k128[scale - 20]);
1906 } else if (scale >= 1) {
1907 // if 1 <= scale <= 19 then 10^(e1-e2) fits in 64 bits
1908 if (q1 <= 19) { // C1 fits in 64 bits
1909 __mul_64x64_to_128MACH (C1, C1_lo, ten2k64[scale]);
1910 } else { // q1 >= 20
1911 C1.w[1] = C1_hi;
1912 C1.w[0] = C1_lo;
1913 __mul_128x64_to_128 (C1, ten2k64[scale], C1);
1914 }
1915 } else { // if (scale == 0) C1 is unchanged
1916 C1.w[1] = C1_hi;
1917 C1.w[0] = C1_lo; // only the low part is necessary
1918 }
1919 C1_hi = C1.w[1];
1920 C1_lo = C1.w[0];
1921 // now add C2
1922 if (x_sign == y_sign) {
1923 // the result can overflow!
1924 C1_lo = C1_lo + C2_lo;
1925 C1_hi = C1_hi + C2_hi;
1926 if (C1_lo < C1.w[0])
1927 C1_hi++;
1928 // test for overflow, possible only when C1 >= 10^34
1929 if (C1_hi > 0x0001ed09bead87c0ull || (C1_hi == 0x0001ed09bead87c0ull && C1_lo >= 0x378d8e6400000000ull)) { // C1 >= 10^34
1930 // in this case q = P34 + 1 and x = q - P34 = 1, so multiply
1931 // C'' = C'+ 5 = C1 + 5 by k1 ~ 10^(-1) calculated for P34 + 1
1932 // decimal digits
1933 // Calculate C'' = C' + 1/2 * 10^x
1934 if (C1_lo >= 0xfffffffffffffffbull) { // low half add has carry
1935 C1_lo = C1_lo + 5;
1936 C1_hi = C1_hi + 1;
1937 } else {
1938 C1_lo = C1_lo + 5;
1939 }
1940 // the approximation of 10^(-1) was rounded up to 118 bits
1941 // 10^(-1) =~ 33333333333333333333333333333400 * 2^-129
1942 // 10^(-1) =~ 19999999999999999999999999999a00 * 2^-128
1943 C1.w[1] = C1_hi;
1944 C1.w[0] = C1_lo; // C''
1945 ten2m1.w[1] = 0x1999999999999999ull;
1946 ten2m1.w[0] = 0x9999999999999a00ull;
1947 __mul_128x128_to_256 (P256, C1, ten2m1); // P256 = C*, f*
1948 // C* is actually floor(C*) in this case
1949 // the top Ex = 128 bits of 10^(-1) are
1950 // T* = 0x00199999999999999999999999999999
1951 // if (0 < f* < 10^(-x)) then
1952 // if floor(C*) is even then C = floor(C*) - logical right
1953 // shift; C has p decimal digits, correct by Prop. 1)
1954 // else if floor(C*) is odd C = floor(C*) - 1 (logical right
1955 // shift; C has p decimal digits, correct by Pr. 1)
1956 // else
1957 // C = floor(C*) (logical right shift; C has p decimal digits,
1958 // correct by Property 1)
1959 // n = C * 10^(e2+x)
1960 if ((P256.w[1] || P256.w[0])
1961 && (P256.w[1] < 0x1999999999999999ull
1962 || (P256.w[1] == 0x1999999999999999ull
1963 && P256.w[0] <= 0x9999999999999999ull))) {
1964 // the result is a midpoint
1965 if (P256.w[2] & 0x01) {
1966 is_midpoint_gt_even = 1;
1967 // if floor(C*) is odd C = floor(C*) - 1; the result is not 0
1968 P256.w[2]--;
1969 if (P256.w[2] == 0xffffffffffffffffull)
1970 P256.w[3]--;
1971 } else {
1972 is_midpoint_lt_even = 1;
1973 }
1974 }
1975 // n = Cstar * 10^(e2+1)
1976 y_exp = y_exp + EXP_P1;
1977 // C* != 10^P because C* has P34 digits
1978 // check for overflow
1979 if (y_exp == EXP_MAX_P1
1980 && (rnd_mode == ROUNDING_TO_NEAREST
1981 || rnd_mode == ROUNDING_TIES_AWAY)) {
1982 // overflow for RN
1983 res.w[1] = x_sign | 0x7800000000000000ull; // +/-inf
1984 res.w[0] = 0x0ull;
1985 // set the inexact flag
1986 *pfpsf |= INEXACT_EXCEPTION;
1987 // set the overflow flag
1988 *pfpsf |= OVERFLOW_EXCEPTION;
1989 BID_SWAP128 (res);
1990 BID_RETURN (res);
1991 }
1992 // if (0 < f* - 1/2 < 10^(-x)) then
1993 // the result of the addition is exact
1994 // else
1995 // the result of the addition is inexact
1996 if (P256.w[1] > 0x8000000000000000ull || (P256.w[1] == 0x8000000000000000ull && P256.w[0] > 0x0ull)) { // the result may be exact
1997 tmp64 = P256.w[1] - 0x8000000000000000ull; // f* - 1/2
1998 if ((tmp64 > 0x1999999999999999ull
1999 || (tmp64 == 0x1999999999999999ull
2000 && P256.w[0] >= 0x9999999999999999ull))) {
2001 // set the inexact flag
2002 *pfpsf |= INEXACT_EXCEPTION;
2003 is_inexact = 1;
2004 } // else the result is exact
2005 } else { // the result is inexact
2006 // set the inexact flag
2007 *pfpsf |= INEXACT_EXCEPTION;
2008 is_inexact = 1;
2009 }
2010 C1_hi = P256.w[3];
2011 C1_lo = P256.w[2];
2012 if (!is_midpoint_gt_even && !is_midpoint_lt_even) {
2013 is_inexact_lt_midpoint = is_inexact
2014 && (P256.w[1] & 0x8000000000000000ull);
2015 is_inexact_gt_midpoint = is_inexact
2016 && !(P256.w[1] & 0x8000000000000000ull);
2017 }
2018 // general correction from RN to RA, RM, RP, RZ;
2019 // result uses y_exp
2020 if (rnd_mode != ROUNDING_TO_NEAREST) {
2021 if ((!x_sign
2022 &&
2023 ((rnd_mode == ROUNDING_UP
2024 && is_inexact_lt_midpoint)
2025 ||
2026 ((rnd_mode == ROUNDING_TIES_AWAY
2027 || rnd_mode == ROUNDING_UP)
2028 && is_midpoint_gt_even))) || (x_sign
2029 &&
2030 ((rnd_mode ==
2031 ROUNDING_DOWN
2032 &&
2033 is_inexact_lt_midpoint)
2034 ||
2035 ((rnd_mode ==
2036 ROUNDING_TIES_AWAY
2037 || rnd_mode ==
2038 ROUNDING_DOWN)
2039 &&
2040 is_midpoint_gt_even))))
2041 {
2042 // C1 = C1 + 1
2043 C1_lo = C1_lo + 1;
2044 if (C1_lo == 0) { // rounding overflow in the low 64 bits
2045 C1_hi = C1_hi + 1;
2046 }
2047 if (C1_hi == 0x0001ed09bead87c0ull
2048 && C1_lo == 0x378d8e6400000000ull) {
2049 // C1 = 10^34 => rounding overflow
2050 C1_hi = 0x0000314dc6448d93ull;
2051 C1_lo = 0x38c15b0a00000000ull; // 10^33
2052 y_exp = y_exp + EXP_P1;
2053 }
2054 } else
2055 if ((is_midpoint_lt_even || is_inexact_gt_midpoint)
2056 &&
2057 ((x_sign
2058 && (rnd_mode == ROUNDING_UP
2059 || rnd_mode == ROUNDING_TO_ZERO))
2060 || (!x_sign
2061 && (rnd_mode == ROUNDING_DOWN
2062 || rnd_mode == ROUNDING_TO_ZERO)))) {
2063 // C1 = C1 - 1
2064 C1_lo = C1_lo - 1;
2065 if (C1_lo == 0xffffffffffffffffull)
2066 C1_hi--;
2067 // check if we crossed into the lower decade
2068 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
2069 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
2070 C1_lo = 0x378d8e63ffffffffull;
2071 y_exp = y_exp - EXP_P1;
2072 // no underflow, because delta + q2 >= P34 + 1
2073 }
2074 } else {
2075 ; // exact, the result is already correct
2076 }
2077 // in all cases check for overflow (RN and RA solved already)
2078 if (y_exp == EXP_MAX_P1) { // overflow
2079 if ((rnd_mode == ROUNDING_DOWN && x_sign) || // RM and res < 0
2080 (rnd_mode == ROUNDING_UP && !x_sign)) { // RP and res > 0
2081 C1_hi = 0x7800000000000000ull; // +inf
2082 C1_lo = 0x0ull;
2083 } else { // RM and res > 0, RP and res < 0, or RZ
2084 C1_hi = 0x5fffed09bead87c0ull;
2085 C1_lo = 0x378d8e63ffffffffull;
2086 }
2087 y_exp = 0; // x_sign is preserved
2088 // set the inexact flag (in case the exact addition was exact)
2089 *pfpsf |= INEXACT_EXCEPTION;
2090 // set the overflow flag
2091 *pfpsf |= OVERFLOW_EXCEPTION;
2092 }
2093 }
2094 } // else if (C1 < 10^34) then C1 is the coeff.; the result is exact
2095 } else { // if x_sign != y_sign the result is exact
2096 C1_lo = C1_lo - C2_lo;
2097 C1_hi = C1_hi - C2_hi;
2098 if (C1_lo > C1.w[0])
2099 C1_hi--;
2100 // the result can be zero, but it cannot overflow
2101 if (C1_lo == 0 && C1_hi == 0) {
2102 // assemble the result
2103 if (x_exp < y_exp)
2104 res.w[1] = x_exp;
2105 else
2106 res.w[1] = y_exp;
2107 res.w[0] = 0;
2108 if (rnd_mode == ROUNDING_DOWN) {
2109 res.w[1] |= 0x8000000000000000ull;
2110 }
2111 BID_SWAP128 (res);
2112 BID_RETURN (res);
2113 }
2114 if (C1_hi >= 0x8000000000000000ull) { // negative coefficient!
2115 C1_lo = ~C1_lo;
2116 C1_lo++;
2117 C1_hi = ~C1_hi;
2118 if (C1_lo == 0x0)
2119 C1_hi++;
2120 x_sign = y_sign; // the result will have the sign of y
2121 }
2122 }
2123 // assemble the result
2124 res.w[1] = x_sign | y_exp | C1_hi;
2125 res.w[0] = C1_lo;
2126 } else { // if (delta >= P34 + 1 - q2)
2127 // instead of C' = (C1 * 10^(e1-e2) + C2)rnd,P34
2128 // calculate C' = C1 * 10^(e1-e2-x1) + (C2 * 10^(-x1))rnd,P34
2129 // where x1 = q1 + e1 - e2 - P34, 1 <= x1 <= P34 - 1
2130 // In most cases C' will have P34 digits, and n = C' * 10^(e2+x1)
2131 // If the result has P34+1 digits, redo the steps above with x1+1
2132 // If the result has P34-1 digits or less, redo the steps above with
2133 // x1-1 but only if initially x1 >= 1
2134 // NOTE: these two steps can be improved, e.g we could guess if
2135 // P34+1 or P34-1 digits will be obtained by adding/subtracting just
2136 // the top 64 bits of the two operands
2137 // The result cannot be zero, but it can overflow
2138 x1 = delta + q2 - P34; // 1 <= x1 <= P34-1
2139 roundC2:
2140 // Calculate C1 * 10^(e1-e2-x1) where 0 <= e1-e2-x1 <= P34 - 1
2141 // scale = (int)(e1 >> 49) - (int)(e2 >> 49) - x1; 0 <= scale <= P34-1
2142 scale = delta - q1 + q2 - x1; // scale = e1 - e2 - x1 = P34 - q1
2143 // either C1 or 10^(e1-e2-x1) may not fit is 64 bits,
2144 // but their product fits with certainty in 128 bits (actually in 113)
2145 if (scale >= 20) { //10^(e1-e2-x1) doesn't fit in 64 bits, but C1 does
2146 __mul_128x64_to_128 (C1, C1_lo, ten2k128[scale - 20]);
2147 } else if (scale >= 1) {
2148 // if 1 <= scale <= 19 then 10^(e1-e2-x1) fits in 64 bits
2149 if (q1 <= 19) { // C1 fits in 64 bits
2150 __mul_64x64_to_128MACH (C1, C1_lo, ten2k64[scale]);
2151 } else { // q1 >= 20
2152 C1.w[1] = C1_hi;
2153 C1.w[0] = C1_lo;
2154 __mul_128x64_to_128 (C1, ten2k64[scale], C1);
2155 }
2156 } else { // if (scale == 0) C1 is unchanged
2157 C1.w[1] = C1_hi;
2158 C1.w[0] = C1_lo;
2159 }
2160 tmp64 = C1.w[0]; // C1.w[1], C1.w[0] contains C1 * 10^(e1-e2-x1)
2161
2162 // now round C2 to q2-x1 decimal digits, where 1<=x1<=q2-1<=P34-1
2163 // (but if we got here a second time after x1 = x1 - 1, then
2164 // x1 >= 0; note that for x1 = 0 C2 is unchanged)
2165 // C2' = C2 + 1/2 * 10^x1 = C2 + 5 * 10^(x1-1)
2166 ind = x1 - 1; // 0 <= ind <= q2-2<=P34-2=32; but note that if x1 = 0
2167 // during a second pass, then ind = -1
2168 if (ind >= 0) { // if (x1 >= 1)
2169 C2.w[0] = C2_lo;
2170 C2.w[1] = C2_hi;
2171 if (ind <= 18) {
2172 C2.w[0] = C2.w[0] + midpoint64[ind];
2173 if (C2.w[0] < C2_lo)
2174 C2.w[1]++;
2175 } else { // 19 <= ind <= 32
2176 C2.w[0] = C2.w[0] + midpoint128[ind - 19].w[0];
2177 C2.w[1] = C2.w[1] + midpoint128[ind - 19].w[1];
2178 if (C2.w[0] < C2_lo)
2179 C2.w[1]++;
2180 }
2181 // the approximation of 10^(-x1) was rounded up to 118 bits
2182 __mul_128x128_to_256 (R256, C2, ten2mk128[ind]); // R256 = C2*, f2*
2183 // calculate C2* and f2*
2184 // C2* is actually floor(C2*) in this case
2185 // C2* and f2* need shifting and masking, as shown by
2186 // shiftright128[] and maskhigh128[]
2187 // the top Ex bits of 10^(-x1) are T* = ten2mk128trunc[ind], e.g.
2188 // if x1=1, T*=ten2mk128trunc[0]=0x19999999999999999999999999999999
2189 // if (0 < f2* < 10^(-x1)) then
2190 // if floor(C1+C2*) is even then C2* = floor(C2*) - logical right
2191 // shift; C2* has p decimal digits, correct by Prop. 1)
2192 // else if floor(C1+C2*) is odd C2* = floor(C2*)-1 (logical right
2193 // shift; C2* has p decimal digits, correct by Pr. 1)
2194 // else
2195 // C2* = floor(C2*) (logical right shift; C has p decimal digits,
2196 // correct by Property 1)
2197 // n = C2* * 10^(e2+x1)
2198
2199 if (ind <= 2) {
2200 highf2star.w[1] = 0x0;
2201 highf2star.w[0] = 0x0; // low f2* ok
2202 } else if (ind <= 21) {
2203 highf2star.w[1] = 0x0;
2204 highf2star.w[0] = R256.w[2] & maskhigh128[ind]; // low f2* ok
2205 } else {
2206 highf2star.w[1] = R256.w[3] & maskhigh128[ind];
2207 highf2star.w[0] = R256.w[2]; // low f2* is ok
2208 }
2209 // shift right C2* by Ex-128 = shiftright128[ind]
2210 if (ind >= 3) {
2211 shift = shiftright128[ind];
2212 if (shift < 64) { // 3 <= shift <= 63
2213 R256.w[2] =
2214 (R256.w[2] >> shift) | (R256.w[3] << (64 - shift));
2215 R256.w[3] = (R256.w[3] >> shift);
2216 } else { // 66 <= shift <= 102
2217 R256.w[2] = (R256.w[3] >> (shift - 64));
2218 R256.w[3] = 0x0ULL;
2219 }
2220 }
2221 if (second_pass) {
2222 is_inexact_lt_midpoint = 0;
2223 is_inexact_gt_midpoint = 0;
2224 is_midpoint_lt_even = 0;
2225 is_midpoint_gt_even = 0;
2226 }
2227 // determine inexactness of the rounding of C2* (this may be
2228 // followed by a second rounding only if we get P34+1
2229 // decimal digits)
2230 // if (0 < f2* - 1/2 < 10^(-x1)) then
2231 // the result is exact
2232 // else (if f2* - 1/2 > T* then)
2233 // the result of is inexact
2234 if (ind <= 2) {
2235 if (R256.w[1] > 0x8000000000000000ull ||
2236 (R256.w[1] == 0x8000000000000000ull
2237 && R256.w[0] > 0x0ull)) {
2238 // f2* > 1/2 and the result may be exact
2239 tmp64A = R256.w[1] - 0x8000000000000000ull; // f* - 1/2
2240 if ((tmp64A > ten2mk128trunc[ind].w[1]
2241 || (tmp64A == ten2mk128trunc[ind].w[1]
2242 && R256.w[0] >= ten2mk128trunc[ind].w[0]))) {
2243 // set the inexact flag
2244 // *pfpsf |= INEXACT_EXCEPTION;
2245 tmp_inexact = 1; // may be set again during a second pass
2246 // this rounding is applied to C2 only!
2247 if (x_sign == y_sign)
2248 is_inexact_lt_midpoint = 1;
2249 else // if (x_sign != y_sign)
2250 is_inexact_gt_midpoint = 1;
2251 } // else the result is exact
2252 // rounding down, unless a midpoint in [ODD, EVEN]
2253 } else { // the result is inexact; f2* <= 1/2
2254 // set the inexact flag
2255 // *pfpsf |= INEXACT_EXCEPTION;
2256 tmp_inexact = 1; // just in case we will round a second time
2257 // rounding up, unless a midpoint in [EVEN, ODD]
2258 // this rounding is applied to C2 only!
2259 if (x_sign == y_sign)
2260 is_inexact_gt_midpoint = 1;
2261 else // if (x_sign != y_sign)
2262 is_inexact_lt_midpoint = 1;
2263 }
2264 } else if (ind <= 21) { // if 3 <= ind <= 21
2265 if (highf2star.w[1] > 0x0 || (highf2star.w[1] == 0x0
2266 && highf2star.w[0] >
2267 onehalf128[ind])
2268 || (highf2star.w[1] == 0x0
2269 && highf2star.w[0] == onehalf128[ind]
2270 && (R256.w[1] || R256.w[0]))) {
2271 // f2* > 1/2 and the result may be exact
2272 // Calculate f2* - 1/2
2273 tmp64A = highf2star.w[0] - onehalf128[ind];
2274 tmp64B = highf2star.w[1];
2275 if (tmp64A > highf2star.w[0])
2276 tmp64B--;
2277 if (tmp64B || tmp64A
2278 || R256.w[1] > ten2mk128trunc[ind].w[1]
2279 || (R256.w[1] == ten2mk128trunc[ind].w[1]
2280 && R256.w[0] > ten2mk128trunc[ind].w[0])) {
2281 // set the inexact flag
2282 // *pfpsf |= INEXACT_EXCEPTION;
2283 tmp_inexact = 1; // may be set again during a second pass
2284 // this rounding is applied to C2 only!
2285 if (x_sign == y_sign)
2286 is_inexact_lt_midpoint = 1;
2287 else // if (x_sign != y_sign)
2288 is_inexact_gt_midpoint = 1;
2289 } // else the result is exact
2290 } else { // the result is inexact; f2* <= 1/2
2291 // set the inexact flag
2292 // *pfpsf |= INEXACT_EXCEPTION;
2293 tmp_inexact = 1; // may be set again during a second pass
2294 // rounding up, unless a midpoint in [EVEN, ODD]
2295 // this rounding is applied to C2 only!
2296 if (x_sign == y_sign)
2297 is_inexact_gt_midpoint = 1;
2298 else // if (x_sign != y_sign)
2299 is_inexact_lt_midpoint = 1;
2300 }
2301 } else { // if 22 <= ind <= 33
2302 if (highf2star.w[1] > onehalf128[ind]
2303 || (highf2star.w[1] == onehalf128[ind]
2304 && (highf2star.w[0] || R256.w[1]
2305 || R256.w[0]))) {
2306 // f2* > 1/2 and the result may be exact
2307 // Calculate f2* - 1/2
2308 // tmp64A = highf2star.w[0];
2309 tmp64B = highf2star.w[1] - onehalf128[ind];
2310 if (tmp64B || highf2star.w[0]
2311 || R256.w[1] > ten2mk128trunc[ind].w[1]
2312 || (R256.w[1] == ten2mk128trunc[ind].w[1]
2313 && R256.w[0] > ten2mk128trunc[ind].w[0])) {
2314 // set the inexact flag
2315 // *pfpsf |= INEXACT_EXCEPTION;
2316 tmp_inexact = 1; // may be set again during a second pass
2317 // this rounding is applied to C2 only!
2318 if (x_sign == y_sign)
2319 is_inexact_lt_midpoint = 1;
2320 else // if (x_sign != y_sign)
2321 is_inexact_gt_midpoint = 1;
2322 } // else the result is exact
2323 } else { // the result is inexact; f2* <= 1/2
2324 // set the inexact flag
2325 // *pfpsf |= INEXACT_EXCEPTION;
2326 tmp_inexact = 1; // may be set again during a second pass
2327 // rounding up, unless a midpoint in [EVEN, ODD]
2328 // this rounding is applied to C2 only!
2329 if (x_sign == y_sign)
2330 is_inexact_gt_midpoint = 1;
2331 else // if (x_sign != y_sign)
2332 is_inexact_lt_midpoint = 1;
2333 }
2334 }
2335 // check for midpoints
2336 if ((R256.w[1] || R256.w[0]) && (highf2star.w[1] == 0)
2337 && (highf2star.w[0] == 0)
2338 && (R256.w[1] < ten2mk128trunc[ind].w[1]
2339 || (R256.w[1] == ten2mk128trunc[ind].w[1]
2340 && R256.w[0] <= ten2mk128trunc[ind].w[0]))) {
2341 // the result is a midpoint
2342 if ((tmp64 + R256.w[2]) & 0x01) { // MP in [EVEN, ODD]
2343 // if floor(C2*) is odd C = floor(C2*) - 1; the result may be 0
2344 R256.w[2]--;
2345 if (R256.w[2] == 0xffffffffffffffffull)
2346 R256.w[3]--;
2347 // this rounding is applied to C2 only!
2348 if (x_sign == y_sign)
2349 is_midpoint_gt_even = 1;
2350 else // if (x_sign != y_sign)
2351 is_midpoint_lt_even = 1;
2352 is_inexact_lt_midpoint = 0;
2353 is_inexact_gt_midpoint = 0;
2354 } else {
2355 // else MP in [ODD, EVEN]
2356 // this rounding is applied to C2 only!
2357 if (x_sign == y_sign)
2358 is_midpoint_lt_even = 1;
2359 else // if (x_sign != y_sign)
2360 is_midpoint_gt_even = 1;
2361 is_inexact_lt_midpoint = 0;
2362 is_inexact_gt_midpoint = 0;
2363 }
2364 }
2365 // end if (ind >= 0)
2366 } else { // if (ind == -1); only during a 2nd pass, and when x1 = 0
2367 R256.w[2] = C2_lo;
2368 R256.w[3] = C2_hi;
2369 tmp_inexact = 0;
2370 // to correct a possible setting to 1 from 1st pass
2371 if (second_pass) {
2372 is_midpoint_lt_even = 0;
2373 is_midpoint_gt_even = 0;
2374 is_inexact_lt_midpoint = 0;
2375 is_inexact_gt_midpoint = 0;
2376 }
2377 }
2378 // and now add/subtract C1 * 10^(e1-e2-x1) +/- (C2 * 10^(-x1))rnd,P34
2379 if (x_sign == y_sign) { // addition; could overflow
2380 // no second pass is possible this way (only for x_sign != y_sign)
2381 C1.w[0] = C1.w[0] + R256.w[2];
2382 C1.w[1] = C1.w[1] + R256.w[3];
2383 if (C1.w[0] < tmp64)
2384 C1.w[1]++; // carry
2385 // if the sum has P34+1 digits, i.e. C1>=10^34 redo the calculation
2386 // with x1=x1+1
2387 if (C1.w[1] > 0x0001ed09bead87c0ull || (C1.w[1] == 0x0001ed09bead87c0ull && C1.w[0] >= 0x378d8e6400000000ull)) { // C1 >= 10^34
2388 // chop off one more digit from the sum, but make sure there is
2389 // no double-rounding error (see table - double rounding logic)
2390 // now round C1 from P34+1 to P34 decimal digits
2391 // C1' = C1 + 1/2 * 10 = C1 + 5
2392 if (C1.w[0] >= 0xfffffffffffffffbull) { // low half add has carry
2393 C1.w[0] = C1.w[0] + 5;
2394 C1.w[1] = C1.w[1] + 1;
2395 } else {
2396 C1.w[0] = C1.w[0] + 5;
2397 }
2398 // the approximation of 10^(-1) was rounded up to 118 bits
2399 __mul_128x128_to_256 (Q256, C1, ten2mk128[0]); // Q256 = C1*, f1*
2400 // C1* is actually floor(C1*) in this case
2401 // the top 128 bits of 10^(-1) are
2402 // T* = ten2mk128trunc[0]=0x19999999999999999999999999999999
2403 // if (0 < f1* < 10^(-1)) then
2404 // if floor(C1*) is even then C1* = floor(C1*) - logical right
2405 // shift; C1* has p decimal digits, correct by Prop. 1)
2406 // else if floor(C1*) is odd C1* = floor(C1*) - 1 (logical right
2407 // shift; C1* has p decimal digits, correct by Pr. 1)
2408 // else
2409 // C1* = floor(C1*) (logical right shift; C has p decimal digits
2410 // correct by Property 1)
2411 // n = C1* * 10^(e2+x1+1)
2412 if ((Q256.w[1] || Q256.w[0])
2413 && (Q256.w[1] < ten2mk128trunc[0].w[1]
2414 || (Q256.w[1] == ten2mk128trunc[0].w[1]
2415 && Q256.w[0] <= ten2mk128trunc[0].w[0]))) {
2416 // the result is a midpoint
2417 if (is_inexact_lt_midpoint) { // for the 1st rounding
2418 is_inexact_gt_midpoint = 1;
2419 is_inexact_lt_midpoint = 0;
2420 is_midpoint_gt_even = 0;
2421 is_midpoint_lt_even = 0;
2422 } else if (is_inexact_gt_midpoint) { // for the 1st rounding
2423 Q256.w[2]--;
2424 if (Q256.w[2] == 0xffffffffffffffffull)
2425 Q256.w[3]--;
2426 is_inexact_gt_midpoint = 0;
2427 is_inexact_lt_midpoint = 1;
2428 is_midpoint_gt_even = 0;
2429 is_midpoint_lt_even = 0;
2430 } else if (is_midpoint_gt_even) { // for the 1st rounding
2431 // Note: cannot have is_midpoint_lt_even
2432 is_inexact_gt_midpoint = 0;
2433 is_inexact_lt_midpoint = 1;
2434 is_midpoint_gt_even = 0;
2435 is_midpoint_lt_even = 0;
2436 } else { // the first rounding must have been exact
2437 if (Q256.w[2] & 0x01) { // MP in [EVEN, ODD]
2438 // the truncated result is correct
2439 Q256.w[2]--;
2440 if (Q256.w[2] == 0xffffffffffffffffull)
2441 Q256.w[3]--;
2442 is_inexact_gt_midpoint = 0;
2443 is_inexact_lt_midpoint = 0;
2444 is_midpoint_gt_even = 1;
2445 is_midpoint_lt_even = 0;
2446 } else { // MP in [ODD, EVEN]
2447 is_inexact_gt_midpoint = 0;
2448 is_inexact_lt_midpoint = 0;
2449 is_midpoint_gt_even = 0;
2450 is_midpoint_lt_even = 1;
2451 }
2452 }
2453 tmp_inexact = 1; // in all cases
2454 } else { // the result is not a midpoint
2455 // determine inexactness of the rounding of C1 (the sum C1+C2*)
2456 // if (0 < f1* - 1/2 < 10^(-1)) then
2457 // the result is exact
2458 // else (if f1* - 1/2 > T* then)
2459 // the result of is inexact
2460 // ind = 0
2461 if (Q256.w[1] > 0x8000000000000000ull
2462 || (Q256.w[1] == 0x8000000000000000ull
2463 && Q256.w[0] > 0x0ull)) {
2464 // f1* > 1/2 and the result may be exact
2465 Q256.w[1] = Q256.w[1] - 0x8000000000000000ull; // f1* - 1/2
2466 if ((Q256.w[1] > ten2mk128trunc[0].w[1]
2467 || (Q256.w[1] == ten2mk128trunc[0].w[1]
2468 && Q256.w[0] > ten2mk128trunc[0].w[0]))) {
2469 is_inexact_gt_midpoint = 0;
2470 is_inexact_lt_midpoint = 1;
2471 is_midpoint_gt_even = 0;
2472 is_midpoint_lt_even = 0;
2473 // set the inexact flag
2474 tmp_inexact = 1;
2475 // *pfpsf |= INEXACT_EXCEPTION;
2476 } else { // else the result is exact for the 2nd rounding
2477 if (tmp_inexact) { // if the previous rounding was inexact
2478 if (is_midpoint_lt_even) {
2479 is_inexact_gt_midpoint = 1;
2480 is_midpoint_lt_even = 0;
2481 } else if (is_midpoint_gt_even) {
2482 is_inexact_lt_midpoint = 1;
2483 is_midpoint_gt_even = 0;
2484 } else {
2485 ; // no change
2486 }
2487 }
2488 }
2489 // rounding down, unless a midpoint in [ODD, EVEN]
2490 } else { // the result is inexact; f1* <= 1/2
2491 is_inexact_gt_midpoint = 1;
2492 is_inexact_lt_midpoint = 0;
2493 is_midpoint_gt_even = 0;
2494 is_midpoint_lt_even = 0;
2495 // set the inexact flag
2496 tmp_inexact = 1;
2497 // *pfpsf |= INEXACT_EXCEPTION;
2498 }
2499 } // end 'the result is not a midpoint'
2500 // n = C1 * 10^(e2+x1)
2501 C1.w[1] = Q256.w[3];
2502 C1.w[0] = Q256.w[2];
2503 y_exp = y_exp + ((UINT64) (x1 + 1) << 49);
2504 } else { // C1 < 10^34
2505 // C1.w[1] and C1.w[0] already set
2506 // n = C1 * 10^(e2+x1)
2507 y_exp = y_exp + ((UINT64) x1 << 49);
2508 }
2509 // check for overflow
2510 if (y_exp == EXP_MAX_P1
2511 && (rnd_mode == ROUNDING_TO_NEAREST
2512 || rnd_mode == ROUNDING_TIES_AWAY)) {
2513 res.w[1] = 0x7800000000000000ull | x_sign; // +/-inf
2514 res.w[0] = 0x0ull;
2515 // set the inexact flag
2516 *pfpsf |= INEXACT_EXCEPTION;
2517 // set the overflow flag
2518 *pfpsf |= OVERFLOW_EXCEPTION;
2519 BID_SWAP128 (res);
2520 BID_RETURN (res);
2521 } // else no overflow
2522 } else { // if x_sign != y_sign the result of this subtract. is exact
2523 C1.w[0] = C1.w[0] - R256.w[2];
2524 C1.w[1] = C1.w[1] - R256.w[3];
2525 if (C1.w[0] > tmp64)
2526 C1.w[1]--; // borrow
2527 if (C1.w[1] >= 0x8000000000000000ull) { // negative coefficient!
2528 C1.w[0] = ~C1.w[0];
2529 C1.w[0]++;
2530 C1.w[1] = ~C1.w[1];
2531 if (C1.w[0] == 0x0)
2532 C1.w[1]++;
2533 tmp_sign = y_sign;
2534 // the result will have the sign of y if last rnd
2535 } else {
2536 tmp_sign = x_sign;
2537 }
2538 // if the difference has P34-1 digits or less, i.e. C1 < 10^33 then
2539 // redo the calculation with x1=x1-1;
2540 // redo the calculation also if C1 = 10^33 and
2541 // (is_inexact_gt_midpoint or is_midpoint_lt_even);
2542 // (the last part should have really been
2543 // (is_inexact_lt_midpoint or is_midpoint_gt_even) from
2544 // the rounding of C2, but the position flags have been reversed)
2545 // 10^33 = 0x0000314dc6448d93 0x38c15b0a00000000
2546 if ((C1.w[1] < 0x0000314dc6448d93ull || (C1.w[1] == 0x0000314dc6448d93ull && C1.w[0] < 0x38c15b0a00000000ull)) || (C1.w[1] == 0x0000314dc6448d93ull && C1.w[0] == 0x38c15b0a00000000ull && (is_inexact_gt_midpoint || is_midpoint_lt_even))) { // C1=10^33
2547 x1 = x1 - 1; // x1 >= 0
2548 if (x1 >= 0) {
2549 // clear position flags and tmp_inexact
2550 is_midpoint_lt_even = 0;
2551 is_midpoint_gt_even = 0;
2552 is_inexact_lt_midpoint = 0;
2553 is_inexact_gt_midpoint = 0;
2554 tmp_inexact = 0;
2555 second_pass = 1;
2556 goto roundC2; // else result has less than P34 digits
2557 }
2558 }
2559 // if the coefficient of the result is 10^34 it means that this
2560 // must be the second pass, and we are done
2561 if (C1.w[1] == 0x0001ed09bead87c0ull && C1.w[0] == 0x378d8e6400000000ull) { // if C1 = 10^34
2562 C1.w[1] = 0x0000314dc6448d93ull; // C1 = 10^33
2563 C1.w[0] = 0x38c15b0a00000000ull;
2564 y_exp = y_exp + ((UINT64) 1 << 49);
2565 }
2566 x_sign = tmp_sign;
2567 if (x1 >= 1)
2568 y_exp = y_exp + ((UINT64) x1 << 49);
2569 // x1 = -1 is possible at the end of a second pass when the
2570 // first pass started with x1 = 1
2571 }
2572 C1_hi = C1.w[1];
2573 C1_lo = C1.w[0];
2574 // general correction from RN to RA, RM, RP, RZ; result uses y_exp
2575 if (rnd_mode != ROUNDING_TO_NEAREST) {
2576 if ((!x_sign
2577 && ((rnd_mode == ROUNDING_UP && is_inexact_lt_midpoint)
2578 ||
2579 ((rnd_mode == ROUNDING_TIES_AWAY
2580 || rnd_mode == ROUNDING_UP)
2581 && is_midpoint_gt_even))) || (x_sign
2582 &&
2583 ((rnd_mode ==
2584 ROUNDING_DOWN
2585 &&
2586 is_inexact_lt_midpoint)
2587 ||
2588 ((rnd_mode ==
2589 ROUNDING_TIES_AWAY
2590 || rnd_mode ==
2591 ROUNDING_DOWN)
2592 &&
2593 is_midpoint_gt_even))))
2594 {
2595 // C1 = C1 + 1
2596 C1_lo = C1_lo + 1;
2597 if (C1_lo == 0) { // rounding overflow in the low 64 bits
2598 C1_hi = C1_hi + 1;
2599 }
2600 if (C1_hi == 0x0001ed09bead87c0ull
2601 && C1_lo == 0x378d8e6400000000ull) {
2602 // C1 = 10^34 => rounding overflow
2603 C1_hi = 0x0000314dc6448d93ull;
2604 C1_lo = 0x38c15b0a00000000ull; // 10^33
2605 y_exp = y_exp + EXP_P1;
2606 }
2607 } else if ((is_midpoint_lt_even || is_inexact_gt_midpoint)
2608 &&
2609 ((x_sign
2610 && (rnd_mode == ROUNDING_UP
2611 || rnd_mode == ROUNDING_TO_ZERO))
2612 || (!x_sign
2613 && (rnd_mode == ROUNDING_DOWN
2614 || rnd_mode == ROUNDING_TO_ZERO)))) {
2615 // C1 = C1 - 1
2616 C1_lo = C1_lo - 1;
2617 if (C1_lo == 0xffffffffffffffffull)
2618 C1_hi--;
2619 // check if we crossed into the lower decade
2620 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
2621 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
2622 C1_lo = 0x378d8e63ffffffffull;
2623 y_exp = y_exp - EXP_P1;
2624 // no underflow, because delta + q2 >= P34 + 1
2625 }
2626 } else {
2627 ; // exact, the result is already correct
2628 }
2629 // in all cases check for overflow (RN and RA solved already)
2630 if (y_exp == EXP_MAX_P1) { // overflow
2631 if ((rnd_mode == ROUNDING_DOWN && x_sign) || // RM and res < 0
2632 (rnd_mode == ROUNDING_UP && !x_sign)) { // RP and res > 0
2633 C1_hi = 0x7800000000000000ull; // +inf
2634 C1_lo = 0x0ull;
2635 } else { // RM and res > 0, RP and res < 0, or RZ
2636 C1_hi = 0x5fffed09bead87c0ull;
2637 C1_lo = 0x378d8e63ffffffffull;
2638 }
2639 y_exp = 0; // x_sign is preserved
2640 // set the inexact flag (in case the exact addition was exact)
2641 *pfpsf |= INEXACT_EXCEPTION;
2642 // set the overflow flag
2643 *pfpsf |= OVERFLOW_EXCEPTION;
2644 }
2645 }
2646 // assemble the result
2647 res.w[1] = x_sign | y_exp | C1_hi;
2648 res.w[0] = C1_lo;
2649 if (tmp_inexact)
2650 *pfpsf |= INEXACT_EXCEPTION;
2651 }
2652 } else { // if (-P34 + 1 <= delta <= -1) <=> 1 <= -delta <= P34 - 1
2653 // NOTE: the following, up to "} else { // if x_sign != y_sign
2654 // the result is exact" is identical to "else if (delta == P34 - q2) {"
2655 // from above; also, the code is not symmetric: a+b and b+a may take
2656 // different paths (need to unify eventually!)
2657 // calculate C' = C2 + C1 * 10^(e1-e2) directly; the result may be
2658 // inexact if it requires P34 + 1 decimal digits; in either case the
2659 // 'cutoff' point for addition is at the position of the lsb of C2
2660 // The coefficient of the result is C1 * 10^(e1-e2) + C2 and the
2661 // exponent is e2; either C1 or 10^(e1-e2) may not fit is 64 bits,
2662 // but their product fits with certainty in 128 bits (actually in 113)
2663 // Note that 0 <= e1 - e2 <= P34 - 2
2664 // -P34 + 1 <= delta <= -1 <=> -P34 + 1 <= delta <= -1 <=>
2665 // -P34 + 1 <= q1 + e1 - q2 - e2 <= -1 <=>
2666 // q2 - q1 - P34 + 1 <= e1 - e2 <= q2 - q1 - 1 <=>
2667 // 1 - P34 - P34 + 1 <= e1-e2 <= P34 - 1 - 1 => 0 <= e1-e2 <= P34 - 2
2668 scale = delta - q1 + q2; // scale = (int)(e1 >> 49) - (int)(e2 >> 49)
2669 if (scale >= 20) { // 10^(e1-e2) does not fit in 64 bits, but C1 does
2670 __mul_128x64_to_128 (C1, C1_lo, ten2k128[scale - 20]);
2671 } else if (scale >= 1) {
2672 // if 1 <= scale <= 19 then 10^(e1-e2) fits in 64 bits
2673 if (q1 <= 19) { // C1 fits in 64 bits
2674 __mul_64x64_to_128MACH (C1, C1_lo, ten2k64[scale]);
2675 } else { // q1 >= 20
2676 C1.w[1] = C1_hi;
2677 C1.w[0] = C1_lo;
2678 __mul_128x64_to_128 (C1, ten2k64[scale], C1);
2679 }
2680 } else { // if (scale == 0) C1 is unchanged
2681 C1.w[1] = C1_hi;
2682 C1.w[0] = C1_lo; // only the low part is necessary
2683 }
2684 C1_hi = C1.w[1];
2685 C1_lo = C1.w[0];
2686 // now add C2
2687 if (x_sign == y_sign) {
2688 // the result can overflow!
2689 C1_lo = C1_lo + C2_lo;
2690 C1_hi = C1_hi + C2_hi;
2691 if (C1_lo < C1.w[0])
2692 C1_hi++;
2693 // test for overflow, possible only when C1 >= 10^34
2694 if (C1_hi > 0x0001ed09bead87c0ull || (C1_hi == 0x0001ed09bead87c0ull && C1_lo >= 0x378d8e6400000000ull)) { // C1 >= 10^34
2695 // in this case q = P34 + 1 and x = q - P34 = 1, so multiply
2696 // C'' = C'+ 5 = C1 + 5 by k1 ~ 10^(-1) calculated for P34 + 1
2697 // decimal digits
2698 // Calculate C'' = C' + 1/2 * 10^x
2699 if (C1_lo >= 0xfffffffffffffffbull) { // low half add has carry
2700 C1_lo = C1_lo + 5;
2701 C1_hi = C1_hi + 1;
2702 } else {
2703 C1_lo = C1_lo + 5;
2704 }
2705 // the approximation of 10^(-1) was rounded up to 118 bits
2706 // 10^(-1) =~ 33333333333333333333333333333400 * 2^-129
2707 // 10^(-1) =~ 19999999999999999999999999999a00 * 2^-128
2708 C1.w[1] = C1_hi;
2709 C1.w[0] = C1_lo; // C''
2710 ten2m1.w[1] = 0x1999999999999999ull;
2711 ten2m1.w[0] = 0x9999999999999a00ull;
2712 __mul_128x128_to_256 (P256, C1, ten2m1); // P256 = C*, f*
2713 // C* is actually floor(C*) in this case
2714 // the top Ex = 128 bits of 10^(-1) are
2715 // T* = 0x00199999999999999999999999999999
2716 // if (0 < f* < 10^(-x)) then
2717 // if floor(C*) is even then C = floor(C*) - logical right
2718 // shift; C has p decimal digits, correct by Prop. 1)
2719 // else if floor(C*) is odd C = floor(C*) - 1 (logical right
2720 // shift; C has p decimal digits, correct by Pr. 1)
2721 // else
2722 // C = floor(C*) (logical right shift; C has p decimal digits,
2723 // correct by Property 1)
2724 // n = C * 10^(e2+x)
2725 if ((P256.w[1] || P256.w[0])
2726 && (P256.w[1] < 0x1999999999999999ull
2727 || (P256.w[1] == 0x1999999999999999ull
2728 && P256.w[0] <= 0x9999999999999999ull))) {
2729 // the result is a midpoint
2730 if (P256.w[2] & 0x01) {
2731 is_midpoint_gt_even = 1;
2732 // if floor(C*) is odd C = floor(C*) - 1; the result is not 0
2733 P256.w[2]--;
2734 if (P256.w[2] == 0xffffffffffffffffull)
2735 P256.w[3]--;
2736 } else {
2737 is_midpoint_lt_even = 1;
2738 }
2739 }
2740 // n = Cstar * 10^(e2+1)
2741 y_exp = y_exp + EXP_P1;
2742 // C* != 10^P34 because C* has P34 digits
2743 // check for overflow
2744 if (y_exp == EXP_MAX_P1
2745 && (rnd_mode == ROUNDING_TO_NEAREST
2746 || rnd_mode == ROUNDING_TIES_AWAY)) {
2747 // overflow for RN
2748 res.w[1] = x_sign | 0x7800000000000000ull; // +/-inf
2749 res.w[0] = 0x0ull;
2750 // set the inexact flag
2751 *pfpsf |= INEXACT_EXCEPTION;
2752 // set the overflow flag
2753 *pfpsf |= OVERFLOW_EXCEPTION;
2754 BID_SWAP128 (res);
2755 BID_RETURN (res);
2756 }
2757 // if (0 < f* - 1/2 < 10^(-x)) then
2758 // the result of the addition is exact
2759 // else
2760 // the result of the addition is inexact
2761 if (P256.w[1] > 0x8000000000000000ull || (P256.w[1] == 0x8000000000000000ull && P256.w[0] > 0x0ull)) { // the result may be exact
2762 tmp64 = P256.w[1] - 0x8000000000000000ull; // f* - 1/2
2763 if ((tmp64 > 0x1999999999999999ull
2764 || (tmp64 == 0x1999999999999999ull
2765 && P256.w[0] >= 0x9999999999999999ull))) {
2766 // set the inexact flag
2767 *pfpsf |= INEXACT_EXCEPTION;
2768 is_inexact = 1;
2769 } // else the result is exact
2770 } else { // the result is inexact
2771 // set the inexact flag
2772 *pfpsf |= INEXACT_EXCEPTION;
2773 is_inexact = 1;
2774 }
2775 C1_hi = P256.w[3];
2776 C1_lo = P256.w[2];
2777 if (!is_midpoint_gt_even && !is_midpoint_lt_even) {
2778 is_inexact_lt_midpoint = is_inexact
2779 && (P256.w[1] & 0x8000000000000000ull);
2780 is_inexact_gt_midpoint = is_inexact
2781 && !(P256.w[1] & 0x8000000000000000ull);
2782 }
2783 // general correction from RN to RA, RM, RP, RZ; result uses y_exp
2784 if (rnd_mode != ROUNDING_TO_NEAREST) {
2785 if ((!x_sign
2786 && ((rnd_mode == ROUNDING_UP
2787 && is_inexact_lt_midpoint)
2788 || ((rnd_mode == ROUNDING_TIES_AWAY
2789 || rnd_mode == ROUNDING_UP)
2790 && is_midpoint_gt_even))) || (x_sign
2791 &&
2792 ((rnd_mode ==
2793 ROUNDING_DOWN
2794 &&
2795 is_inexact_lt_midpoint)
2796 ||
2797 ((rnd_mode ==
2798 ROUNDING_TIES_AWAY
2799 || rnd_mode
2800 ==
2801 ROUNDING_DOWN)
2802 &&
2803 is_midpoint_gt_even))))
2804 {
2805 // C1 = C1 + 1
2806 C1_lo = C1_lo + 1;
2807 if (C1_lo == 0) { // rounding overflow in the low 64 bits
2808 C1_hi = C1_hi + 1;
2809 }
2810 if (C1_hi == 0x0001ed09bead87c0ull
2811 && C1_lo == 0x378d8e6400000000ull) {
2812 // C1 = 10^34 => rounding overflow
2813 C1_hi = 0x0000314dc6448d93ull;
2814 C1_lo = 0x38c15b0a00000000ull; // 10^33
2815 y_exp = y_exp + EXP_P1;
2816 }
2817 } else
2818 if ((is_midpoint_lt_even || is_inexact_gt_midpoint) &&
2819 ((x_sign && (rnd_mode == ROUNDING_UP ||
2820 rnd_mode == ROUNDING_TO_ZERO)) ||
2821 (!x_sign && (rnd_mode == ROUNDING_DOWN ||
2822 rnd_mode == ROUNDING_TO_ZERO)))) {
2823 // C1 = C1 - 1
2824 C1_lo = C1_lo - 1;
2825 if (C1_lo == 0xffffffffffffffffull)
2826 C1_hi--;
2827 // check if we crossed into the lower decade
2828 if (C1_hi == 0x0000314dc6448d93ull && C1_lo == 0x38c15b09ffffffffull) { // 10^33 - 1
2829 C1_hi = 0x0001ed09bead87c0ull; // 10^34 - 1
2830 C1_lo = 0x378d8e63ffffffffull;
2831 y_exp = y_exp - EXP_P1;
2832 // no underflow, because delta + q2 >= P34 + 1
2833 }
2834 } else {
2835 ; // exact, the result is already correct
2836 }
2837 // in all cases check for overflow (RN and RA solved already)
2838 if (y_exp == EXP_MAX_P1) { // overflow
2839 if ((rnd_mode == ROUNDING_DOWN && x_sign) || // RM and res < 0
2840 (rnd_mode == ROUNDING_UP && !x_sign)) { // RP and res > 0
2841 C1_hi = 0x7800000000000000ull; // +inf
2842 C1_lo = 0x0ull;
2843 } else { // RM and res > 0, RP and res < 0, or RZ
2844 C1_hi = 0x5fffed09bead87c0ull;
2845 C1_lo = 0x378d8e63ffffffffull;
2846 }
2847 y_exp = 0; // x_sign is preserved
2848 // set the inexact flag (in case the exact addition was exact)
2849 *pfpsf |= INEXACT_EXCEPTION;
2850 // set the overflow flag
2851 *pfpsf |= OVERFLOW_EXCEPTION;
2852 }
2853 }
2854 } // else if (C1 < 10^34) then C1 is the coeff.; the result is exact
2855 // assemble the result
2856 res.w[1] = x_sign | y_exp | C1_hi;
2857 res.w[0] = C1_lo;
2858 } else { // if x_sign != y_sign the result is exact
2859 C1_lo = C2_lo - C1_lo;
2860 C1_hi = C2_hi - C1_hi;
2861 if (C1_lo > C2_lo)
2862 C1_hi--;
2863 if (C1_hi >= 0x8000000000000000ull) { // negative coefficient!
2864 C1_lo = ~C1_lo;
2865 C1_lo++;
2866 C1_hi = ~C1_hi;
2867 if (C1_lo == 0x0)
2868 C1_hi++;
2869 x_sign = y_sign; // the result will have the sign of y
2870 }
2871 // the result can be zero, but it cannot overflow
2872 if (C1_lo == 0 && C1_hi == 0) {
2873 // assemble the result
2874 if (x_exp < y_exp)
2875 res.w[1] = x_exp;
2876 else
2877 res.w[1] = y_exp;
2878 res.w[0] = 0;
2879 if (rnd_mode == ROUNDING_DOWN) {
2880 res.w[1] |= 0x8000000000000000ull;
2881 }
2882 BID_SWAP128 (res);
2883 BID_RETURN (res);
2884 }
2885 // assemble the result
2886 res.w[1] = y_sign | y_exp | C1_hi;
2887 res.w[0] = C1_lo;
2888 }
2889 }
2890 }
2891 BID_SWAP128 (res);
2892 BID_RETURN (res)
2893 }
2894 }
2895
2896
2897
2898 // bid128_sub stands for bid128qq_sub
2899
2900 /*****************************************************************************
2901 * BID128 sub
2902 ****************************************************************************/
2903
2904 #if DECIMAL_CALL_BY_REFERENCE
2905 void
2906 bid128_sub (UINT128 * pres, UINT128 * px, UINT128 * py
2907 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2908 _EXC_INFO_PARAM) {
2909 UINT128 x = *px, y = *py;
2910 #if !DECIMAL_GLOBAL_ROUNDING
2911 unsigned int rnd_mode = *prnd_mode;
2912 #endif
2913 #else
2914 UINT128
2915 bid128_sub (UINT128 x, UINT128 y
2916 _RND_MODE_PARAM _EXC_FLAGS_PARAM _EXC_MASKS_PARAM
2917 _EXC_INFO_PARAM) {
2918 #endif
2919
2920 UINT128 res;
2921 UINT64 y_sign;
2922
2923 if ((y.w[HIGH_128W] & MASK_NAN) != MASK_NAN) { // y is not NAN
2924 // change its sign
2925 y_sign = y.w[HIGH_128W] & MASK_SIGN; // 0 for positive, MASK_SIGN for negative
2926 if (y_sign)
2927 y.w[HIGH_128W] = y.w[HIGH_128W] & 0x7fffffffffffffffull;
2928 else
2929 y.w[HIGH_128W] = y.w[HIGH_128W] | 0x8000000000000000ull;
2930 }
2931 #if DECIMAL_CALL_BY_REFERENCE
2932 bid128_add (&res, &x, &y
2933 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
2934 _EXC_INFO_ARG);
2935 #else
2936 res = bid128_add (x, y
2937 _RND_MODE_ARG _EXC_FLAGS_ARG _EXC_MASKS_ARG
2938 _EXC_INFO_ARG);
2939 #endif
2940 BID_RETURN (res);
2941 }