1 //===- llvm/unittest/ADT/APFloat.cpp - APFloat unit tests ---------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 
10 #include "llvm/ADT/APFloat.h"
11 #include "llvm/ADT/APSInt.h"
12 #include "llvm/ADT/Hashing.h"
13 #include "llvm/ADT/SmallVector.h"
14 #include "llvm/Support/FormatVariadic.h"
15 #include "llvm/Support/raw_ostream.h"
16 #include "gtest/gtest.h"
17 #include <cmath>
18 #include <ostream>
19 #include <string>
20 #include <tuple>
21 
22 using namespace llvm;
23 
24 static double convertToDoubleFromString(const char *Str) {
25   llvm::APFloat F(0.0);
26   F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
27   return F.convertToDouble();
28 }
29 
30 static std::string convertToString(double d, unsigned Prec, unsigned Pad,
31                                    bool Tr = true) {
32   llvm::SmallVector<char, 100> Buffer;
33   llvm::APFloat F(d);
34   F.toString(Buffer, Prec, Pad, Tr);
35   return std::string(Buffer.data(), Buffer.size());
36 }
37 
38 namespace {
39 
40 TEST(APFloatTest, isSignaling) {
41   // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The
42   // positive/negative distinction is included only since the getQNaN/getSNaN
43   // API provides the option.
44   APInt payload = APInt::getOneBitSet(4, 2);
45   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), false).isSignaling());
46   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true).isSignaling());
47   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), false, &payload).isSignaling());
48   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle(), true, &payload).isSignaling());
49   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isSignaling());
50   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isSignaling());
51   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false, &payload).isSignaling());
52   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true, &payload).isSignaling());
53 }
54 
55 TEST(APFloatTest, next) {
56 
57   APFloat test(APFloat::IEEEquad(), APFloat::uninitialized);
58   APFloat expected(APFloat::IEEEquad(), APFloat::uninitialized);
59 
60   // 1. Test Special Cases Values.
61   //
62   // Test all special values for nextUp and nextDown perscribed by IEEE-754R
63   // 2008. These are:
64   //   1.  +inf
65   //   2.  -inf
66   //   3.  getLargest()
67   //   4.  -getLargest()
68   //   5.  getSmallest()
69   //   6.  -getSmallest()
70   //   7.  qNaN
71   //   8.  sNaN
72   //   9.  +0
73   //   10. -0
74 
75   // nextUp(+inf) = +inf.
76   test = APFloat::getInf(APFloat::IEEEquad(), false);
77   expected = APFloat::getInf(APFloat::IEEEquad(), false);
78   EXPECT_EQ(test.next(false), APFloat::opOK);
79   EXPECT_TRUE(test.isInfinity());
80   EXPECT_TRUE(!test.isNegative());
81   EXPECT_TRUE(test.bitwiseIsEqual(expected));
82 
83   // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest()
84   test = APFloat::getInf(APFloat::IEEEquad(), false);
85   expected = APFloat::getLargest(APFloat::IEEEquad(), false);
86   EXPECT_EQ(test.next(true), APFloat::opOK);
87   EXPECT_TRUE(!test.isNegative());
88   EXPECT_TRUE(test.bitwiseIsEqual(expected));
89 
90   // nextUp(-inf) = -getLargest()
91   test = APFloat::getInf(APFloat::IEEEquad(), true);
92   expected = APFloat::getLargest(APFloat::IEEEquad(), true);
93   EXPECT_EQ(test.next(false), APFloat::opOK);
94   EXPECT_TRUE(test.isNegative());
95   EXPECT_TRUE(test.bitwiseIsEqual(expected));
96 
97   // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
98   test = APFloat::getInf(APFloat::IEEEquad(), true);
99   expected = APFloat::getInf(APFloat::IEEEquad(), true);
100   EXPECT_EQ(test.next(true), APFloat::opOK);
101   EXPECT_TRUE(test.isInfinity() && test.isNegative());
102   EXPECT_TRUE(test.bitwiseIsEqual(expected));
103 
104   // nextUp(getLargest()) = +inf
105   test = APFloat::getLargest(APFloat::IEEEquad(), false);
106   expected = APFloat::getInf(APFloat::IEEEquad(), false);
107   EXPECT_EQ(test.next(false), APFloat::opOK);
108   EXPECT_TRUE(test.isInfinity() && !test.isNegative());
109   EXPECT_TRUE(test.bitwiseIsEqual(expected));
110 
111   // nextDown(getLargest()) = -nextUp(-getLargest())
112   //                        = -(-getLargest() + inc)
113   //                        = getLargest() - inc.
114   test = APFloat::getLargest(APFloat::IEEEquad(), false);
115   expected = APFloat(APFloat::IEEEquad(),
116                      "0x1.fffffffffffffffffffffffffffep+16383");
117   EXPECT_EQ(test.next(true), APFloat::opOK);
118   EXPECT_TRUE(!test.isInfinity() && !test.isNegative());
119   EXPECT_TRUE(test.bitwiseIsEqual(expected));
120 
121   // nextUp(-getLargest()) = -getLargest() + inc.
122   test = APFloat::getLargest(APFloat::IEEEquad(), true);
123   expected = APFloat(APFloat::IEEEquad(),
124                      "-0x1.fffffffffffffffffffffffffffep+16383");
125   EXPECT_EQ(test.next(false), APFloat::opOK);
126   EXPECT_TRUE(test.bitwiseIsEqual(expected));
127 
128   // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf.
129   test = APFloat::getLargest(APFloat::IEEEquad(), true);
130   expected = APFloat::getInf(APFloat::IEEEquad(), true);
131   EXPECT_EQ(test.next(true), APFloat::opOK);
132   EXPECT_TRUE(test.isInfinity() && test.isNegative());
133   EXPECT_TRUE(test.bitwiseIsEqual(expected));
134 
135   // nextUp(getSmallest()) = getSmallest() + inc.
136   test = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
137   expected = APFloat(APFloat::IEEEquad(),
138                      "0x0.0000000000000000000000000002p-16382");
139   EXPECT_EQ(test.next(false), APFloat::opOK);
140   EXPECT_TRUE(test.bitwiseIsEqual(expected));
141 
142   // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0.
143   test = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
144   expected = APFloat::getZero(APFloat::IEEEquad(), false);
145   EXPECT_EQ(test.next(true), APFloat::opOK);
146   EXPECT_TRUE(test.isPosZero());
147   EXPECT_TRUE(test.bitwiseIsEqual(expected));
148 
149   // nextUp(-getSmallest()) = -0.
150   test = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
151   expected = APFloat::getZero(APFloat::IEEEquad(), true);
152   EXPECT_EQ(test.next(false), APFloat::opOK);
153   EXPECT_TRUE(test.isNegZero());
154   EXPECT_TRUE(test.bitwiseIsEqual(expected));
155 
156   // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc.
157   test = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
158   expected = APFloat(APFloat::IEEEquad(),
159                      "-0x0.0000000000000000000000000002p-16382");
160   EXPECT_EQ(test.next(true), APFloat::opOK);
161   EXPECT_TRUE(test.bitwiseIsEqual(expected));
162 
163   // nextUp(qNaN) = qNaN
164   test = APFloat::getQNaN(APFloat::IEEEquad(), false);
165   expected = APFloat::getQNaN(APFloat::IEEEquad(), false);
166   EXPECT_EQ(test.next(false), APFloat::opOK);
167   EXPECT_TRUE(test.bitwiseIsEqual(expected));
168 
169   // nextDown(qNaN) = qNaN
170   test = APFloat::getQNaN(APFloat::IEEEquad(), false);
171   expected = APFloat::getQNaN(APFloat::IEEEquad(), false);
172   EXPECT_EQ(test.next(true), APFloat::opOK);
173   EXPECT_TRUE(test.bitwiseIsEqual(expected));
174 
175   // nextUp(sNaN) = qNaN
176   test = APFloat::getSNaN(APFloat::IEEEquad(), false);
177   expected = APFloat::getQNaN(APFloat::IEEEquad(), false);
178   EXPECT_EQ(test.next(false), APFloat::opInvalidOp);
179   EXPECT_TRUE(test.bitwiseIsEqual(expected));
180 
181   // nextDown(sNaN) = qNaN
182   test = APFloat::getSNaN(APFloat::IEEEquad(), false);
183   expected = APFloat::getQNaN(APFloat::IEEEquad(), false);
184   EXPECT_EQ(test.next(true), APFloat::opInvalidOp);
185   EXPECT_TRUE(test.bitwiseIsEqual(expected));
186 
187   // nextUp(+0) = +getSmallest()
188   test = APFloat::getZero(APFloat::IEEEquad(), false);
189   expected = APFloat::getSmallest(APFloat::IEEEquad(), false);
190   EXPECT_EQ(test.next(false), APFloat::opOK);
191   EXPECT_TRUE(test.bitwiseIsEqual(expected));
192 
193   // nextDown(+0) = -nextUp(-0) = -getSmallest()
194   test = APFloat::getZero(APFloat::IEEEquad(), false);
195   expected = APFloat::getSmallest(APFloat::IEEEquad(), true);
196   EXPECT_EQ(test.next(true), APFloat::opOK);
197   EXPECT_TRUE(test.bitwiseIsEqual(expected));
198 
199   // nextUp(-0) = +getSmallest()
200   test = APFloat::getZero(APFloat::IEEEquad(), true);
201   expected = APFloat::getSmallest(APFloat::IEEEquad(), false);
202   EXPECT_EQ(test.next(false), APFloat::opOK);
203   EXPECT_TRUE(test.bitwiseIsEqual(expected));
204 
205   // nextDown(-0) = -nextUp(0) = -getSmallest()
206   test = APFloat::getZero(APFloat::IEEEquad(), true);
207   expected = APFloat::getSmallest(APFloat::IEEEquad(), true);
208   EXPECT_EQ(test.next(true), APFloat::opOK);
209   EXPECT_TRUE(test.bitwiseIsEqual(expected));
210 
211   // 2. Binade Boundary Tests.
212 
213   // 2a. Test denormal <-> normal binade boundaries.
214   //     * nextUp(+Largest Denormal) -> +Smallest Normal.
215   //     * nextDown(-Largest Denormal) -> -Smallest Normal.
216   //     * nextUp(-Smallest Normal) -> -Largest Denormal.
217   //     * nextDown(+Smallest Normal) -> +Largest Denormal.
218 
219   // nextUp(+Largest Denormal) -> +Smallest Normal.
220   test = APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382");
221   expected = APFloat(APFloat::IEEEquad(),
222                      "0x1.0000000000000000000000000000p-16382");
223   EXPECT_EQ(test.next(false), APFloat::opOK);
224   EXPECT_FALSE(test.isDenormal());
225   EXPECT_TRUE(test.bitwiseIsEqual(expected));
226 
227   // nextDown(-Largest Denormal) -> -Smallest Normal.
228   test = APFloat(APFloat::IEEEquad(),
229                  "-0x0.ffffffffffffffffffffffffffffp-16382");
230   expected = APFloat(APFloat::IEEEquad(),
231                      "-0x1.0000000000000000000000000000p-16382");
232   EXPECT_EQ(test.next(true), APFloat::opOK);
233   EXPECT_FALSE(test.isDenormal());
234   EXPECT_TRUE(test.bitwiseIsEqual(expected));
235 
236   // nextUp(-Smallest Normal) -> -LargestDenormal.
237   test = APFloat(APFloat::IEEEquad(),
238                  "-0x1.0000000000000000000000000000p-16382");
239   expected = APFloat(APFloat::IEEEquad(),
240                      "-0x0.ffffffffffffffffffffffffffffp-16382");
241   EXPECT_EQ(test.next(false), APFloat::opOK);
242   EXPECT_TRUE(test.isDenormal());
243   EXPECT_TRUE(test.bitwiseIsEqual(expected));
244 
245   // nextDown(+Smallest Normal) -> +Largest Denormal.
246   test = APFloat(APFloat::IEEEquad(),
247                  "+0x1.0000000000000000000000000000p-16382");
248   expected = APFloat(APFloat::IEEEquad(),
249                      "+0x0.ffffffffffffffffffffffffffffp-16382");
250   EXPECT_EQ(test.next(true), APFloat::opOK);
251   EXPECT_TRUE(test.isDenormal());
252   EXPECT_TRUE(test.bitwiseIsEqual(expected));
253 
254   // 2b. Test normal <-> normal binade boundaries.
255   //     * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
256   //     * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
257   //     * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
258   //     * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
259 
260   // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
261   test = APFloat(APFloat::IEEEquad(), "-0x1p+1");
262   expected = APFloat(APFloat::IEEEquad(),
263                      "-0x1.ffffffffffffffffffffffffffffp+0");
264   EXPECT_EQ(test.next(false), APFloat::opOK);
265   EXPECT_TRUE(test.bitwiseIsEqual(expected));
266 
267   // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
268   test = APFloat(APFloat::IEEEquad(), "0x1p+1");
269   expected = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0");
270   EXPECT_EQ(test.next(true), APFloat::opOK);
271   EXPECT_TRUE(test.bitwiseIsEqual(expected));
272 
273   // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
274   test = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp+0");
275   expected = APFloat(APFloat::IEEEquad(), "0x1p+1");
276   EXPECT_EQ(test.next(false), APFloat::opOK);
277   EXPECT_TRUE(test.bitwiseIsEqual(expected));
278 
279   // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
280   test = APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp+0");
281   expected = APFloat(APFloat::IEEEquad(), "-0x1p+1");
282   EXPECT_EQ(test.next(true), APFloat::opOK);
283   EXPECT_TRUE(test.bitwiseIsEqual(expected));
284 
285   // 2c. Test using next at binade boundaries with a direction away from the
286   // binade boundary. Away from denormal <-> normal boundaries.
287   //
288   // This is to make sure that even though we are at a binade boundary, since
289   // we are rounding away, we do not trigger the binade boundary code. Thus we
290   // test:
291   //   * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
292   //   * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
293   //   * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
294   //   * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
295 
296   // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
297   test = APFloat(APFloat::IEEEquad(), "-0x0.ffffffffffffffffffffffffffffp-16382");
298   expected = APFloat(APFloat::IEEEquad(),
299                      "-0x0.fffffffffffffffffffffffffffep-16382");
300   EXPECT_EQ(test.next(false), APFloat::opOK);
301   EXPECT_TRUE(test.isDenormal());
302   EXPECT_TRUE(test.isNegative());
303   EXPECT_TRUE(test.bitwiseIsEqual(expected));
304 
305   // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
306   test = APFloat(APFloat::IEEEquad(), "0x0.ffffffffffffffffffffffffffffp-16382");
307   expected = APFloat(APFloat::IEEEquad(),
308                      "0x0.fffffffffffffffffffffffffffep-16382");
309   EXPECT_EQ(test.next(true), APFloat::opOK);
310   EXPECT_TRUE(test.isDenormal());
311   EXPECT_TRUE(!test.isNegative());
312   EXPECT_TRUE(test.bitwiseIsEqual(expected));
313 
314   // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
315   test = APFloat(APFloat::IEEEquad(), "0x1.0000000000000000000000000000p-16382");
316   expected = APFloat(APFloat::IEEEquad(),
317                      "0x1.0000000000000000000000000001p-16382");
318   EXPECT_EQ(test.next(false), APFloat::opOK);
319   EXPECT_TRUE(!test.isDenormal());
320   EXPECT_TRUE(!test.isNegative());
321   EXPECT_TRUE(test.bitwiseIsEqual(expected));
322 
323   // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
324   test = APFloat(APFloat::IEEEquad(), "-0x1.0000000000000000000000000000p-16382");
325   expected = APFloat(APFloat::IEEEquad(),
326                      "-0x1.0000000000000000000000000001p-16382");
327   EXPECT_EQ(test.next(true), APFloat::opOK);
328   EXPECT_TRUE(!test.isDenormal());
329   EXPECT_TRUE(test.isNegative());
330   EXPECT_TRUE(test.bitwiseIsEqual(expected));
331 
332   // 2d. Test values which cause our exponent to go to min exponent. This
333   // is to ensure that guards in the code to check for min exponent
334   // trigger properly.
335   //     * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
336   //     * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
337   //         -0x1p-16381
338   //     * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
339   //     * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
340 
341   // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
342   test = APFloat(APFloat::IEEEquad(), "-0x1p-16381");
343   expected = APFloat(APFloat::IEEEquad(),
344                      "-0x1.ffffffffffffffffffffffffffffp-16382");
345   EXPECT_EQ(test.next(false), APFloat::opOK);
346   EXPECT_TRUE(test.bitwiseIsEqual(expected));
347 
348   // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
349   //         -0x1p-16381
350   test = APFloat(APFloat::IEEEquad(), "-0x1.ffffffffffffffffffffffffffffp-16382");
351   expected = APFloat(APFloat::IEEEquad(), "-0x1p-16381");
352   EXPECT_EQ(test.next(true), APFloat::opOK);
353   EXPECT_TRUE(test.bitwiseIsEqual(expected));
354 
355   // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
356   test = APFloat(APFloat::IEEEquad(), "0x1.ffffffffffffffffffffffffffffp-16382");
357   expected = APFloat(APFloat::IEEEquad(), "0x1p-16381");
358   EXPECT_EQ(test.next(false), APFloat::opOK);
359   EXPECT_TRUE(test.bitwiseIsEqual(expected));
360 
361   // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
362   test = APFloat(APFloat::IEEEquad(), "0x1p-16381");
363   expected = APFloat(APFloat::IEEEquad(),
364                      "0x1.ffffffffffffffffffffffffffffp-16382");
365   EXPECT_EQ(test.next(true), APFloat::opOK);
366   EXPECT_TRUE(test.bitwiseIsEqual(expected));
367 
368   // 3. Now we test both denormal/normal computation which will not cause us
369   // to go across binade boundaries. Specifically we test:
370   //   * nextUp(+Denormal) -> +Denormal.
371   //   * nextDown(+Denormal) -> +Denormal.
372   //   * nextUp(-Denormal) -> -Denormal.
373   //   * nextDown(-Denormal) -> -Denormal.
374   //   * nextUp(+Normal) -> +Normal.
375   //   * nextDown(+Normal) -> +Normal.
376   //   * nextUp(-Normal) -> -Normal.
377   //   * nextDown(-Normal) -> -Normal.
378 
379   // nextUp(+Denormal) -> +Denormal.
380   test = APFloat(APFloat::IEEEquad(),
381                  "0x0.ffffffffffffffffffffffff000cp-16382");
382   expected = APFloat(APFloat::IEEEquad(),
383                  "0x0.ffffffffffffffffffffffff000dp-16382");
384   EXPECT_EQ(test.next(false), APFloat::opOK);
385   EXPECT_TRUE(test.isDenormal());
386   EXPECT_TRUE(!test.isNegative());
387   EXPECT_TRUE(test.bitwiseIsEqual(expected));
388 
389   // nextDown(+Denormal) -> +Denormal.
390   test = APFloat(APFloat::IEEEquad(),
391                  "0x0.ffffffffffffffffffffffff000cp-16382");
392   expected = APFloat(APFloat::IEEEquad(),
393                  "0x0.ffffffffffffffffffffffff000bp-16382");
394   EXPECT_EQ(test.next(true), APFloat::opOK);
395   EXPECT_TRUE(test.isDenormal());
396   EXPECT_TRUE(!test.isNegative());
397   EXPECT_TRUE(test.bitwiseIsEqual(expected));
398 
399   // nextUp(-Denormal) -> -Denormal.
400   test = APFloat(APFloat::IEEEquad(),
401                  "-0x0.ffffffffffffffffffffffff000cp-16382");
402   expected = APFloat(APFloat::IEEEquad(),
403                  "-0x0.ffffffffffffffffffffffff000bp-16382");
404   EXPECT_EQ(test.next(false), APFloat::opOK);
405   EXPECT_TRUE(test.isDenormal());
406   EXPECT_TRUE(test.isNegative());
407   EXPECT_TRUE(test.bitwiseIsEqual(expected));
408 
409   // nextDown(-Denormal) -> -Denormal
410   test = APFloat(APFloat::IEEEquad(),
411                  "-0x0.ffffffffffffffffffffffff000cp-16382");
412   expected = APFloat(APFloat::IEEEquad(),
413                  "-0x0.ffffffffffffffffffffffff000dp-16382");
414   EXPECT_EQ(test.next(true), APFloat::opOK);
415   EXPECT_TRUE(test.isDenormal());
416   EXPECT_TRUE(test.isNegative());
417   EXPECT_TRUE(test.bitwiseIsEqual(expected));
418 
419   // nextUp(+Normal) -> +Normal.
420   test = APFloat(APFloat::IEEEquad(),
421                  "0x1.ffffffffffffffffffffffff000cp-16000");
422   expected = APFloat(APFloat::IEEEquad(),
423                  "0x1.ffffffffffffffffffffffff000dp-16000");
424   EXPECT_EQ(test.next(false), APFloat::opOK);
425   EXPECT_TRUE(!test.isDenormal());
426   EXPECT_TRUE(!test.isNegative());
427   EXPECT_TRUE(test.bitwiseIsEqual(expected));
428 
429   // nextDown(+Normal) -> +Normal.
430   test = APFloat(APFloat::IEEEquad(),
431                  "0x1.ffffffffffffffffffffffff000cp-16000");
432   expected = APFloat(APFloat::IEEEquad(),
433                  "0x1.ffffffffffffffffffffffff000bp-16000");
434   EXPECT_EQ(test.next(true), APFloat::opOK);
435   EXPECT_TRUE(!test.isDenormal());
436   EXPECT_TRUE(!test.isNegative());
437   EXPECT_TRUE(test.bitwiseIsEqual(expected));
438 
439   // nextUp(-Normal) -> -Normal.
440   test = APFloat(APFloat::IEEEquad(),
441                  "-0x1.ffffffffffffffffffffffff000cp-16000");
442   expected = APFloat(APFloat::IEEEquad(),
443                  "-0x1.ffffffffffffffffffffffff000bp-16000");
444   EXPECT_EQ(test.next(false), APFloat::opOK);
445   EXPECT_TRUE(!test.isDenormal());
446   EXPECT_TRUE(test.isNegative());
447   EXPECT_TRUE(test.bitwiseIsEqual(expected));
448 
449   // nextDown(-Normal) -> -Normal.
450   test = APFloat(APFloat::IEEEquad(),
451                  "-0x1.ffffffffffffffffffffffff000cp-16000");
452   expected = APFloat(APFloat::IEEEquad(),
453                  "-0x1.ffffffffffffffffffffffff000dp-16000");
454   EXPECT_EQ(test.next(true), APFloat::opOK);
455   EXPECT_TRUE(!test.isDenormal());
456   EXPECT_TRUE(test.isNegative());
457   EXPECT_TRUE(test.bitwiseIsEqual(expected));
458 }
459 
460 TEST(APFloatTest, FMA) {
461   APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
462 
463   {
464     APFloat f1(14.5f);
465     APFloat f2(-14.5f);
466     APFloat f3(225.0f);
467     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
468     EXPECT_EQ(14.75f, f1.convertToFloat());
469   }
470 
471   {
472     APFloat Val2(2.0f);
473     APFloat f1((float)1.17549435e-38F);
474     APFloat f2((float)1.17549435e-38F);
475     f1.divide(Val2, rdmd);
476     f2.divide(Val2, rdmd);
477     APFloat f3(12.0f);
478     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
479     EXPECT_EQ(12.0f, f1.convertToFloat());
480   }
481 
482   // Test for correct zero sign when answer is exactly zero.
483   // fma(1.0, -1.0, 1.0) -> +ve 0.
484   {
485     APFloat f1(1.0);
486     APFloat f2(-1.0);
487     APFloat f3(1.0);
488     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
489     EXPECT_TRUE(!f1.isNegative() && f1.isZero());
490   }
491 
492   // Test for correct zero sign when answer is exactly zero and rounding towards
493   // negative.
494   // fma(1.0, -1.0, 1.0) -> +ve 0.
495   {
496     APFloat f1(1.0);
497     APFloat f2(-1.0);
498     APFloat f3(1.0);
499     f1.fusedMultiplyAdd(f2, f3, APFloat::rmTowardNegative);
500     EXPECT_TRUE(f1.isNegative() && f1.isZero());
501   }
502 
503   // Test for correct (in this case -ve) sign when adding like signed zeros.
504   // Test fma(0.0, -0.0, -0.0) -> -ve 0.
505   {
506     APFloat f1(0.0);
507     APFloat f2(-0.0);
508     APFloat f3(-0.0);
509     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
510     EXPECT_TRUE(f1.isNegative() && f1.isZero());
511   }
512 
513   // Test -ve sign preservation when small negative results underflow.
514   {
515     APFloat f1(APFloat::IEEEdouble(),  "-0x1p-1074");
516     APFloat f2(APFloat::IEEEdouble(), "+0x1p-1074");
517     APFloat f3(0.0);
518     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
519     EXPECT_TRUE(f1.isNegative() && f1.isZero());
520   }
521 
522   // Test x87 extended precision case from http://llvm.org/PR20728.
523   {
524     APFloat M1(APFloat::x87DoubleExtended(), 1.0);
525     APFloat M2(APFloat::x87DoubleExtended(), 1.0);
526     APFloat A(APFloat::x87DoubleExtended(), 3.0);
527 
528     bool losesInfo = false;
529     M1.fusedMultiplyAdd(M1, A, APFloat::rmNearestTiesToEven);
530     M1.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &losesInfo);
531     EXPECT_FALSE(losesInfo);
532     EXPECT_EQ(4.0f, M1.convertToFloat());
533   }
534 }
535 
536 TEST(APFloatTest, MinNum) {
537   APFloat f1(1.0);
538   APFloat f2(2.0);
539   APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
540 
541   EXPECT_EQ(1.0, minnum(f1, f2).convertToDouble());
542   EXPECT_EQ(1.0, minnum(f2, f1).convertToDouble());
543   EXPECT_EQ(1.0, minnum(f1, nan).convertToDouble());
544   EXPECT_EQ(1.0, minnum(nan, f1).convertToDouble());
545 }
546 
547 TEST(APFloatTest, MaxNum) {
548   APFloat f1(1.0);
549   APFloat f2(2.0);
550   APFloat nan = APFloat::getNaN(APFloat::IEEEdouble());
551 
552   EXPECT_EQ(2.0, maxnum(f1, f2).convertToDouble());
553   EXPECT_EQ(2.0, maxnum(f2, f1).convertToDouble());
554   EXPECT_EQ(1.0, maxnum(f1, nan).convertToDouble());
555   EXPECT_EQ(1.0, maxnum(nan, f1).convertToDouble());
556 }
557 
558 TEST(APFloatTest, Denormal) {
559   APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
560 
561   // Test single precision
562   {
563     const char *MinNormalStr = "1.17549435082228750797e-38";
564     EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), MinNormalStr).isDenormal());
565     EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), 0.0).isDenormal());
566 
567     APFloat Val2(APFloat::IEEEsingle(), 2.0e0);
568     APFloat T(APFloat::IEEEsingle(), MinNormalStr);
569     T.divide(Val2, rdmd);
570     EXPECT_TRUE(T.isDenormal());
571   }
572 
573   // Test double precision
574   {
575     const char *MinNormalStr = "2.22507385850720138309e-308";
576     EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), MinNormalStr).isDenormal());
577     EXPECT_FALSE(APFloat(APFloat::IEEEdouble(), 0.0).isDenormal());
578 
579     APFloat Val2(APFloat::IEEEdouble(), 2.0e0);
580     APFloat T(APFloat::IEEEdouble(), MinNormalStr);
581     T.divide(Val2, rdmd);
582     EXPECT_TRUE(T.isDenormal());
583   }
584 
585   // Test Intel double-ext
586   {
587     const char *MinNormalStr = "3.36210314311209350626e-4932";
588     EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), MinNormalStr).isDenormal());
589     EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended(), 0.0).isDenormal());
590 
591     APFloat Val2(APFloat::x87DoubleExtended(), 2.0e0);
592     APFloat T(APFloat::x87DoubleExtended(), MinNormalStr);
593     T.divide(Val2, rdmd);
594     EXPECT_TRUE(T.isDenormal());
595   }
596 
597   // Test quadruple precision
598   {
599     const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
600     EXPECT_FALSE(APFloat(APFloat::IEEEquad(), MinNormalStr).isDenormal());
601     EXPECT_FALSE(APFloat(APFloat::IEEEquad(), 0.0).isDenormal());
602 
603     APFloat Val2(APFloat::IEEEquad(), 2.0e0);
604     APFloat T(APFloat::IEEEquad(), MinNormalStr);
605     T.divide(Val2, rdmd);
606     EXPECT_TRUE(T.isDenormal());
607   }
608 }
609 
610 TEST(APFloatTest, Zero) {
611   EXPECT_EQ(0.0f,  APFloat(0.0f).convertToFloat());
612   EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat());
613   EXPECT_TRUE(APFloat(-0.0f).isNegative());
614 
615   EXPECT_EQ(0.0,  APFloat(0.0).convertToDouble());
616   EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
617   EXPECT_TRUE(APFloat(-0.0).isNegative());
618 }
619 
620 TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
621   // Make sure that we can parse strings without null terminators.
622   // rdar://14323230.
623   APFloat Val(APFloat::IEEEdouble());
624   Val.convertFromString(StringRef("0.00", 3),
625                         llvm::APFloat::rmNearestTiesToEven);
626   EXPECT_EQ(Val.convertToDouble(), 0.0);
627   Val.convertFromString(StringRef("0.01", 3),
628                         llvm::APFloat::rmNearestTiesToEven);
629   EXPECT_EQ(Val.convertToDouble(), 0.0);
630   Val.convertFromString(StringRef("0.09", 3),
631                         llvm::APFloat::rmNearestTiesToEven);
632   EXPECT_EQ(Val.convertToDouble(), 0.0);
633   Val.convertFromString(StringRef("0.095", 4),
634                         llvm::APFloat::rmNearestTiesToEven);
635   EXPECT_EQ(Val.convertToDouble(), 0.09);
636   Val.convertFromString(StringRef("0.00e+3", 7),
637                         llvm::APFloat::rmNearestTiesToEven);
638   EXPECT_EQ(Val.convertToDouble(), 0.00);
639   Val.convertFromString(StringRef("0e+3", 4),
640                         llvm::APFloat::rmNearestTiesToEven);
641   EXPECT_EQ(Val.convertToDouble(), 0.00);
642 
643 }
644 
645 TEST(APFloatTest, fromZeroDecimalString) {
646   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0").convertToDouble());
647   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0").convertToDouble());
648   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0").convertToDouble());
649 
650   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.").convertToDouble());
651   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.").convertToDouble());
652   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.").convertToDouble());
653 
654   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  ".0").convertToDouble());
655   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0").convertToDouble());
656   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0").convertToDouble());
657 
658   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.0").convertToDouble());
659   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0").convertToDouble());
660   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0").convertToDouble());
661 
662   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "00000.").convertToDouble());
663   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+00000.").convertToDouble());
664   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-00000.").convertToDouble());
665 
666   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble(), ".00000").convertToDouble());
667   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.00000").convertToDouble());
668   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.00000").convertToDouble());
669 
670   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0000.00000").convertToDouble());
671   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0000.00000").convertToDouble());
672   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0000.00000").convertToDouble());
673 }
674 
675 TEST(APFloatTest, fromZeroDecimalSingleExponentString) {
676   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),   "0e1").convertToDouble());
677   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(),  "+0e1").convertToDouble());
678   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(),  "-0e1").convertToDouble());
679 
680   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0e+1").convertToDouble());
681   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1").convertToDouble());
682   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1").convertToDouble());
683 
684   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0e-1").convertToDouble());
685   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1").convertToDouble());
686   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1").convertToDouble());
687 
688 
689   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),   "0.e1").convertToDouble());
690   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(),  "+0.e1").convertToDouble());
691   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(),  "-0.e1").convertToDouble());
692 
693   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.e+1").convertToDouble());
694   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e+1").convertToDouble());
695   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e+1").convertToDouble());
696 
697   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.e-1").convertToDouble());
698   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.e-1").convertToDouble());
699   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.e-1").convertToDouble());
700 
701   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),   ".0e1").convertToDouble());
702   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(),  "+.0e1").convertToDouble());
703   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(),  "-.0e1").convertToDouble());
704 
705   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  ".0e+1").convertToDouble());
706   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e+1").convertToDouble());
707   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e+1").convertToDouble());
708 
709   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  ".0e-1").convertToDouble());
710   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+.0e-1").convertToDouble());
711   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-.0e-1").convertToDouble());
712 
713 
714   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),   "0.0e1").convertToDouble());
715   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(),  "+0.0e1").convertToDouble());
716   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(),  "-0.0e1").convertToDouble());
717 
718   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.0e+1").convertToDouble());
719   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e+1").convertToDouble());
720   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e+1").convertToDouble());
721 
722   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0.0e-1").convertToDouble());
723   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0.0e-1").convertToDouble());
724   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0.0e-1").convertToDouble());
725 
726 
727   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "000.0000e1").convertToDouble());
728   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+000.0000e+1").convertToDouble());
729   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-000.0000e+1").convertToDouble());
730 }
731 
732 TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
733   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0e1234").convertToDouble());
734   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e1234").convertToDouble());
735   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e1234").convertToDouble());
736 
737   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0e+1234").convertToDouble());
738   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e+1234").convertToDouble());
739   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e+1234").convertToDouble());
740 
741   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0e-1234").convertToDouble());
742   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0e-1234").convertToDouble());
743   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0e-1234").convertToDouble());
744 
745   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble(), "000.0000e1234").convertToDouble());
746   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble(), "000.0000e-1234").convertToDouble());
747 
748   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble(), StringRef("0e1234" "\0" "2", 6)).convertToDouble());
749 }
750 
751 TEST(APFloatTest, fromZeroHexadecimalString) {
752   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0p1").convertToDouble());
753   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p1").convertToDouble());
754   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1").convertToDouble());
755 
756   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0p+1").convertToDouble());
757   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p+1").convertToDouble());
758   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p+1").convertToDouble());
759 
760   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0p-1").convertToDouble());
761   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0p-1").convertToDouble());
762   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p-1").convertToDouble());
763 
764 
765   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.p1").convertToDouble());
766   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p1").convertToDouble());
767   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p1").convertToDouble());
768 
769   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.p+1").convertToDouble());
770   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p+1").convertToDouble());
771   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p+1").convertToDouble());
772 
773   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.p-1").convertToDouble());
774   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.p-1").convertToDouble());
775   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.p-1").convertToDouble());
776 
777 
778   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x.0p1").convertToDouble());
779   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p1").convertToDouble());
780   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p1").convertToDouble());
781 
782   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x.0p+1").convertToDouble());
783   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p+1").convertToDouble());
784   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p+1").convertToDouble());
785 
786   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x.0p-1").convertToDouble());
787   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x.0p-1").convertToDouble());
788   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x.0p-1").convertToDouble());
789 
790 
791   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.0p1").convertToDouble());
792   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p1").convertToDouble());
793   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p1").convertToDouble());
794 
795   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.0p+1").convertToDouble());
796   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p+1").convertToDouble());
797   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p+1").convertToDouble());
798 
799   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(),  "0x0.0p-1").convertToDouble());
800   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble(), "+0x0.0p-1").convertToDouble());
801   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0.0p-1").convertToDouble());
802 
803 
804   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1").convertToDouble());
805   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1").convertToDouble());
806   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1").convertToDouble());
807   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1").convertToDouble());
808   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0p1234").convertToDouble());
809   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble(), "-0x0p1234").convertToDouble());
810   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x00000.p1234").convertToDouble());
811   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0000.00000p1234").convertToDouble());
812   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x.00000p1234").convertToDouble());
813   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble(), "0x0.p1234").convertToDouble());
814 }
815 
816 TEST(APFloatTest, fromDecimalString) {
817   EXPECT_EQ(1.0,      APFloat(APFloat::IEEEdouble(), "1").convertToDouble());
818   EXPECT_EQ(2.0,      APFloat(APFloat::IEEEdouble(), "2.").convertToDouble());
819   EXPECT_EQ(0.5,      APFloat(APFloat::IEEEdouble(), ".5").convertToDouble());
820   EXPECT_EQ(1.0,      APFloat(APFloat::IEEEdouble(), "1.0").convertToDouble());
821   EXPECT_EQ(-2.0,     APFloat(APFloat::IEEEdouble(), "-2").convertToDouble());
822   EXPECT_EQ(-4.0,     APFloat(APFloat::IEEEdouble(), "-4.").convertToDouble());
823   EXPECT_EQ(-0.5,     APFloat(APFloat::IEEEdouble(), "-.5").convertToDouble());
824   EXPECT_EQ(-1.5,     APFloat(APFloat::IEEEdouble(), "-1.5").convertToDouble());
825   EXPECT_EQ(1.25e12,  APFloat(APFloat::IEEEdouble(), "1.25e12").convertToDouble());
826   EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble(), "1.25e+12").convertToDouble());
827   EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble(), "1.25e-12").convertToDouble());
828   EXPECT_EQ(1024.0,   APFloat(APFloat::IEEEdouble(), "1024.").convertToDouble());
829   EXPECT_EQ(1024.05,  APFloat(APFloat::IEEEdouble(), "1024.05000").convertToDouble());
830   EXPECT_EQ(0.05,     APFloat(APFloat::IEEEdouble(), ".05000").convertToDouble());
831   EXPECT_EQ(2.0,      APFloat(APFloat::IEEEdouble(), "2.").convertToDouble());
832   EXPECT_EQ(2.0e2,    APFloat(APFloat::IEEEdouble(), "2.e2").convertToDouble());
833   EXPECT_EQ(2.0e+2,   APFloat(APFloat::IEEEdouble(), "2.e+2").convertToDouble());
834   EXPECT_EQ(2.0e-2,   APFloat(APFloat::IEEEdouble(), "2.e-2").convertToDouble());
835   EXPECT_EQ(2.05e2,    APFloat(APFloat::IEEEdouble(), "002.05000e2").convertToDouble());
836   EXPECT_EQ(2.05e+2,   APFloat(APFloat::IEEEdouble(), "002.05000e+2").convertToDouble());
837   EXPECT_EQ(2.05e-2,   APFloat(APFloat::IEEEdouble(), "002.05000e-2").convertToDouble());
838   EXPECT_EQ(2.05e12,   APFloat(APFloat::IEEEdouble(), "002.05000e12").convertToDouble());
839   EXPECT_EQ(2.05e+12,  APFloat(APFloat::IEEEdouble(), "002.05000e+12").convertToDouble());
840   EXPECT_EQ(2.05e-12,  APFloat(APFloat::IEEEdouble(), "002.05000e-12").convertToDouble());
841 
842   // These are "carefully selected" to overflow the fast log-base
843   // calculations in APFloat.cpp
844   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "99e99999").isInfinity());
845   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-99e99999").isInfinity());
846   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "1e-99999").isPosZero());
847   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-1e-99999").isNegZero());
848 
849   EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
850 }
851 
852 TEST(APFloatTest, fromHexadecimalString) {
853   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(),  "0x1p0").convertToDouble());
854   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p0").convertToDouble());
855   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p0").convertToDouble());
856 
857   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(),  "0x1p+0").convertToDouble());
858   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p+0").convertToDouble());
859   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p+0").convertToDouble());
860 
861   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble(),  "0x1p-0").convertToDouble());
862   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble(), "+0x1p-0").convertToDouble());
863   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble(), "-0x1p-0").convertToDouble());
864 
865 
866   EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(),  "0x1p1").convertToDouble());
867   EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p1").convertToDouble());
868   EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p1").convertToDouble());
869 
870   EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble(),  "0x1p+1").convertToDouble());
871   EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble(), "+0x1p+1").convertToDouble());
872   EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble(), "-0x1p+1").convertToDouble());
873 
874   EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble(),  "0x1p-1").convertToDouble());
875   EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble(), "+0x1p-1").convertToDouble());
876   EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble(), "-0x1p-1").convertToDouble());
877 
878 
879   EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(),  "0x1.8p1").convertToDouble());
880   EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p1").convertToDouble());
881   EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p1").convertToDouble());
882 
883   EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble(),  "0x1.8p+1").convertToDouble());
884   EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble(), "+0x1.8p+1").convertToDouble());
885   EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble(), "-0x1.8p+1").convertToDouble());
886 
887   EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble(),  "0x1.8p-1").convertToDouble());
888   EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble(), "+0x1.8p-1").convertToDouble());
889   EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble(), "-0x1.8p-1").convertToDouble());
890 
891 
892   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(),  "0x1000.000p1").convertToDouble());
893   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p1").convertToDouble());
894   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p1").convertToDouble());
895 
896   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(),  "0x1000.000p+1").convertToDouble());
897   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p+1").convertToDouble());
898   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p+1").convertToDouble());
899 
900   EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(),  "0x1000.000p-1").convertToDouble());
901   EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000.000p-1").convertToDouble());
902   EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000.000p-1").convertToDouble());
903 
904 
905   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(),  "0x1000p1").convertToDouble());
906   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p1").convertToDouble());
907   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p1").convertToDouble());
908 
909   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble(),  "0x1000p+1").convertToDouble());
910   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble(), "+0x1000p+1").convertToDouble());
911   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble(), "-0x1000p+1").convertToDouble());
912 
913   EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble(),  "0x1000p-1").convertToDouble());
914   EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble(), "+0x1000p-1").convertToDouble());
915   EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble(), "-0x1000p-1").convertToDouble());
916 
917 
918   EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(),  "0x10p10").convertToDouble());
919   EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p10").convertToDouble());
920   EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p10").convertToDouble());
921 
922   EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble(),  "0x10p+10").convertToDouble());
923   EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble(), "+0x10p+10").convertToDouble());
924   EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble(), "-0x10p+10").convertToDouble());
925 
926   EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble(),  "0x10p-10").convertToDouble());
927   EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble(), "+0x10p-10").convertToDouble());
928   EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble(), "-0x10p-10").convertToDouble());
929 
930   EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble(), "0x1.1p0").convertToDouble());
931   EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble(), "0x1p0").convertToDouble());
932 
933   EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
934             convertToDoubleFromString("+0x800000000000000001.p-221"));
935   EXPECT_EQ(2251799813685248.5,
936             convertToDoubleFromString("0x80000000000004000000.010p-28"));
937 }
938 
939 TEST(APFloatTest, toString) {
940   ASSERT_EQ("10", convertToString(10.0, 6, 3));
941   ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
942   ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
943   ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
944   ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
945   ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
946   ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
947   ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
948   ASSERT_EQ("0.78539816339744828", convertToString(0.78539816339744830961, 0, 3));
949   ASSERT_EQ("4.9406564584124654E-324", convertToString(4.9406564584124654e-324, 0, 3));
950   ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1));
951   ASSERT_EQ("8.7318340000000001E+2", convertToString(873.1834, 0, 0));
952   ASSERT_EQ("1.7976931348623157E+308", convertToString(1.7976931348623157E+308, 0, 0));
953   ASSERT_EQ("10", convertToString(10.0, 6, 3, false));
954   ASSERT_EQ("1.000000e+01", convertToString(10.0, 6, 0, false));
955   ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2, false));
956   ASSERT_EQ("1.0100e+04", convertToString(1.01E+4, 4, 2, false));
957   ASSERT_EQ("1.01000e+04", convertToString(1.01E+4, 5, 1, false));
958   ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2, false));
959   ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2, false));
960   ASSERT_EQ("1.01000e-02", convertToString(1.01E-2, 5, 1, false));
961   ASSERT_EQ("0.78539816339744828",
962             convertToString(0.78539816339744830961, 0, 3, false));
963   ASSERT_EQ("4.94065645841246540e-324",
964             convertToString(4.9406564584124654e-324, 0, 3, false));
965   ASSERT_EQ("873.18340000000001", convertToString(873.1834, 0, 1, false));
966   ASSERT_EQ("8.73183400000000010e+02", convertToString(873.1834, 0, 0, false));
967   ASSERT_EQ("1.79769313486231570e+308",
968             convertToString(1.7976931348623157E+308, 0, 0, false));
969 }
970 
971 TEST(APFloatTest, toInteger) {
972   bool isExact = false;
973   APSInt result(5, /*isUnsigned=*/true);
974 
975   EXPECT_EQ(APFloat::opOK,
976             APFloat(APFloat::IEEEdouble(), "10")
977             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
978   EXPECT_TRUE(isExact);
979   EXPECT_EQ(APSInt(APInt(5, 10), true), result);
980 
981   EXPECT_EQ(APFloat::opInvalidOp,
982             APFloat(APFloat::IEEEdouble(), "-10")
983             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
984   EXPECT_FALSE(isExact);
985   EXPECT_EQ(APSInt::getMinValue(5, true), result);
986 
987   EXPECT_EQ(APFloat::opInvalidOp,
988             APFloat(APFloat::IEEEdouble(), "32")
989             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
990   EXPECT_FALSE(isExact);
991   EXPECT_EQ(APSInt::getMaxValue(5, true), result);
992 
993   EXPECT_EQ(APFloat::opInexact,
994             APFloat(APFloat::IEEEdouble(), "7.9")
995             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
996   EXPECT_FALSE(isExact);
997   EXPECT_EQ(APSInt(APInt(5, 7), true), result);
998 
999   result.setIsUnsigned(false);
1000   EXPECT_EQ(APFloat::opOK,
1001             APFloat(APFloat::IEEEdouble(), "-10")
1002             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
1003   EXPECT_TRUE(isExact);
1004   EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
1005 
1006   EXPECT_EQ(APFloat::opInvalidOp,
1007             APFloat(APFloat::IEEEdouble(), "-17")
1008             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
1009   EXPECT_FALSE(isExact);
1010   EXPECT_EQ(APSInt::getMinValue(5, false), result);
1011 
1012   EXPECT_EQ(APFloat::opInvalidOp,
1013             APFloat(APFloat::IEEEdouble(), "16")
1014             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
1015   EXPECT_FALSE(isExact);
1016   EXPECT_EQ(APSInt::getMaxValue(5, false), result);
1017 }
1018 
1019 static APInt nanbits(const fltSemantics &Sem,
1020                      bool SNaN, bool Negative, uint64_t fill) {
1021   APInt apfill(64, fill);
1022   if (SNaN)
1023     return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
1024   else
1025     return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
1026 }
1027 
1028 TEST(APFloatTest, makeNaN) {
1029   ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle(), false, false, 0));
1030   ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle(), false, true, 0));
1031   ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle(), false, false, 0xae72));
1032   ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle(), false, false, 0xffffae72));
1033   ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle(), true, false, 0));
1034   ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle(), true, true, 0));
1035   ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle(), true, false, 0xae72));
1036   ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle(), true, false, 0xffffae72));
1037 
1038   ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, false, 0));
1039   ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble(), false, true, 0));
1040   ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xae72));
1041   ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble(), false, false, 0xffffffffffffae72ULL));
1042   ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, false, 0));
1043   ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble(), true, true, 0));
1044   ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xae72));
1045   ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble(), true, false, 0xffffffffffffae72ULL));
1046 }
1047 
1048 #ifdef GTEST_HAS_DEATH_TEST
1049 #ifndef NDEBUG
1050 TEST(APFloatTest, SemanticsDeath) {
1051   EXPECT_DEATH(APFloat(APFloat::IEEEsingle(), 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
1052   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), 0.0 ).convertToFloat(),  "Float semantics are not IEEEsingle");
1053 }
1054 
1055 TEST(APFloatTest, StringDecimalDeath) {
1056   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  ""), "Invalid string length");
1057   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+"), "String has no digits");
1058   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-"), "String has no digits");
1059 
1060   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("\0", 1)), "Invalid character in significand");
1061   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1\0", 2)), "Invalid character in significand");
1062   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2", 3)), "Invalid character in significand");
1063   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1" "\0" "2e1", 5)), "Invalid character in significand");
1064   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e\0", 3)), "Invalid character in exponent");
1065   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1\0", 4)), "Invalid character in exponent");
1066   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("1e1" "\0" "2", 5)), "Invalid character in exponent");
1067 
1068   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0f"), "Invalid character in significand");
1069 
1070   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".."), "String contains multiple dots");
1071   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "..0"), "String contains multiple dots");
1072   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0.0"), "String contains multiple dots");
1073 }
1074 
1075 TEST(APFloatTest, StringDecimalSignificandDeath) {
1076   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "."), "Significand has no digits");
1077   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+."), "Significand has no digits");
1078   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-."), "Significand has no digits");
1079 
1080 
1081   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "e"), "Significand has no digits");
1082   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e"), "Significand has no digits");
1083   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e"), "Significand has no digits");
1084 
1085   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "e1"), "Significand has no digits");
1086   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+e1"), "Significand has no digits");
1087   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-e1"), "Significand has no digits");
1088 
1089   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  ".e1"), "Significand has no digits");
1090   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e1"), "Significand has no digits");
1091   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e1"), "Significand has no digits");
1092 
1093 
1094   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  ".e"), "Significand has no digits");
1095   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+.e"), "Significand has no digits");
1096   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-.e"), "Significand has no digits");
1097 }
1098 
1099 TEST(APFloatTest, StringDecimalExponentDeath) {
1100   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),   "1e"), "Exponent has no digits");
1101   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "+1e"), "Exponent has no digits");
1102   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "-1e"), "Exponent has no digits");
1103 
1104   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),   "1.e"), "Exponent has no digits");
1105   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "+1.e"), "Exponent has no digits");
1106   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "-1.e"), "Exponent has no digits");
1107 
1108   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),   ".1e"), "Exponent has no digits");
1109   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "+.1e"), "Exponent has no digits");
1110   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "-.1e"), "Exponent has no digits");
1111 
1112   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),   "1.1e"), "Exponent has no digits");
1113   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "+1.1e"), "Exponent has no digits");
1114   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "-1.1e"), "Exponent has no digits");
1115 
1116 
1117   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e+"), "Exponent has no digits");
1118   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1e-"), "Exponent has no digits");
1119 
1120   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  ".1e"), "Exponent has no digits");
1121   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e+"), "Exponent has no digits");
1122   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), ".1e-"), "Exponent has no digits");
1123 
1124   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "1.0e"), "Exponent has no digits");
1125   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e+"), "Exponent has no digits");
1126   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "1.0e-"), "Exponent has no digits");
1127 }
1128 
1129 TEST(APFloatTest, StringHexadecimalDeath) {
1130   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x"), "Invalid string");
1131   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x"), "Invalid string");
1132   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x"), "Invalid string");
1133 
1134   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x0"), "Hex strings require an exponent");
1135   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0"), "Hex strings require an exponent");
1136   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0"), "Hex strings require an exponent");
1137 
1138   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x0."), "Hex strings require an exponent");
1139   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0."), "Hex strings require an exponent");
1140   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0."), "Hex strings require an exponent");
1141 
1142   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.0"), "Hex strings require an exponent");
1143   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.0"), "Hex strings require an exponent");
1144   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.0"), "Hex strings require an exponent");
1145 
1146   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x0.0"), "Hex strings require an exponent");
1147   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x0.0"), "Hex strings require an exponent");
1148   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x0.0"), "Hex strings require an exponent");
1149 
1150   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x\0", 3)), "Invalid character in significand");
1151   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1\0", 4)), "Invalid character in significand");
1152   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2", 5)), "Invalid character in significand");
1153   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1" "\0" "2p1", 7)), "Invalid character in significand");
1154   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p\0", 5)), "Invalid character in exponent");
1155   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1\0", 6)), "Invalid character in exponent");
1156   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), StringRef("0x1p1" "\0" "2", 7)), "Invalid character in exponent");
1157 
1158   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1p0f"), "Invalid character in exponent");
1159 
1160   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..p1"), "String contains multiple dots");
1161   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x..0p1"), "String contains multiple dots");
1162   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "0x1.0.0p1"), "String contains multiple dots");
1163 }
1164 
1165 TEST(APFloatTest, StringHexadecimalSignificandDeath) {
1166   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x."), "Significand has no digits");
1167   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x."), "Significand has no digits");
1168   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x."), "Significand has no digits");
1169 
1170   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0xp"), "Significand has no digits");
1171   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp"), "Significand has no digits");
1172   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp"), "Significand has no digits");
1173 
1174   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0xp+"), "Significand has no digits");
1175   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp+"), "Significand has no digits");
1176   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp+"), "Significand has no digits");
1177 
1178   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0xp-"), "Significand has no digits");
1179   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0xp-"), "Significand has no digits");
1180   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0xp-"), "Significand has no digits");
1181 
1182 
1183   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.p"), "Significand has no digits");
1184   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p"), "Significand has no digits");
1185   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p"), "Significand has no digits");
1186 
1187   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.p+"), "Significand has no digits");
1188   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p+"), "Significand has no digits");
1189   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p+"), "Significand has no digits");
1190 
1191   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.p-"), "Significand has no digits");
1192   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.p-"), "Significand has no digits");
1193   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.p-"), "Significand has no digits");
1194 }
1195 
1196 TEST(APFloatTest, StringHexadecimalExponentDeath) {
1197   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1p"), "Exponent has no digits");
1198   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p"), "Exponent has no digits");
1199   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p"), "Exponent has no digits");
1200 
1201   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1p+"), "Exponent has no digits");
1202   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p+"), "Exponent has no digits");
1203   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p+"), "Exponent has no digits");
1204 
1205   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1p-"), "Exponent has no digits");
1206   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1p-"), "Exponent has no digits");
1207   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1p-"), "Exponent has no digits");
1208 
1209 
1210   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.p"), "Exponent has no digits");
1211   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p"), "Exponent has no digits");
1212   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p"), "Exponent has no digits");
1213 
1214   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.p+"), "Exponent has no digits");
1215   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p+"), "Exponent has no digits");
1216   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p+"), "Exponent has no digits");
1217 
1218   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.p-"), "Exponent has no digits");
1219   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.p-"), "Exponent has no digits");
1220   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.p-"), "Exponent has no digits");
1221 
1222 
1223   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.1p"), "Exponent has no digits");
1224   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p"), "Exponent has no digits");
1225   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p"), "Exponent has no digits");
1226 
1227   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.1p+"), "Exponent has no digits");
1228   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p+"), "Exponent has no digits");
1229   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p+"), "Exponent has no digits");
1230 
1231   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x.1p-"), "Exponent has no digits");
1232   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x.1p-"), "Exponent has no digits");
1233   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x.1p-"), "Exponent has no digits");
1234 
1235 
1236   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.1p"), "Exponent has no digits");
1237   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p"), "Exponent has no digits");
1238   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p"), "Exponent has no digits");
1239 
1240   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.1p+"), "Exponent has no digits");
1241   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p+"), "Exponent has no digits");
1242   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p+"), "Exponent has no digits");
1243 
1244   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(),  "0x1.1p-"), "Exponent has no digits");
1245   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "+0x1.1p-"), "Exponent has no digits");
1246   EXPECT_DEATH(APFloat(APFloat::IEEEdouble(), "-0x1.1p-"), "Exponent has no digits");
1247 }
1248 #endif
1249 #endif
1250 
1251 TEST(APFloatTest, exactInverse) {
1252   APFloat inv(0.0f);
1253 
1254   // Trivial operation.
1255   EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv));
1256   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5)));
1257   EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv));
1258   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f)));
1259   EXPECT_TRUE(APFloat(APFloat::IEEEquad(), "2.0").getExactInverse(&inv));
1260   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad(), "0.5")));
1261   EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble(), "2.0").getExactInverse(&inv));
1262   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble(), "0.5")));
1263   EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended(), "2.0").getExactInverse(&inv));
1264   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended(), "0.5")));
1265 
1266   // FLT_MIN
1267   EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv));
1268   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f)));
1269 
1270   // Large float, inverse is a denormal.
1271   EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(nullptr));
1272   // Zero
1273   EXPECT_FALSE(APFloat(0.0).getExactInverse(nullptr));
1274   // Denormalized float
1275   EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(nullptr));
1276 }
1277 
1278 TEST(APFloatTest, roundToIntegral) {
1279   APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble())), P(0.0);
1280 
1281   P = T;
1282   P.roundToIntegral(APFloat::rmTowardZero);
1283   EXPECT_EQ(-0.0, P.convertToDouble());
1284   P = T;
1285   P.roundToIntegral(APFloat::rmTowardNegative);
1286   EXPECT_EQ(-1.0, P.convertToDouble());
1287   P = T;
1288   P.roundToIntegral(APFloat::rmTowardPositive);
1289   EXPECT_EQ(-0.0, P.convertToDouble());
1290   P = T;
1291   P.roundToIntegral(APFloat::rmNearestTiesToEven);
1292   EXPECT_EQ(-0.0, P.convertToDouble());
1293 
1294   P = S;
1295   P.roundToIntegral(APFloat::rmTowardZero);
1296   EXPECT_EQ(3.0, P.convertToDouble());
1297   P = S;
1298   P.roundToIntegral(APFloat::rmTowardNegative);
1299   EXPECT_EQ(3.0, P.convertToDouble());
1300   P = S;
1301   P.roundToIntegral(APFloat::rmTowardPositive);
1302   EXPECT_EQ(4.0, P.convertToDouble());
1303   P = S;
1304   P.roundToIntegral(APFloat::rmNearestTiesToEven);
1305   EXPECT_EQ(3.0, P.convertToDouble());
1306 
1307   P = R;
1308   P.roundToIntegral(APFloat::rmTowardZero);
1309   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1310   P = R;
1311   P.roundToIntegral(APFloat::rmTowardNegative);
1312   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1313   P = R;
1314   P.roundToIntegral(APFloat::rmTowardPositive);
1315   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1316   P = R;
1317   P.roundToIntegral(APFloat::rmNearestTiesToEven);
1318   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
1319 
1320   P = APFloat::getZero(APFloat::IEEEdouble());
1321   P.roundToIntegral(APFloat::rmTowardZero);
1322   EXPECT_EQ(0.0, P.convertToDouble());
1323   P = APFloat::getZero(APFloat::IEEEdouble(), true);
1324   P.roundToIntegral(APFloat::rmTowardZero);
1325   EXPECT_EQ(-0.0, P.convertToDouble());
1326   P = APFloat::getNaN(APFloat::IEEEdouble());
1327   P.roundToIntegral(APFloat::rmTowardZero);
1328   EXPECT_TRUE(std::isnan(P.convertToDouble()));
1329   P = APFloat::getInf(APFloat::IEEEdouble());
1330   P.roundToIntegral(APFloat::rmTowardZero);
1331   EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() > 0.0);
1332   P = APFloat::getInf(APFloat::IEEEdouble(), true);
1333   P.roundToIntegral(APFloat::rmTowardZero);
1334   EXPECT_TRUE(std::isinf(P.convertToDouble()) && P.convertToDouble() < 0.0);
1335 }
1336 
1337 TEST(APFloatTest, isInteger) {
1338   APFloat T(-0.0);
1339   EXPECT_TRUE(T.isInteger());
1340   T = APFloat(3.14159);
1341   EXPECT_FALSE(T.isInteger());
1342   T = APFloat::getNaN(APFloat::IEEEdouble());
1343   EXPECT_FALSE(T.isInteger());
1344   T = APFloat::getInf(APFloat::IEEEdouble());
1345   EXPECT_FALSE(T.isInteger());
1346   T = APFloat::getInf(APFloat::IEEEdouble(), true);
1347   EXPECT_FALSE(T.isInteger());
1348   T = APFloat::getLargest(APFloat::IEEEdouble());
1349   EXPECT_TRUE(T.isInteger());
1350 }
1351 
1352 TEST(DoubleAPFloatTest, isInteger) {
1353   APFloat F1(-0.0);
1354   APFloat F2(-0.0);
1355   llvm::detail::DoubleAPFloat T(APFloat::PPCDoubleDouble(), std::move(F1),
1356                                 std::move(F2));
1357   EXPECT_TRUE(T.isInteger());
1358   APFloat F3(3.14159);
1359   APFloat F4(-0.0);
1360   llvm::detail::DoubleAPFloat T2(APFloat::PPCDoubleDouble(), std::move(F3),
1361                                 std::move(F4));
1362   EXPECT_FALSE(T2.isInteger());
1363   APFloat F5(-0.0);
1364   APFloat F6(3.14159);
1365   llvm::detail::DoubleAPFloat T3(APFloat::PPCDoubleDouble(), std::move(F5),
1366                                 std::move(F6));
1367   EXPECT_FALSE(T3.isInteger());
1368 }
1369 
1370 TEST(APFloatTest, getLargest) {
1371   EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle()).convertToFloat());
1372   EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble()).convertToDouble());
1373 }
1374 
1375 TEST(APFloatTest, getSmallest) {
1376   APFloat test = APFloat::getSmallest(APFloat::IEEEsingle(), false);
1377   APFloat expected = APFloat(APFloat::IEEEsingle(), "0x0.000002p-126");
1378   EXPECT_FALSE(test.isNegative());
1379   EXPECT_TRUE(test.isFiniteNonZero());
1380   EXPECT_TRUE(test.isDenormal());
1381   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1382 
1383   test = APFloat::getSmallest(APFloat::IEEEsingle(), true);
1384   expected = APFloat(APFloat::IEEEsingle(), "-0x0.000002p-126");
1385   EXPECT_TRUE(test.isNegative());
1386   EXPECT_TRUE(test.isFiniteNonZero());
1387   EXPECT_TRUE(test.isDenormal());
1388   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1389 
1390   test = APFloat::getSmallest(APFloat::IEEEquad(), false);
1391   expected = APFloat(APFloat::IEEEquad(), "0x0.0000000000000000000000000001p-16382");
1392   EXPECT_FALSE(test.isNegative());
1393   EXPECT_TRUE(test.isFiniteNonZero());
1394   EXPECT_TRUE(test.isDenormal());
1395   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1396 
1397   test = APFloat::getSmallest(APFloat::IEEEquad(), true);
1398   expected = APFloat(APFloat::IEEEquad(), "-0x0.0000000000000000000000000001p-16382");
1399   EXPECT_TRUE(test.isNegative());
1400   EXPECT_TRUE(test.isFiniteNonZero());
1401   EXPECT_TRUE(test.isDenormal());
1402   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1403 }
1404 
1405 TEST(APFloatTest, getSmallestNormalized) {
1406   APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
1407   APFloat expected = APFloat(APFloat::IEEEsingle(), "0x1p-126");
1408   EXPECT_FALSE(test.isNegative());
1409   EXPECT_TRUE(test.isFiniteNonZero());
1410   EXPECT_FALSE(test.isDenormal());
1411   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1412 
1413   test = APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
1414   expected = APFloat(APFloat::IEEEsingle(), "-0x1p-126");
1415   EXPECT_TRUE(test.isNegative());
1416   EXPECT_TRUE(test.isFiniteNonZero());
1417   EXPECT_FALSE(test.isDenormal());
1418   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1419 
1420   test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), false);
1421   expected = APFloat(APFloat::IEEEquad(), "0x1p-16382");
1422   EXPECT_FALSE(test.isNegative());
1423   EXPECT_TRUE(test.isFiniteNonZero());
1424   EXPECT_FALSE(test.isDenormal());
1425   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1426 
1427   test = APFloat::getSmallestNormalized(APFloat::IEEEquad(), true);
1428   expected = APFloat(APFloat::IEEEquad(), "-0x1p-16382");
1429   EXPECT_TRUE(test.isNegative());
1430   EXPECT_TRUE(test.isFiniteNonZero());
1431   EXPECT_FALSE(test.isDenormal());
1432   EXPECT_TRUE(test.bitwiseIsEqual(expected));
1433 }
1434 
1435 TEST(APFloatTest, getZero) {
1436   struct {
1437     const fltSemantics *semantics;
1438     const bool sign;
1439     const unsigned long long bitPattern[2];
1440     const unsigned bitPatternLength;
1441   } const GetZeroTest[] = {
1442     { &APFloat::IEEEhalf(), false, {0, 0}, 1},
1443     { &APFloat::IEEEhalf(), true, {0x8000ULL, 0}, 1},
1444     { &APFloat::IEEEsingle(), false, {0, 0}, 1},
1445     { &APFloat::IEEEsingle(), true, {0x80000000ULL, 0}, 1},
1446     { &APFloat::IEEEdouble(), false, {0, 0}, 1},
1447     { &APFloat::IEEEdouble(), true, {0x8000000000000000ULL, 0}, 1},
1448     { &APFloat::IEEEquad(), false, {0, 0}, 2},
1449     { &APFloat::IEEEquad(), true, {0, 0x8000000000000000ULL}, 2},
1450     { &APFloat::PPCDoubleDouble(), false, {0, 0}, 2},
1451     { &APFloat::PPCDoubleDouble(), true, {0x8000000000000000ULL, 0}, 2},
1452     { &APFloat::x87DoubleExtended(), false, {0, 0}, 2},
1453     { &APFloat::x87DoubleExtended(), true, {0, 0x8000ULL}, 2},
1454   };
1455   const unsigned NumGetZeroTests = 12;
1456   for (unsigned i = 0; i < NumGetZeroTests; ++i) {
1457     APFloat test = APFloat::getZero(*GetZeroTest[i].semantics,
1458                                     GetZeroTest[i].sign);
1459     const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0";
1460     APFloat expected = APFloat(*GetZeroTest[i].semantics,
1461                                pattern);
1462     EXPECT_TRUE(test.isZero());
1463     EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative());
1464     EXPECT_TRUE(test.bitwiseIsEqual(expected));
1465     for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) {
1466       EXPECT_EQ(GetZeroTest[i].bitPattern[j],
1467                 test.bitcastToAPInt().getRawData()[j]);
1468     }
1469   }
1470 }
1471 
1472 TEST(APFloatTest, copySign) {
1473   EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1474       APFloat::copySign(APFloat(42.0), APFloat(-1.0))));
1475   EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1476       APFloat::copySign(APFloat(-42.0), APFloat(1.0))));
1477   EXPECT_TRUE(APFloat(-42.0).bitwiseIsEqual(
1478       APFloat::copySign(APFloat(-42.0), APFloat(-1.0))));
1479   EXPECT_TRUE(APFloat(42.0).bitwiseIsEqual(
1480       APFloat::copySign(APFloat(42.0), APFloat(1.0))));
1481 }
1482 
1483 TEST(APFloatTest, convert) {
1484   bool losesInfo;
1485   APFloat test(APFloat::IEEEdouble(), "1.0");
1486   test.convert(APFloat::IEEEsingle(), APFloat::rmNearestTiesToEven, &losesInfo);
1487   EXPECT_EQ(1.0f, test.convertToFloat());
1488   EXPECT_FALSE(losesInfo);
1489 
1490   test = APFloat(APFloat::x87DoubleExtended(), "0x1p-53");
1491   test.add(APFloat(APFloat::x87DoubleExtended(), "1.0"), APFloat::rmNearestTiesToEven);
1492   test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo);
1493   EXPECT_EQ(1.0, test.convertToDouble());
1494   EXPECT_TRUE(losesInfo);
1495 
1496   test = APFloat(APFloat::IEEEquad(), "0x1p-53");
1497   test.add(APFloat(APFloat::IEEEquad(), "1.0"), APFloat::rmNearestTiesToEven);
1498   test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo);
1499   EXPECT_EQ(1.0, test.convertToDouble());
1500   EXPECT_TRUE(losesInfo);
1501 
1502   test = APFloat(APFloat::x87DoubleExtended(), "0xf.fffffffp+28");
1503   test.convert(APFloat::IEEEdouble(), APFloat::rmNearestTiesToEven, &losesInfo);
1504   EXPECT_EQ(4294967295.0, test.convertToDouble());
1505   EXPECT_FALSE(losesInfo);
1506 
1507   test = APFloat::getSNaN(APFloat::IEEEsingle());
1508   APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended());
1509   test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven,
1510                &losesInfo);
1511   EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1512   EXPECT_FALSE(losesInfo);
1513 
1514   test = APFloat::getQNaN(APFloat::IEEEsingle());
1515   APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended());
1516   test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven,
1517                &losesInfo);
1518   EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1519   EXPECT_FALSE(losesInfo);
1520 
1521   test = APFloat::getSNaN(APFloat::x87DoubleExtended());
1522   test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven,
1523                &losesInfo);
1524   EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
1525   EXPECT_FALSE(losesInfo);
1526 
1527   test = APFloat::getQNaN(APFloat::x87DoubleExtended());
1528   test.convert(APFloat::x87DoubleExtended(), APFloat::rmNearestTiesToEven,
1529                &losesInfo);
1530   EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
1531   EXPECT_FALSE(losesInfo);
1532 }
1533 
1534 TEST(APFloatTest, PPCDoubleDouble) {
1535   APFloat test(APFloat::PPCDoubleDouble(), "1.0");
1536   EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1537   EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1538 
1539   // LDBL_MAX
1540   test = APFloat(APFloat::PPCDoubleDouble(), "1.79769313486231580793728971405301e+308");
1541   EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]);
1542   EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]);
1543 
1544   // LDBL_MIN
1545   test = APFloat(APFloat::PPCDoubleDouble(), "2.00416836000897277799610805135016e-292");
1546   EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]);
1547   EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
1548 
1549   // PR30869
1550   {
1551     auto Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") +
1552                   APFloat(APFloat::PPCDoubleDouble(), "1.0");
1553     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1554 
1555     Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") -
1556              APFloat(APFloat::PPCDoubleDouble(), "1.0");
1557     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1558 
1559     Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") *
1560              APFloat(APFloat::PPCDoubleDouble(), "1.0");
1561     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1562 
1563     Result = APFloat(APFloat::PPCDoubleDouble(), "1.0") /
1564              APFloat(APFloat::PPCDoubleDouble(), "1.0");
1565     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1566 
1567     int Exp;
1568     Result = frexp(APFloat(APFloat::PPCDoubleDouble(), "1.0"), Exp,
1569                    APFloat::rmNearestTiesToEven);
1570     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1571 
1572     Result = scalbn(APFloat(APFloat::PPCDoubleDouble(), "1.0"), 1,
1573                     APFloat::rmNearestTiesToEven);
1574     EXPECT_EQ(&APFloat::PPCDoubleDouble(), &Result.getSemantics());
1575   }
1576 }
1577 
1578 TEST(APFloatTest, isNegative) {
1579   APFloat t(APFloat::IEEEsingle(), "0x1p+0");
1580   EXPECT_FALSE(t.isNegative());
1581   t = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
1582   EXPECT_TRUE(t.isNegative());
1583 
1584   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNegative());
1585   EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), true).isNegative());
1586 
1587   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNegative());
1588   EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), true).isNegative());
1589 
1590   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNegative());
1591   EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), true).isNegative());
1592 
1593   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNegative());
1594   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isNegative());
1595 }
1596 
1597 TEST(APFloatTest, isNormal) {
1598   APFloat t(APFloat::IEEEsingle(), "0x1p+0");
1599   EXPECT_TRUE(t.isNormal());
1600 
1601   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNormal());
1602   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNormal());
1603   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNormal());
1604   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNormal());
1605   EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNormal());
1606 }
1607 
1608 TEST(APFloatTest, isFinite) {
1609   APFloat t(APFloat::IEEEsingle(), "0x1p+0");
1610   EXPECT_TRUE(t.isFinite());
1611   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFinite());
1612   EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle(), false).isFinite());
1613   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFinite());
1614   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFinite());
1615   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFinite());
1616 }
1617 
1618 TEST(APFloatTest, isInfinity) {
1619   APFloat t(APFloat::IEEEsingle(), "0x1p+0");
1620   EXPECT_FALSE(t.isInfinity());
1621   EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle(), false).isInfinity());
1622   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isInfinity());
1623   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isInfinity());
1624   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isInfinity());
1625   EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isInfinity());
1626 }
1627 
1628 TEST(APFloatTest, isNaN) {
1629   APFloat t(APFloat::IEEEsingle(), "0x1p+0");
1630   EXPECT_FALSE(t.isNaN());
1631   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isNaN());
1632   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isNaN());
1633   EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle(), false).isNaN());
1634   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isNaN());
1635   EXPECT_FALSE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isNaN());
1636 }
1637 
1638 TEST(APFloatTest, isFiniteNonZero) {
1639   // Test positive/negative normal value.
1640   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p+0").isFiniteNonZero());
1641   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p+0").isFiniteNonZero());
1642 
1643   // Test positive/negative denormal value.
1644   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "0x1p-149").isFiniteNonZero());
1645   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").isFiniteNonZero());
1646 
1647   // Test +/- Infinity.
1648   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), false).isFiniteNonZero());
1649   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle(), true).isFiniteNonZero());
1650 
1651   // Test +/- Zero.
1652   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), false).isFiniteNonZero());
1653   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle(), true).isFiniteNonZero());
1654 
1655   // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
1656   // this instance.
1657   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), false).isFiniteNonZero());
1658   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle(), true).isFiniteNonZero());
1659 
1660   // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
1661   // this instance.
1662   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), false).isFiniteNonZero());
1663   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle(), true).isFiniteNonZero());
1664 }
1665 
1666 TEST(APFloatTest, add) {
1667   // Test Special Cases against each other and normal values.
1668 
1669   // TODOS/NOTES:
1670   // 1. Since we perform only default exception handling all operations with
1671   // signaling NaNs should have a result that is a quiet NaN. Currently they
1672   // return sNaN.
1673 
1674   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
1675   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
1676   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
1677   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
1678   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
1679   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
1680   APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0");
1681   APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
1682   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false);
1683   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true);
1684   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false);
1685   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true);
1686   APFloat PSmallestNormalized =
1687     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
1688   APFloat MSmallestNormalized =
1689     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
1690 
1691   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1692 
1693   const unsigned NumTests = 169;
1694   struct {
1695     APFloat x;
1696     APFloat y;
1697     const char *result;
1698     int status;
1699     int category;
1700   } SpecialCaseTests[NumTests] = {
1701     { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1702     { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1703     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1704     { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1705     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1706 #if 0
1707     // See Note 1.
1708     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1709 #endif
1710     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1711     { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1712     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1713     { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1714     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1715     { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1716     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1717     { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
1718     { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1719     { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1720     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1721     { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
1722     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1723 #if 0
1724     // See Note 1.
1725     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1726 #endif
1727     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1728     { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1729     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1730     { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1731     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1732     { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
1733     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1734     { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
1735     { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1736     { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1737     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1738     { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1739     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1740 #if 0
1741     // See Note 1.
1742     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1743 #endif
1744     { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1745     { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1746     { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1747     { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1748     { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1749     { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1750     { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1751     { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1752     { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1753     { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1754     { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1755     { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
1756     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1757 #if 0
1758     // See Note 1.
1759     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1760 #endif
1761     { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1762     { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1763     { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1764     { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1765     { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1766     { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1767     { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1768     { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1769     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
1770     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
1771     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
1772     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
1773     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1774 #if 0
1775     // See Note 1.
1776     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1777 #endif
1778     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1779     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
1780     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1781     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1782     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1783     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
1784     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1785     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
1786 #if 0
1787     // See Note 1.
1788     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1789     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1790     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1791     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1792     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1793     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1794     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1795     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1796     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1797     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1798     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1799     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1800     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1801     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1802 #endif
1803     { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1804     { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1805     { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1806     { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
1807     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1808 #if 0
1809     // See Note 1.
1810     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1811 #endif
1812     { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
1813     { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1814     { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1815     { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1816     { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1817     { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1818     { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1819     { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1820     { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1821     { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1822     { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1823     { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
1824     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1825 #if 0
1826     // See Note 1.
1827     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1828 #endif
1829     { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1830     { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
1831     { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1832     { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1833     { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1834     { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1835     { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1836     { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1837     { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1838     { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1839     { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1840     { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1841     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1842 #if 0
1843     // See Note 1.
1844     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1845 #endif
1846     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1847     { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1848     { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
1849     { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1850     { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1851     { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1852     { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1853     { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1854     { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1855     { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1856     { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1857     { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
1858     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1859 #if 0
1860     // See Note 1.
1861     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1862 #endif
1863     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1864     { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1865     { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1866     { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
1867     { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1868     { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1869     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1870     { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1871     { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1872     { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1873     { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1874     { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
1875     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1876 #if 0
1877     // See Note 1.
1878     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1879 #endif
1880     { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1881     { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1882     { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1883     { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1884     { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
1885     { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1886     { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1887     { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1888     { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1889     { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1890     { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1891     { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
1892     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1893 #if 0
1894     // See Note 1.
1895     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1896 #endif
1897     { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1898     { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1899     { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1900     { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1901     { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1902     { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
1903     { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1904     { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1905     { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1906     { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1907     { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1908     { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
1909     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1910 #if 0
1911 // See Note 1.
1912     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1913 #endif
1914     { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1915     { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1916     { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1917     { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1918     { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1919     { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1920     { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
1921     { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1922     { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1923     { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
1924     { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1925     { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
1926     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
1927 #if 0
1928     // See Note 1.
1929     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1930 #endif
1931     { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1932     { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
1933     { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1934     { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
1935     { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
1936     { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
1937     { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
1938     { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }
1939   };
1940 
1941   for (size_t i = 0; i < NumTests; ++i) {
1942     APFloat x(SpecialCaseTests[i].x);
1943     APFloat y(SpecialCaseTests[i].y);
1944     APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven);
1945 
1946     APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result);
1947 
1948     EXPECT_TRUE(result.bitwiseIsEqual(x));
1949     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
1950     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
1951   }
1952 }
1953 
1954 TEST(APFloatTest, subtract) {
1955   // Test Special Cases against each other and normal values.
1956 
1957   // TODOS/NOTES:
1958   // 1. Since we perform only default exception handling all operations with
1959   // signaling NaNs should have a result that is a quiet NaN. Currently they
1960   // return sNaN.
1961 
1962   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
1963   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
1964   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
1965   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
1966   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
1967   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
1968   APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0");
1969   APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
1970   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false);
1971   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true);
1972   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false);
1973   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true);
1974   APFloat PSmallestNormalized =
1975     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
1976   APFloat MSmallestNormalized =
1977     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
1978 
1979   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
1980 
1981   const unsigned NumTests = 169;
1982   struct {
1983     APFloat x;
1984     APFloat y;
1985     const char *result;
1986     int status;
1987     int category;
1988   } SpecialCaseTests[NumTests] = {
1989     { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
1990     { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
1991     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1992     { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
1993     { PInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
1994 #if 0
1995 // See Note 1.
1996     { PInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
1997 #endif
1998     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
1999     { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2000     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2001     { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2002     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2003     { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2004     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2005     { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2006     { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2007     { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2008     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2009     { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2010     { MInf, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2011 #if 0
2012 // See Note 1.
2013     { MInf, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2014 #endif
2015     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2016     { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2017     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2018     { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2019     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2020     { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2021     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2022     { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2023     { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2024     { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2025     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2026     { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2027     { PZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2028 #if 0
2029 // See Note 1.
2030     { PZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2031 #endif
2032     { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2033     { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2034     { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2035     { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2036     { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2037     { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2038     { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2039     { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2040     { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2041     { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2042     { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2043     { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2044     { MZero, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2045 #if 0
2046 // See Note 1.
2047     { MZero, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2048 #endif
2049     { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2050     { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2051     { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2052     { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2053     { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2054     { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2055     { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2056     { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2057     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
2058     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
2059     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
2060     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
2061     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2062 #if 0
2063 // See Note 1.
2064     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2065 #endif
2066     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2067     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2068     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2069     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2070     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2071     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2072     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2073     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2074 #if 0
2075 // See Note 1.
2076     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2077     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2078     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2079     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2080     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2081     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2082     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2083     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2084     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2085     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2086     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2087     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2088     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2089     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2090 #endif
2091     { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2092     { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2093     { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2094     { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2095     { PNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2096 #if 0
2097 // See Note 1.
2098     { PNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2099 #endif
2100     { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2101     { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
2102     { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2103     { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2104     { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2105     { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2106     { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2107     { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2108     { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2109     { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2110     { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2111     { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2112     { MNormalValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2113 #if 0
2114 // See Note 1.
2115     { MNormalValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2116 #endif
2117     { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
2118     { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2119     { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2120     { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2121     { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2122     { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2123     { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2124     { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2125     { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2126     { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2127     { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2128     { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2129     { PLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2130 #if 0
2131 // See Note 1.
2132     { PLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2133 #endif
2134     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2135     { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2136     { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2137     { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2138     { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2139     { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2140     { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2141     { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2142     { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2143     { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2144     { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2145     { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2146     { MLargestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2147 #if 0
2148 // See Note 1.
2149     { MLargestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2150 #endif
2151     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2152     { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2153     { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2154     { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2155     { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2156     { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2157     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2158     { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2159     { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2160     { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2161     { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2162     { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2163     { PSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2164 #if 0
2165 // See Note 1.
2166     { PSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2167 #endif
2168     { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2169     { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2170     { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2171     { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2172     { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2173     { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
2174     { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2175     { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2176     { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2177     { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2178     { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2179     { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2180     { MSmallestValue, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2181 #if 0
2182 // See Note 1.
2183     { MSmallestValue, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2184 #endif
2185     { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2186     { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2187     { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2188     { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2189     { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
2190     { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2191     { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2192     { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2193     { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2194     { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2195     { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2196     { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2197     { PSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2198 #if 0
2199 // See Note 1.
2200     { PSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2201 #endif
2202     { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2203     { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2204     { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2205     { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2206     { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2207     { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2208     { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2209     { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
2210     { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2211     { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2212     { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2213     { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2214     { MSmallestNormalized, QNaN, "-nan", APFloat::opOK, APFloat::fcNaN },
2215 #if 0
2216 // See Note 1.
2217     { MSmallestNormalized, SNaN, "-nan", APFloat::opInvalidOp, APFloat::fcNaN },
2218 #endif
2219     { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2220     { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
2221     { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2222     { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
2223     { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
2224     { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
2225     { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal },
2226     { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }
2227   };
2228 
2229   for (size_t i = 0; i < NumTests; ++i) {
2230     APFloat x(SpecialCaseTests[i].x);
2231     APFloat y(SpecialCaseTests[i].y);
2232     APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven);
2233 
2234     APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result);
2235 
2236     EXPECT_TRUE(result.bitwiseIsEqual(x));
2237     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2238     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2239   }
2240 }
2241 
2242 TEST(APFloatTest, multiply) {
2243   // Test Special Cases against each other and normal values.
2244 
2245   // TODOS/NOTES:
2246   // 1. Since we perform only default exception handling all operations with
2247   // signaling NaNs should have a result that is a quiet NaN. Currently they
2248   // return sNaN.
2249 
2250   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
2251   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
2252   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
2253   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
2254   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
2255   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
2256   APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0");
2257   APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2258   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false);
2259   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true);
2260   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false);
2261   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true);
2262   APFloat PSmallestNormalized =
2263     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2264   APFloat MSmallestNormalized =
2265     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2266 
2267   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2268   const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2269 
2270   const unsigned NumTests = 169;
2271   struct {
2272     APFloat x;
2273     APFloat y;
2274     const char *result;
2275     int status;
2276     int category;
2277   } SpecialCaseTests[NumTests] = {
2278     { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2279     { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2280     { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2281     { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2282     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2283 #if 0
2284 // See Note 1.
2285     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2286 #endif
2287     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2288     { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2289     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2290     { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2291     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2292     { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2293     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2294     { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2295     { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2296     { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2297     { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2298     { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2299     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2300 #if 0
2301 // See Note 1.
2302     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2303 #endif
2304     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2305     { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2306     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2307     { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2308     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2309     { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2310     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2311     { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2312     { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2313     { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2314     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2315     { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2316     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2317 #if 0
2318 // See Note 1.
2319     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2320 #endif
2321     { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2322     { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2323     { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2324     { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2325     { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2326     { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2327     { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2328     { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2329     { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2330     { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2331     { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2332     { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2333     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2334 #if 0
2335 // See Note 1.
2336     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2337 #endif
2338     { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2339     { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2340     { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2341     { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2342     { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2343     { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2344     { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2345     { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2346     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
2347     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
2348     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
2349     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
2350     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2351 #if 0
2352 // See Note 1.
2353     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2354 #endif
2355     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2356     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2357     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2358     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2359     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2360     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2361     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2362     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2363 #if 0
2364 // See Note 1.
2365     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2366     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2367     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2368     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2369     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2370     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2371     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2372     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2373     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2374     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2375     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2376     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2377     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2378     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2379 #endif
2380     { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2381     { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2382     { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2383     { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2384     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2385 #if 0
2386 // See Note 1.
2387     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2388 #endif
2389     { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2390     { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2391     { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2392     { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2393     { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2394     { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2395     { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2396     { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2397     { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2398     { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2399     { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2400     { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2401     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2402 #if 0
2403 // See Note 1.
2404     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2405 #endif
2406     { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2407     { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2408     { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2409     { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2410     { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2411     { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2412     { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2413     { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2414     { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2415     { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2416     { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2417     { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2418     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2419 #if 0
2420 // See Note 1.
2421     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2422 #endif
2423     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2424     { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2425     { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2426     { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2427     { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2428     { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2429     { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2430     { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2431     { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2432     { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2433     { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2434     { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2435     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2436 #if 0
2437 // See Note 1.
2438     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2439 #endif
2440     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2441     { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2442     { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2443     { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2444     { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2445     { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2446     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2447     { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2448     { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2449     { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2450     { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2451     { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2452     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2453 #if 0
2454 // See Note 1.
2455     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2456 #endif
2457     { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2458     { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2459     { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2460     { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2461     { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2462     { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2463     { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2464     { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2465     { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2466     { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2467     { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2468     { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2469     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2470 #if 0
2471 // See Note 1.
2472     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2473 #endif
2474     { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2475     { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2476     { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2477     { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
2478     { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2479     { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2480     { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2481     { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2482     { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2483     { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2484     { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2485     { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2486     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2487 #if 0
2488 // See Note 1.
2489     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2490 #endif
2491     { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2492     { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2493     { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2494     { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2495     { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2496     { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2497     { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2498     { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2499     { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
2500     { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
2501     { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2502     { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2503     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2504 #if 0
2505 // See Note 1.
2506     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2507 #endif
2508     { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2509     { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2510     { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2511     { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
2512     { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2513     { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2514     { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2515     { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }
2516   };
2517 
2518   for (size_t i = 0; i < NumTests; ++i) {
2519     APFloat x(SpecialCaseTests[i].x);
2520     APFloat y(SpecialCaseTests[i].y);
2521     APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven);
2522 
2523     APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result);
2524 
2525     EXPECT_TRUE(result.bitwiseIsEqual(x));
2526     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2527     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2528   }
2529 }
2530 
2531 TEST(APFloatTest, divide) {
2532   // Test Special Cases against each other and normal values.
2533 
2534   // TODOS/NOTES:
2535   // 1. Since we perform only default exception handling all operations with
2536   // signaling NaNs should have a result that is a quiet NaN. Currently they
2537   // return sNaN.
2538 
2539   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
2540   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
2541   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
2542   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
2543   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
2544   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
2545   APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0");
2546   APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2547   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false);
2548   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true);
2549   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false);
2550   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true);
2551   APFloat PSmallestNormalized =
2552     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2553   APFloat MSmallestNormalized =
2554     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2555 
2556   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
2557   const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
2558 
2559   const unsigned NumTests = 169;
2560   struct {
2561     APFloat x;
2562     APFloat y;
2563     const char *result;
2564     int status;
2565     int category;
2566   } SpecialCaseTests[NumTests] = {
2567     { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2568     { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2569     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
2570     { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2571     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2572 #if 0
2573 // See Note 1.
2574     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2575 #endif
2576     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2577     { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2578     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2579     { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2580     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2581     { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2582     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2583     { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2584     { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2585     { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2586     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
2587     { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
2588     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2589 #if 0
2590 // See Note 1.
2591     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2592 #endif
2593     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2594     { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2595     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2596     { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2597     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
2598     { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
2599     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
2600     { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
2601     { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2602     { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2603     { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2604     { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2605     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2606 #if 0
2607 // See Note 1.
2608     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2609 #endif
2610     { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2611     { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2612     { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2613     { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2614     { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2615     { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2616     { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2617     { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2618     { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2619     { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2620     { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2621     { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2622     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2623 #if 0
2624 // See Note 1.
2625     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2626 #endif
2627     { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2628     { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2629     { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2630     { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2631     { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2632     { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2633     { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2634     { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2635     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
2636     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
2637     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
2638     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
2639     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2640 #if 0
2641 // See Note 1.
2642     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2643 #endif
2644     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2645     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
2646     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2647     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2648     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2649     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
2650     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2651     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
2652 #if 0
2653 // See Note 1.
2654     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2655     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2656     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2657     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2658     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2659     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2660     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2661     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2662     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2663     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2664     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2665     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2666     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2667     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2668 #endif
2669     { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2670     { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2671     { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2672     { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2673     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2674 #if 0
2675 // See Note 1.
2676     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2677 #endif
2678     { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2679     { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2680     { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2681     { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2682     { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2683     { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2684     { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2685     { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2686     { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2687     { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2688     { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2689     { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2690     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2691 #if 0
2692 // See Note 1.
2693     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2694 #endif
2695     { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2696     { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2697     { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
2698     { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
2699     { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2700     { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2701     { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
2702     { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
2703     { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2704     { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2705     { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2706     { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2707     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2708 #if 0
2709 // See Note 1.
2710     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2711 #endif
2712     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2713     { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2714     { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2715     { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2716     { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2717     { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2718     { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2719     { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2720     { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2721     { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2722     { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2723     { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2724     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2725 #if 0
2726 // See Note 1.
2727     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2728 #endif
2729     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2730     { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
2731     { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2732     { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2733     { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
2734     { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
2735     { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
2736     { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
2737     { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2738     { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2739     { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2740     { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2741     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2742 #if 0
2743 // See Note 1.
2744     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2745 #endif
2746     { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2747     { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2748     { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2749     { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2750     { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2751     { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2752     { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2753     { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2754     { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2755     { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2756     { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2757     { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2758     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2759 #if 0
2760 // See Note 1.
2761     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2762 #endif
2763     { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
2764     { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
2765     { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2766     { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2767     { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2768     { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2769     { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
2770     { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
2771     { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2772     { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2773     { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2774     { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2775     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2776 #if 0
2777 // See Note 1.
2778     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2779 #endif
2780     { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2781     { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2782     { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2783     { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2784     { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2785     { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2786     { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2787     { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2788     { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
2789     { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
2790     { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
2791     { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
2792     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
2793 #if 0
2794 // See Note 1.
2795     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
2796 #endif
2797     { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
2798     { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
2799     { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
2800     { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
2801     { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
2802     { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
2803     { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
2804     { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
2805   };
2806 
2807   for (size_t i = 0; i < NumTests; ++i) {
2808     APFloat x(SpecialCaseTests[i].x);
2809     APFloat y(SpecialCaseTests[i].y);
2810     APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven);
2811 
2812     APFloat result(APFloat::IEEEsingle(), SpecialCaseTests[i].result);
2813 
2814     EXPECT_TRUE(result.bitwiseIsEqual(x));
2815     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
2816     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
2817   }
2818 }
2819 
2820 TEST(APFloatTest, operatorOverloads) {
2821   // This is mostly testing that these operator overloads compile.
2822   APFloat One = APFloat(APFloat::IEEEsingle(), "0x1p+0");
2823   APFloat Two = APFloat(APFloat::IEEEsingle(), "0x2p+0");
2824   EXPECT_TRUE(Two.bitwiseIsEqual(One + One));
2825   EXPECT_TRUE(One.bitwiseIsEqual(Two - One));
2826   EXPECT_TRUE(Two.bitwiseIsEqual(One * Two));
2827   EXPECT_TRUE(One.bitwiseIsEqual(Two / Two));
2828 }
2829 
2830 TEST(APFloatTest, abs) {
2831   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
2832   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
2833   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
2834   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
2835   APFloat PQNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
2836   APFloat MQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true);
2837   APFloat PSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
2838   APFloat MSNaN = APFloat::getSNaN(APFloat::IEEEsingle(), true);
2839   APFloat PNormalValue = APFloat(APFloat::IEEEsingle(), "0x1p+0");
2840   APFloat MNormalValue = APFloat(APFloat::IEEEsingle(), "-0x1p+0");
2841   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), false);
2842   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle(), true);
2843   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), false);
2844   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle(), true);
2845   APFloat PSmallestNormalized =
2846     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false);
2847   APFloat MSmallestNormalized =
2848     APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true);
2849 
2850   EXPECT_TRUE(PInf.bitwiseIsEqual(abs(PInf)));
2851   EXPECT_TRUE(PInf.bitwiseIsEqual(abs(MInf)));
2852   EXPECT_TRUE(PZero.bitwiseIsEqual(abs(PZero)));
2853   EXPECT_TRUE(PZero.bitwiseIsEqual(abs(MZero)));
2854   EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(PQNaN)));
2855   EXPECT_TRUE(PQNaN.bitwiseIsEqual(abs(MQNaN)));
2856   EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(PSNaN)));
2857   EXPECT_TRUE(PSNaN.bitwiseIsEqual(abs(MSNaN)));
2858   EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(PNormalValue)));
2859   EXPECT_TRUE(PNormalValue.bitwiseIsEqual(abs(MNormalValue)));
2860   EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(PLargestValue)));
2861   EXPECT_TRUE(PLargestValue.bitwiseIsEqual(abs(MLargestValue)));
2862   EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(PSmallestValue)));
2863   EXPECT_TRUE(PSmallestValue.bitwiseIsEqual(abs(MSmallestValue)));
2864   EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(PSmallestNormalized)));
2865   EXPECT_TRUE(PSmallestNormalized.bitwiseIsEqual(abs(MSmallestNormalized)));
2866 }
2867 
2868 TEST(APFloatTest, neg) {
2869   APFloat One = APFloat(APFloat::IEEEsingle(), "1.0");
2870   APFloat NegOne = APFloat(APFloat::IEEEsingle(), "-1.0");
2871   APFloat Zero = APFloat::getZero(APFloat::IEEEsingle(), false);
2872   APFloat NegZero = APFloat::getZero(APFloat::IEEEsingle(), true);
2873   APFloat Inf = APFloat::getInf(APFloat::IEEEsingle(), false);
2874   APFloat NegInf = APFloat::getInf(APFloat::IEEEsingle(), true);
2875   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
2876   APFloat NegQNaN = APFloat::getNaN(APFloat::IEEEsingle(), true);
2877 
2878   EXPECT_TRUE(NegOne.bitwiseIsEqual(neg(One)));
2879   EXPECT_TRUE(One.bitwiseIsEqual(neg(NegOne)));
2880   EXPECT_TRUE(NegZero.bitwiseIsEqual(neg(Zero)));
2881   EXPECT_TRUE(Zero.bitwiseIsEqual(neg(NegZero)));
2882   EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf)));
2883   EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf)));
2884   EXPECT_TRUE(NegInf.bitwiseIsEqual(neg(Inf)));
2885   EXPECT_TRUE(Inf.bitwiseIsEqual(neg(NegInf)));
2886   EXPECT_TRUE(NegQNaN.bitwiseIsEqual(neg(QNaN)));
2887   EXPECT_TRUE(QNaN.bitwiseIsEqual(neg(NegQNaN)));
2888 }
2889 
2890 TEST(APFloatTest, ilogb) {
2891   EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), false)));
2892   EXPECT_EQ(-1074, ilogb(APFloat::getSmallest(APFloat::IEEEdouble(), true)));
2893   EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1024")));
2894   EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023")));
2895   EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023")));
2896   EXPECT_EQ(-51, ilogb(APFloat(APFloat::IEEEdouble(), "0x1p-51")));
2897   EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1023")));
2898   EXPECT_EQ(-2, ilogb(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1")));
2899   EXPECT_EQ(-1023, ilogb(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1023")));
2900   EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), false)));
2901   EXPECT_EQ(1023, ilogb(APFloat::getLargest(APFloat::IEEEdouble(), true)));
2902 
2903 
2904   EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+0")));
2905   EXPECT_EQ(0, ilogb(APFloat(APFloat::IEEEsingle(), "-0x1p+0")));
2906   EXPECT_EQ(42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p+42")));
2907   EXPECT_EQ(-42, ilogb(APFloat(APFloat::IEEEsingle(), "0x1p-42")));
2908 
2909   EXPECT_EQ(APFloat::IEK_Inf,
2910             ilogb(APFloat::getInf(APFloat::IEEEsingle(), false)));
2911   EXPECT_EQ(APFloat::IEK_Inf,
2912             ilogb(APFloat::getInf(APFloat::IEEEsingle(), true)));
2913   EXPECT_EQ(APFloat::IEK_Zero,
2914             ilogb(APFloat::getZero(APFloat::IEEEsingle(), false)));
2915   EXPECT_EQ(APFloat::IEK_Zero,
2916             ilogb(APFloat::getZero(APFloat::IEEEsingle(), true)));
2917   EXPECT_EQ(APFloat::IEK_NaN,
2918             ilogb(APFloat::getNaN(APFloat::IEEEsingle(), false)));
2919   EXPECT_EQ(APFloat::IEK_NaN,
2920             ilogb(APFloat::getSNaN(APFloat::IEEEsingle(), false)));
2921 
2922   EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), false)));
2923   EXPECT_EQ(127, ilogb(APFloat::getLargest(APFloat::IEEEsingle(), true)));
2924 
2925   EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), false)));
2926   EXPECT_EQ(-149, ilogb(APFloat::getSmallest(APFloat::IEEEsingle(), true)));
2927   EXPECT_EQ(-126,
2928             ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), false)));
2929   EXPECT_EQ(-126,
2930             ilogb(APFloat::getSmallestNormalized(APFloat::IEEEsingle(), true)));
2931 }
2932 
2933 TEST(APFloatTest, scalbn) {
2934 
2935   const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven;
2936   EXPECT_TRUE(
2937       APFloat(APFloat::IEEEsingle(), "0x1p+0")
2938       .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 0, RM)));
2939   EXPECT_TRUE(
2940       APFloat(APFloat::IEEEsingle(), "0x1p+42")
2941       .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 42, RM)));
2942   EXPECT_TRUE(
2943       APFloat(APFloat::IEEEsingle(), "0x1p-42")
2944       .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), -42, RM)));
2945 
2946   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle(), false);
2947   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle(), true);
2948   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle(), false);
2949   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle(), true);
2950   APFloat QPNaN = APFloat::getNaN(APFloat::IEEEsingle(), false);
2951   APFloat QMNaN = APFloat::getNaN(APFloat::IEEEsingle(), true);
2952   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle(), false);
2953 
2954   EXPECT_TRUE(PInf.bitwiseIsEqual(scalbn(PInf, 0, RM)));
2955   EXPECT_TRUE(MInf.bitwiseIsEqual(scalbn(MInf, 0, RM)));
2956   EXPECT_TRUE(PZero.bitwiseIsEqual(scalbn(PZero, 0, RM)));
2957   EXPECT_TRUE(MZero.bitwiseIsEqual(scalbn(MZero, 0, RM)));
2958   EXPECT_TRUE(QPNaN.bitwiseIsEqual(scalbn(QPNaN, 0, RM)));
2959   EXPECT_TRUE(QMNaN.bitwiseIsEqual(scalbn(QMNaN, 0, RM)));
2960   EXPECT_FALSE(scalbn(SNaN, 0, RM).isSignaling());
2961 
2962   APFloat ScalbnSNaN = scalbn(SNaN, 1, RM);
2963   EXPECT_TRUE(ScalbnSNaN.isNaN() && !ScalbnSNaN.isSignaling());
2964 
2965   // Make sure highest bit of payload is preserved.
2966   const APInt Payload(64, (UINT64_C(1) << 50) |
2967                       (UINT64_C(1) << 49) |
2968                       (UINT64_C(1234) << 32) |
2969                       1);
2970 
2971   APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false,
2972                                              &Payload);
2973   APFloat QuietPayload = scalbn(SNaNWithPayload, 1, RM);
2974   EXPECT_TRUE(QuietPayload.isNaN() && !QuietPayload.isSignaling());
2975   EXPECT_EQ(Payload, QuietPayload.bitcastToAPInt().getLoBits(51));
2976 
2977   EXPECT_TRUE(PInf.bitwiseIsEqual(
2978                 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+0"), 128, RM)));
2979   EXPECT_TRUE(MInf.bitwiseIsEqual(
2980                 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p+0"), 128, RM)));
2981   EXPECT_TRUE(PInf.bitwiseIsEqual(
2982                 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p+127"), 1, RM)));
2983   EXPECT_TRUE(PZero.bitwiseIsEqual(
2984                 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-127"), -127, RM)));
2985   EXPECT_TRUE(MZero.bitwiseIsEqual(
2986                 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -127, RM)));
2987   EXPECT_TRUE(APFloat(APFloat::IEEEsingle(), "-0x1p-149").bitwiseIsEqual(
2988                 scalbn(APFloat(APFloat::IEEEsingle(), "-0x1p-127"), -22, RM)));
2989   EXPECT_TRUE(PZero.bitwiseIsEqual(
2990                 scalbn(APFloat(APFloat::IEEEsingle(), "0x1p-126"), -24, RM)));
2991 
2992 
2993   APFloat SmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), false);
2994   APFloat NegSmallestF64 = APFloat::getSmallest(APFloat::IEEEdouble(), true);
2995 
2996   APFloat LargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), false);
2997   APFloat NegLargestF64 = APFloat::getLargest(APFloat::IEEEdouble(), true);
2998 
2999   APFloat SmallestNormalizedF64
3000     = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
3001   APFloat NegSmallestNormalizedF64
3002     = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
3003 
3004   APFloat LargestDenormalF64(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023");
3005   APFloat NegLargestDenormalF64(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023");
3006 
3007 
3008   EXPECT_TRUE(SmallestF64.bitwiseIsEqual(
3009                 scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-1074"), 0, RM)));
3010   EXPECT_TRUE(NegSmallestF64.bitwiseIsEqual(
3011                 scalbn(APFloat(APFloat::IEEEdouble(), "-0x1p-1074"), 0, RM)));
3012 
3013   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023")
3014               .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM)));
3015 
3016   EXPECT_TRUE(scalbn(SmallestF64, -2097, RM).isPosZero());
3017   EXPECT_TRUE(scalbn(SmallestF64, -2098, RM).isPosZero());
3018   EXPECT_TRUE(scalbn(SmallestF64, -2099, RM).isPosZero());
3019   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1022")
3020               .bitwiseIsEqual(scalbn(SmallestF64, 2096, RM)));
3021   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+1023")
3022               .bitwiseIsEqual(scalbn(SmallestF64, 2097, RM)));
3023   EXPECT_TRUE(scalbn(SmallestF64, 2098, RM).isInfinity());
3024   EXPECT_TRUE(scalbn(SmallestF64, 2099, RM).isInfinity());
3025 
3026   // Test for integer overflows when adding to exponent.
3027   EXPECT_TRUE(scalbn(SmallestF64, -INT_MAX, RM).isPosZero());
3028   EXPECT_TRUE(scalbn(LargestF64, INT_MAX, RM).isInfinity());
3029 
3030   EXPECT_TRUE(LargestDenormalF64
3031               .bitwiseIsEqual(scalbn(LargestDenormalF64, 0, RM)));
3032   EXPECT_TRUE(NegLargestDenormalF64
3033               .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 0, RM)));
3034 
3035   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1022")
3036               .bitwiseIsEqual(scalbn(LargestDenormalF64, 1, RM)));
3037   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1021")
3038               .bitwiseIsEqual(scalbn(NegLargestDenormalF64, 2, RM)));
3039 
3040   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1")
3041               .bitwiseIsEqual(scalbn(LargestDenormalF64, 1024, RM)));
3042   EXPECT_TRUE(scalbn(LargestDenormalF64, -1023, RM).isPosZero());
3043   EXPECT_TRUE(scalbn(LargestDenormalF64, -1024, RM).isPosZero());
3044   EXPECT_TRUE(scalbn(LargestDenormalF64, -2048, RM).isPosZero());
3045   EXPECT_TRUE(scalbn(LargestDenormalF64, 2047, RM).isInfinity());
3046   EXPECT_TRUE(scalbn(LargestDenormalF64, 2098, RM).isInfinity());
3047   EXPECT_TRUE(scalbn(LargestDenormalF64, 2099, RM).isInfinity());
3048 
3049   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-2")
3050               .bitwiseIsEqual(scalbn(LargestDenormalF64, 1021, RM)));
3051   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1")
3052               .bitwiseIsEqual(scalbn(LargestDenormalF64, 1022, RM)));
3053   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+0")
3054               .bitwiseIsEqual(scalbn(LargestDenormalF64, 1023, RM)));
3055   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep+1023")
3056               .bitwiseIsEqual(scalbn(LargestDenormalF64, 2046, RM)));
3057   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p+974")
3058               .bitwiseIsEqual(scalbn(SmallestF64, 2048, RM)));
3059 
3060   APFloat RandomDenormalF64(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51");
3061   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-972")
3062               .bitwiseIsEqual(scalbn(RandomDenormalF64, -1023, RM)));
3063   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1")
3064               .bitwiseIsEqual(scalbn(RandomDenormalF64, -52, RM)));
3065   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-2")
3066               .bitwiseIsEqual(scalbn(RandomDenormalF64, -53, RM)));
3067   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+0")
3068               .bitwiseIsEqual(scalbn(RandomDenormalF64, -51, RM)));
3069 
3070   EXPECT_TRUE(scalbn(RandomDenormalF64, -2097, RM).isPosZero());
3071   EXPECT_TRUE(scalbn(RandomDenormalF64, -2090, RM).isPosZero());
3072 
3073 
3074   EXPECT_TRUE(
3075     APFloat(APFloat::IEEEdouble(), "-0x1p-1073")
3076     .bitwiseIsEqual(scalbn(NegLargestF64, -2097, RM)));
3077 
3078   EXPECT_TRUE(
3079     APFloat(APFloat::IEEEdouble(), "-0x1p-1024")
3080     .bitwiseIsEqual(scalbn(NegLargestF64, -2048, RM)));
3081 
3082   EXPECT_TRUE(
3083     APFloat(APFloat::IEEEdouble(), "0x1p-1073")
3084     .bitwiseIsEqual(scalbn(LargestF64, -2097, RM)));
3085 
3086   EXPECT_TRUE(
3087     APFloat(APFloat::IEEEdouble(), "0x1p-1074")
3088     .bitwiseIsEqual(scalbn(LargestF64, -2098, RM)));
3089   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1074")
3090               .bitwiseIsEqual(scalbn(NegLargestF64, -2098, RM)));
3091   EXPECT_TRUE(scalbn(NegLargestF64, -2099, RM).isNegZero());
3092   EXPECT_TRUE(scalbn(LargestF64, 1, RM).isInfinity());
3093 
3094 
3095   EXPECT_TRUE(
3096     APFloat(APFloat::IEEEdouble(), "0x1p+0")
3097     .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p+52"), -52, RM)));
3098 
3099   EXPECT_TRUE(
3100     APFloat(APFloat::IEEEdouble(), "0x1p-103")
3101     .bitwiseIsEqual(scalbn(APFloat(APFloat::IEEEdouble(), "0x1p-51"), -52, RM)));
3102 }
3103 
3104 TEST(APFloatTest, frexp) {
3105   const APFloat::roundingMode RM = APFloat::rmNearestTiesToEven;
3106 
3107   APFloat PZero = APFloat::getZero(APFloat::IEEEdouble(), false);
3108   APFloat MZero = APFloat::getZero(APFloat::IEEEdouble(), true);
3109   APFloat One(1.0);
3110   APFloat MOne(-1.0);
3111   APFloat Two(2.0);
3112   APFloat MTwo(-2.0);
3113 
3114   APFloat LargestDenormal(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1023");
3115   APFloat NegLargestDenormal(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1023");
3116 
3117   APFloat Smallest = APFloat::getSmallest(APFloat::IEEEdouble(), false);
3118   APFloat NegSmallest = APFloat::getSmallest(APFloat::IEEEdouble(), true);
3119 
3120   APFloat Largest = APFloat::getLargest(APFloat::IEEEdouble(), false);
3121   APFloat NegLargest = APFloat::getLargest(APFloat::IEEEdouble(), true);
3122 
3123   APFloat PInf = APFloat::getInf(APFloat::IEEEdouble(), false);
3124   APFloat MInf = APFloat::getInf(APFloat::IEEEdouble(), true);
3125 
3126   APFloat QPNaN = APFloat::getNaN(APFloat::IEEEdouble(), false);
3127   APFloat QMNaN = APFloat::getNaN(APFloat::IEEEdouble(), true);
3128   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEdouble(), false);
3129 
3130   // Make sure highest bit of payload is preserved.
3131   const APInt Payload(64, (UINT64_C(1) << 50) |
3132                       (UINT64_C(1) << 49) |
3133                       (UINT64_C(1234) << 32) |
3134                       1);
3135 
3136   APFloat SNaNWithPayload = APFloat::getSNaN(APFloat::IEEEdouble(), false,
3137                                              &Payload);
3138 
3139   APFloat SmallestNormalized
3140     = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), false);
3141   APFloat NegSmallestNormalized
3142     = APFloat::getSmallestNormalized(APFloat::IEEEdouble(), true);
3143 
3144   int Exp;
3145   APFloat Frac(APFloat::IEEEdouble());
3146 
3147 
3148   Frac = frexp(PZero, Exp, RM);
3149   EXPECT_EQ(0, Exp);
3150   EXPECT_TRUE(Frac.isPosZero());
3151 
3152   Frac = frexp(MZero, Exp, RM);
3153   EXPECT_EQ(0, Exp);
3154   EXPECT_TRUE(Frac.isNegZero());
3155 
3156 
3157   Frac = frexp(One, Exp, RM);
3158   EXPECT_EQ(1, Exp);
3159   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac));
3160 
3161   Frac = frexp(MOne, Exp, RM);
3162   EXPECT_EQ(1, Exp);
3163   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac));
3164 
3165   Frac = frexp(LargestDenormal, Exp, RM);
3166   EXPECT_EQ(-1022, Exp);
3167   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.ffffffffffffep-1").bitwiseIsEqual(Frac));
3168 
3169   Frac = frexp(NegLargestDenormal, Exp, RM);
3170   EXPECT_EQ(-1022, Exp);
3171   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.ffffffffffffep-1").bitwiseIsEqual(Frac));
3172 
3173 
3174   Frac = frexp(Smallest, Exp, RM);
3175   EXPECT_EQ(-1073, Exp);
3176   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac));
3177 
3178   Frac = frexp(NegSmallest, Exp, RM);
3179   EXPECT_EQ(-1073, Exp);
3180   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1p-1").bitwiseIsEqual(Frac));
3181 
3182 
3183   Frac = frexp(Largest, Exp, RM);
3184   EXPECT_EQ(1024, Exp);
3185   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffffffffffffp-1").bitwiseIsEqual(Frac));
3186 
3187   Frac = frexp(NegLargest, Exp, RM);
3188   EXPECT_EQ(1024, Exp);
3189   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "-0x1.fffffffffffffp-1").bitwiseIsEqual(Frac));
3190 
3191 
3192   Frac = frexp(PInf, Exp, RM);
3193   EXPECT_EQ(INT_MAX, Exp);
3194   EXPECT_TRUE(Frac.isInfinity() && !Frac.isNegative());
3195 
3196   Frac = frexp(MInf, Exp, RM);
3197   EXPECT_EQ(INT_MAX, Exp);
3198   EXPECT_TRUE(Frac.isInfinity() && Frac.isNegative());
3199 
3200   Frac = frexp(QPNaN, Exp, RM);
3201   EXPECT_EQ(INT_MIN, Exp);
3202   EXPECT_TRUE(Frac.isNaN());
3203 
3204   Frac = frexp(QMNaN, Exp, RM);
3205   EXPECT_EQ(INT_MIN, Exp);
3206   EXPECT_TRUE(Frac.isNaN());
3207 
3208   Frac = frexp(SNaN, Exp, RM);
3209   EXPECT_EQ(INT_MIN, Exp);
3210   EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling());
3211 
3212   Frac = frexp(SNaNWithPayload, Exp, RM);
3213   EXPECT_EQ(INT_MIN, Exp);
3214   EXPECT_TRUE(Frac.isNaN() && !Frac.isSignaling());
3215   EXPECT_EQ(Payload, Frac.bitcastToAPInt().getLoBits(51));
3216 
3217   Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x0.ffffp-1"), Exp, RM);
3218   EXPECT_EQ(-1, Exp);
3219   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.fffep-1").bitwiseIsEqual(Frac));
3220 
3221   Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1p-51"), Exp, RM);
3222   EXPECT_EQ(-50, Exp);
3223   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1p-1").bitwiseIsEqual(Frac));
3224 
3225   Frac = frexp(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp+51"), Exp, RM);
3226   EXPECT_EQ(52, Exp);
3227   EXPECT_TRUE(APFloat(APFloat::IEEEdouble(), "0x1.c60f120d9f87cp-1").bitwiseIsEqual(Frac));
3228 }
3229 
3230 TEST(APFloatTest, mod) {
3231   {
3232     APFloat f1(APFloat::IEEEdouble(), "1.5");
3233     APFloat f2(APFloat::IEEEdouble(), "1.0");
3234     APFloat expected(APFloat::IEEEdouble(), "0.5");
3235     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3236     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3237   }
3238   {
3239     APFloat f1(APFloat::IEEEdouble(), "0.5");
3240     APFloat f2(APFloat::IEEEdouble(), "1.0");
3241     APFloat expected(APFloat::IEEEdouble(), "0.5");
3242     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3243     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3244   }
3245   {
3246     APFloat f1(APFloat::IEEEdouble(), "0x1.3333333333333p-2"); // 0.3
3247     APFloat f2(APFloat::IEEEdouble(), "0x1.47ae147ae147bp-7"); // 0.01
3248     APFloat expected(APFloat::IEEEdouble(),
3249                      "0x1.47ae147ae1471p-7"); // 0.009999999999999983
3250     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3251     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3252   }
3253   {
3254     APFloat f1(APFloat::IEEEdouble(), "0x1p64"); // 1.8446744073709552e19
3255     APFloat f2(APFloat::IEEEdouble(), "1.5");
3256     APFloat expected(APFloat::IEEEdouble(), "1.0");
3257     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3258     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3259   }
3260   {
3261     APFloat f1(APFloat::IEEEdouble(), "0x1p1000");
3262     APFloat f2(APFloat::IEEEdouble(), "0x1p-1000");
3263     APFloat expected(APFloat::IEEEdouble(), "0.0");
3264     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3265     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3266   }
3267   {
3268     APFloat f1(APFloat::IEEEdouble(), "0.0");
3269     APFloat f2(APFloat::IEEEdouble(), "1.0");
3270     APFloat expected(APFloat::IEEEdouble(), "0.0");
3271     EXPECT_EQ(f1.mod(f2), APFloat::opOK);
3272     EXPECT_TRUE(f1.bitwiseIsEqual(expected));
3273   }
3274   {
3275     APFloat f1(APFloat::IEEEdouble(), "1.0");
3276     APFloat f2(APFloat::IEEEdouble(), "0.0");
3277     EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp);
3278     EXPECT_TRUE(f1.isNaN());
3279   }
3280   {
3281     APFloat f1(APFloat::IEEEdouble(), "0.0");
3282     APFloat f2(APFloat::IEEEdouble(), "0.0");
3283     EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp);
3284     EXPECT_TRUE(f1.isNaN());
3285   }
3286   {
3287     APFloat f1 = APFloat::getInf(APFloat::IEEEdouble(), false);
3288     APFloat f2(APFloat::IEEEdouble(), "1.0");
3289     EXPECT_EQ(f1.mod(f2), APFloat::opInvalidOp);
3290     EXPECT_TRUE(f1.isNaN());
3291   }
3292 }
3293 
3294 TEST(APFloatTest, PPCDoubleDoubleAddSpecial) {
3295   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t,
3296                               APFloat::fltCategory, APFloat::roundingMode>;
3297   DataType Data[] = {
3298       // (1 + 0) + (-1 + 0) = fcZero
3299       std::make_tuple(0x3ff0000000000000ull, 0, 0xbff0000000000000ull, 0,
3300                       APFloat::fcZero, APFloat::rmNearestTiesToEven),
3301       // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity
3302       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3303                       0x7948000000000000ull, 0ull, APFloat::fcInfinity,
3304                       APFloat::rmNearestTiesToEven),
3305       // TODO: change the 4th 0x75effffffffffffe to 0x75efffffffffffff when
3306       // semPPCDoubleDoubleLegacy is gone.
3307       // LDBL_MAX + (1.011111... >> (1023 - 106) + (1.1111111...0 >> (1023 -
3308       // 160))) = fcNormal
3309       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3310                       0x7947ffffffffffffull, 0x75effffffffffffeull,
3311                       APFloat::fcNormal, APFloat::rmNearestTiesToEven),
3312       // LDBL_MAX + (1.1 >> (1023 - 106) + 0)) = fcInfinity
3313       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3314                       0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3315                       APFloat::fcInfinity, APFloat::rmNearestTiesToEven),
3316       // NaN + (1 + 0) = fcNaN
3317       std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0,
3318                       APFloat::fcNaN, APFloat::rmNearestTiesToEven),
3319   };
3320 
3321   for (auto Tp : Data) {
3322     uint64_t Op1[2], Op2[2];
3323     APFloat::fltCategory Expected;
3324     APFloat::roundingMode RM;
3325     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp;
3326 
3327     {
3328       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3329       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3330       A1.add(A2, RM);
3331 
3332       EXPECT_EQ(Expected, A1.getCategory())
3333           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1],
3334                      Op2[0], Op2[1])
3335                  .str();
3336     }
3337     {
3338       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3339       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3340       A2.add(A1, RM);
3341 
3342       EXPECT_EQ(Expected, A2.getCategory())
3343           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1],
3344                      Op1[0], Op1[1])
3345                  .str();
3346     }
3347   }
3348 }
3349 
3350 TEST(APFloatTest, PPCDoubleDoubleAdd) {
3351   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
3352                               uint64_t, APFloat::roundingMode>;
3353   DataType Data[] = {
3354       // (1 + 0) + (1e-105 + 0) = (1 + 1e-105)
3355       std::make_tuple(0x3ff0000000000000ull, 0, 0x3960000000000000ull, 0,
3356                       0x3ff0000000000000ull, 0x3960000000000000ull,
3357                       APFloat::rmNearestTiesToEven),
3358       // (1 + 0) + (1e-106 + 0) = (1 + 1e-106)
3359       std::make_tuple(0x3ff0000000000000ull, 0, 0x3950000000000000ull, 0,
3360                       0x3ff0000000000000ull, 0x3950000000000000ull,
3361                       APFloat::rmNearestTiesToEven),
3362       // (1 + 1e-106) + (1e-106 + 0) = (1 + 1e-105)
3363       std::make_tuple(0x3ff0000000000000ull, 0x3950000000000000ull,
3364                       0x3950000000000000ull, 0, 0x3ff0000000000000ull,
3365                       0x3960000000000000ull, APFloat::rmNearestTiesToEven),
3366       // (1 + 0) + (epsilon + 0) = (1 + epsilon)
3367       std::make_tuple(0x3ff0000000000000ull, 0, 0x0000000000000001ull, 0,
3368                       0x3ff0000000000000ull, 0x0000000000000001ull,
3369                       APFloat::rmNearestTiesToEven),
3370       // TODO: change 0xf950000000000000 to 0xf940000000000000, when
3371       // semPPCDoubleDoubleLegacy is gone.
3372       // (DBL_MAX - 1 << (1023 - 105)) + (1 << (1023 - 53) + 0) = DBL_MAX +
3373       // 1.11111... << (1023 - 52)
3374       std::make_tuple(0x7fefffffffffffffull, 0xf950000000000000ull,
3375                       0x7c90000000000000ull, 0, 0x7fefffffffffffffull,
3376                       0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven),
3377       // TODO: change 0xf950000000000000 to 0xf940000000000000, when
3378       // semPPCDoubleDoubleLegacy is gone.
3379       // (1 << (1023 - 53) + 0) + (DBL_MAX - 1 << (1023 - 105)) = DBL_MAX +
3380       // 1.11111... << (1023 - 52)
3381       std::make_tuple(0x7c90000000000000ull, 0, 0x7fefffffffffffffull,
3382                       0xf950000000000000ull, 0x7fefffffffffffffull,
3383                       0x7c8ffffffffffffeull, APFloat::rmNearestTiesToEven),
3384   };
3385 
3386   for (auto Tp : Data) {
3387     uint64_t Op1[2], Op2[2], Expected[2];
3388     APFloat::roundingMode RM;
3389     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp;
3390 
3391     {
3392       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3393       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3394       A1.add(A2, RM);
3395 
3396       EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3397           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1],
3398                      Op2[0], Op2[1])
3399                  .str();
3400       EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3401           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op1[0], Op1[1],
3402                      Op2[0], Op2[1])
3403                  .str();
3404     }
3405     {
3406       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3407       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3408       A2.add(A1, RM);
3409 
3410       EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0])
3411           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1],
3412                      Op1[0], Op1[1])
3413                  .str();
3414       EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1])
3415           << formatv("({0:x} + {1:x}) + ({2:x} + {3:x})", Op2[0], Op2[1],
3416                      Op1[0], Op1[1])
3417                  .str();
3418     }
3419   }
3420 }
3421 
3422 TEST(APFloatTest, PPCDoubleDoubleSubtract) {
3423   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
3424                               uint64_t, APFloat::roundingMode>;
3425   DataType Data[] = {
3426       // (1 + 0) - (-1e-105 + 0) = (1 + 1e-105)
3427       std::make_tuple(0x3ff0000000000000ull, 0, 0xb960000000000000ull, 0,
3428                       0x3ff0000000000000ull, 0x3960000000000000ull,
3429                       APFloat::rmNearestTiesToEven),
3430       // (1 + 0) - (-1e-106 + 0) = (1 + 1e-106)
3431       std::make_tuple(0x3ff0000000000000ull, 0, 0xb950000000000000ull, 0,
3432                       0x3ff0000000000000ull, 0x3950000000000000ull,
3433                       APFloat::rmNearestTiesToEven),
3434   };
3435 
3436   for (auto Tp : Data) {
3437     uint64_t Op1[2], Op2[2], Expected[2];
3438     APFloat::roundingMode RM;
3439     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp;
3440 
3441     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3442     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3443     A1.subtract(A2, RM);
3444 
3445     EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3446         << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0],
3447                    Op2[1])
3448                .str();
3449     EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3450         << formatv("({0:x} + {1:x}) - ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0],
3451                    Op2[1])
3452                .str();
3453   }
3454 }
3455 
3456 TEST(APFloatTest, PPCDoubleDoubleMultiplySpecial) {
3457   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t,
3458                               APFloat::fltCategory, APFloat::roundingMode>;
3459   DataType Data[] = {
3460       // fcNaN * fcNaN = fcNaN
3461       std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0,
3462                       APFloat::fcNaN, APFloat::rmNearestTiesToEven),
3463       // fcNaN * fcZero = fcNaN
3464       std::make_tuple(0x7ff8000000000000ull, 0, 0, 0, APFloat::fcNaN,
3465                       APFloat::rmNearestTiesToEven),
3466       // fcNaN * fcInfinity = fcNaN
3467       std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff0000000000000ull, 0,
3468                       APFloat::fcNaN, APFloat::rmNearestTiesToEven),
3469       // fcNaN * fcNormal = fcNaN
3470       std::make_tuple(0x7ff8000000000000ull, 0, 0x3ff0000000000000ull, 0,
3471                       APFloat::fcNaN, APFloat::rmNearestTiesToEven),
3472       // fcInfinity * fcInfinity = fcInfinity
3473       std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0,
3474                       APFloat::fcInfinity, APFloat::rmNearestTiesToEven),
3475       // fcInfinity * fcZero = fcNaN
3476       std::make_tuple(0x7ff0000000000000ull, 0, 0, 0, APFloat::fcNaN,
3477                       APFloat::rmNearestTiesToEven),
3478       // fcInfinity * fcNormal = fcInfinity
3479       std::make_tuple(0x7ff0000000000000ull, 0, 0x3ff0000000000000ull, 0,
3480                       APFloat::fcInfinity, APFloat::rmNearestTiesToEven),
3481       // fcZero * fcZero = fcZero
3482       std::make_tuple(0, 0, 0, 0, APFloat::fcZero,
3483                       APFloat::rmNearestTiesToEven),
3484       // fcZero * fcNormal = fcZero
3485       std::make_tuple(0, 0, 0x3ff0000000000000ull, 0, APFloat::fcZero,
3486                       APFloat::rmNearestTiesToEven),
3487   };
3488 
3489   for (auto Tp : Data) {
3490     uint64_t Op1[2], Op2[2];
3491     APFloat::fltCategory Expected;
3492     APFloat::roundingMode RM;
3493     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected, RM) = Tp;
3494 
3495     {
3496       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3497       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3498       A1.multiply(A2, RM);
3499 
3500       EXPECT_EQ(Expected, A1.getCategory())
3501           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1],
3502                      Op2[0], Op2[1])
3503                  .str();
3504     }
3505     {
3506       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3507       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3508       A2.multiply(A1, RM);
3509 
3510       EXPECT_EQ(Expected, A2.getCategory())
3511           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1],
3512                      Op1[0], Op1[1])
3513                  .str();
3514     }
3515   }
3516 }
3517 
3518 TEST(APFloatTest, PPCDoubleDoubleMultiply) {
3519   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
3520                               uint64_t, APFloat::roundingMode>;
3521   DataType Data[] = {
3522       // 1/3 * 3 = 1.0
3523       std::make_tuple(0x3fd5555555555555ull, 0x3c75555555555556ull,
3524                       0x4008000000000000ull, 0, 0x3ff0000000000000ull, 0,
3525                       APFloat::rmNearestTiesToEven),
3526       // (1 + epsilon) * (1 + 0) = fcZero
3527       std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull,
3528                       0x3ff0000000000000ull, 0, 0x3ff0000000000000ull,
3529                       0x0000000000000001ull, APFloat::rmNearestTiesToEven),
3530       // (1 + epsilon) * (1 + epsilon) = 1 + 2 * epsilon
3531       std::make_tuple(0x3ff0000000000000ull, 0x0000000000000001ull,
3532                       0x3ff0000000000000ull, 0x0000000000000001ull,
3533                       0x3ff0000000000000ull, 0x0000000000000002ull,
3534                       APFloat::rmNearestTiesToEven),
3535       // -(1 + epsilon) * (1 + epsilon) = -1
3536       std::make_tuple(0xbff0000000000000ull, 0x0000000000000001ull,
3537                       0x3ff0000000000000ull, 0x0000000000000001ull,
3538                       0xbff0000000000000ull, 0, APFloat::rmNearestTiesToEven),
3539       // (0.5 + 0) * (1 + 2 * epsilon) = 0.5 + epsilon
3540       std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull,
3541                       0x0000000000000002ull, 0x3fe0000000000000ull,
3542                       0x0000000000000001ull, APFloat::rmNearestTiesToEven),
3543       // (0.5 + 0) * (1 + epsilon) = 0.5
3544       std::make_tuple(0x3fe0000000000000ull, 0, 0x3ff0000000000000ull,
3545                       0x0000000000000001ull, 0x3fe0000000000000ull, 0,
3546                       APFloat::rmNearestTiesToEven),
3547       // __LDBL_MAX__ * (1 + 1 << 106) = inf
3548       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3549                       0x3ff0000000000000ull, 0x3950000000000000ull,
3550                       0x7ff0000000000000ull, 0, APFloat::rmNearestTiesToEven),
3551       // __LDBL_MAX__ * (1 + 1 << 107) > __LDBL_MAX__, but not inf, yes =_=|||
3552       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3553                       0x3ff0000000000000ull, 0x3940000000000000ull,
3554                       0x7fefffffffffffffull, 0x7c8fffffffffffffull,
3555                       APFloat::rmNearestTiesToEven),
3556       // __LDBL_MAX__ * (1 + 1 << 108) = __LDBL_MAX__
3557       std::make_tuple(0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3558                       0x3ff0000000000000ull, 0x3930000000000000ull,
3559                       0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3560                       APFloat::rmNearestTiesToEven),
3561   };
3562 
3563   for (auto Tp : Data) {
3564     uint64_t Op1[2], Op2[2], Expected[2];
3565     APFloat::roundingMode RM;
3566     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp;
3567 
3568     {
3569       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3570       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3571       A1.multiply(A2, RM);
3572 
3573       EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3574           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1],
3575                      Op2[0], Op2[1])
3576                  .str();
3577       EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3578           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op1[0], Op1[1],
3579                      Op2[0], Op2[1])
3580                  .str();
3581     }
3582     {
3583       APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3584       APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3585       A2.multiply(A1, RM);
3586 
3587       EXPECT_EQ(Expected[0], A2.bitcastToAPInt().getRawData()[0])
3588           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1],
3589                      Op1[0], Op1[1])
3590                  .str();
3591       EXPECT_EQ(Expected[1], A2.bitcastToAPInt().getRawData()[1])
3592           << formatv("({0:x} + {1:x}) * ({2:x} + {3:x})", Op2[0], Op2[1],
3593                      Op1[0], Op1[1])
3594                  .str();
3595     }
3596   }
3597 }
3598 
3599 TEST(APFloatTest, PPCDoubleDoubleDivide) {
3600   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t,
3601                               uint64_t, APFloat::roundingMode>;
3602   // TODO: Only a sanity check for now. Add more edge cases when the
3603   // double-double algorithm is implemented.
3604   DataType Data[] = {
3605       // 1 / 3 = 1/3
3606       std::make_tuple(0x3ff0000000000000ull, 0, 0x4008000000000000ull, 0,
3607                       0x3fd5555555555555ull, 0x3c75555555555556ull,
3608                       APFloat::rmNearestTiesToEven),
3609   };
3610 
3611   for (auto Tp : Data) {
3612     uint64_t Op1[2], Op2[2], Expected[2];
3613     APFloat::roundingMode RM;
3614     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1], RM) = Tp;
3615 
3616     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3617     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3618     A1.divide(A2, RM);
3619 
3620     EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3621         << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0],
3622                    Op2[1])
3623                .str();
3624     EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3625         << formatv("({0:x} + {1:x}) / ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0],
3626                    Op2[1])
3627                .str();
3628   }
3629 }
3630 
3631 TEST(APFloatTest, PPCDoubleDoubleRemainder) {
3632   using DataType =
3633       std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>;
3634   DataType Data[] = {
3635       // remainder(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53)
3636       std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull,
3637                       0x3ff4000000000000ull, 0x3ca4000000000000ull,
3638                       0x3fe0000000000000ull, 0x3c90000000000000ull),
3639       // remainder(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (-0.5 - 0.5 << 53)
3640       std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull,
3641                       0x3ffc000000000000ull, 0x3cac000000000000ull,
3642                       0xbfe0000000000000ull, 0xbc90000000000000ull),
3643   };
3644 
3645   for (auto Tp : Data) {
3646     uint64_t Op1[2], Op2[2], Expected[2];
3647     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp;
3648 
3649     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3650     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3651     A1.remainder(A2);
3652 
3653     EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3654         << formatv("remainder({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1],
3655                    Op2[0], Op2[1])
3656                .str();
3657     EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3658         << formatv("remainder(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0],
3659                    Op1[1], Op2[0], Op2[1])
3660                .str();
3661   }
3662 }
3663 
3664 TEST(APFloatTest, PPCDoubleDoubleMod) {
3665   using DataType =
3666       std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>;
3667   DataType Data[] = {
3668       // mod(3.0 + 3.0 << 53, 1.25 + 1.25 << 53) = (0.5 + 0.5 << 53)
3669       std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull,
3670                       0x3ff4000000000000ull, 0x3ca4000000000000ull,
3671                       0x3fe0000000000000ull, 0x3c90000000000000ull),
3672       // mod(3.0 + 3.0 << 53, 1.75 + 1.75 << 53) = (1.25 + 1.25 << 53)
3673       // 0xbc98000000000000 doesn't seem right, but it's what we currently have.
3674       // TODO: investigate
3675       std::make_tuple(0x4008000000000000ull, 0x3cb8000000000000ull,
3676                       0x3ffc000000000000ull, 0x3cac000000000000ull,
3677                       0x3ff4000000000001ull, 0xbc98000000000000ull),
3678   };
3679 
3680   for (auto Tp : Data) {
3681     uint64_t Op1[2], Op2[2], Expected[2];
3682     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected[0], Expected[1]) = Tp;
3683 
3684     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3685     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3686     A1.mod(A2);
3687 
3688     EXPECT_EQ(Expected[0], A1.bitcastToAPInt().getRawData()[0])
3689         << formatv("fmod(({0:x} + {1:x}),  ({2:x} + {3:x}))", Op1[0], Op1[1],
3690                    Op2[0], Op2[1])
3691                .str();
3692     EXPECT_EQ(Expected[1], A1.bitcastToAPInt().getRawData()[1])
3693         << formatv("fmod(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1],
3694                    Op2[0], Op2[1])
3695                .str();
3696   }
3697 }
3698 
3699 TEST(APFloatTest, PPCDoubleDoubleFMA) {
3700   // Sanity check for now.
3701   APFloat A(APFloat::PPCDoubleDouble(), "2");
3702   A.fusedMultiplyAdd(APFloat(APFloat::PPCDoubleDouble(), "3"),
3703                      APFloat(APFloat::PPCDoubleDouble(), "4"),
3704                      APFloat::rmNearestTiesToEven);
3705   EXPECT_EQ(APFloat::cmpEqual,
3706             APFloat(APFloat::PPCDoubleDouble(), "10").compare(A));
3707 }
3708 
3709 TEST(APFloatTest, PPCDoubleDoubleRoundToIntegral) {
3710   {
3711     APFloat A(APFloat::PPCDoubleDouble(), "1.5");
3712     A.roundToIntegral(APFloat::rmNearestTiesToEven);
3713     EXPECT_EQ(APFloat::cmpEqual,
3714               APFloat(APFloat::PPCDoubleDouble(), "2").compare(A));
3715   }
3716   {
3717     APFloat A(APFloat::PPCDoubleDouble(), "2.5");
3718     A.roundToIntegral(APFloat::rmNearestTiesToEven);
3719     EXPECT_EQ(APFloat::cmpEqual,
3720               APFloat(APFloat::PPCDoubleDouble(), "2").compare(A));
3721   }
3722 }
3723 
3724 TEST(APFloatTest, PPCDoubleDoubleCompare) {
3725   using DataType =
3726       std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, APFloat::cmpResult>;
3727 
3728   DataType Data[] = {
3729       // (1 + 0) = (1 + 0)
3730       std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0,
3731                       APFloat::cmpEqual),
3732       // (1 + 0) < (1.00...1 + 0)
3733       std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0,
3734                       APFloat::cmpLessThan),
3735       // (1.00...1 + 0) > (1 + 0)
3736       std::make_tuple(0x3ff0000000000001ull, 0, 0x3ff0000000000000ull, 0,
3737                       APFloat::cmpGreaterThan),
3738       // (1 + 0) < (1 + epsilon)
3739       std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull,
3740                       0x0000000000000001ull, APFloat::cmpLessThan),
3741       // NaN != NaN
3742       std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0,
3743                       APFloat::cmpUnordered),
3744       // (1 + 0) != NaN
3745       std::make_tuple(0x3ff0000000000000ull, 0, 0x7ff8000000000000ull, 0,
3746                       APFloat::cmpUnordered),
3747       // Inf = Inf
3748       std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0,
3749                       APFloat::cmpEqual),
3750   };
3751 
3752   for (auto Tp : Data) {
3753     uint64_t Op1[2], Op2[2];
3754     APFloat::cmpResult Expected;
3755     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp;
3756 
3757     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3758     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3759     EXPECT_EQ(Expected, A1.compare(A2))
3760         << formatv("compare(({0:x} + {1:x}), ({2:x} + {3:x}))", Op1[0], Op1[1],
3761                    Op2[0], Op2[1])
3762                .str();
3763   }
3764 }
3765 
3766 TEST(APFloatTest, PPCDoubleDoubleBitwiseIsEqual) {
3767   using DataType = std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, bool>;
3768 
3769   DataType Data[] = {
3770       // (1 + 0) = (1 + 0)
3771       std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000000ull, 0, true),
3772       // (1 + 0) != (1.00...1 + 0)
3773       std::make_tuple(0x3ff0000000000000ull, 0, 0x3ff0000000000001ull, 0,
3774                       false),
3775       // NaN = NaN
3776       std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull, 0, true),
3777       // NaN != NaN with a different bit pattern
3778       std::make_tuple(0x7ff8000000000000ull, 0, 0x7ff8000000000000ull,
3779                       0x3ff0000000000000ull, false),
3780       // Inf = Inf
3781       std::make_tuple(0x7ff0000000000000ull, 0, 0x7ff0000000000000ull, 0, true),
3782   };
3783 
3784   for (auto Tp : Data) {
3785     uint64_t Op1[2], Op2[2];
3786     bool Expected;
3787     std::tie(Op1[0], Op1[1], Op2[0], Op2[1], Expected) = Tp;
3788 
3789     APFloat A1(APFloat::PPCDoubleDouble(), APInt(128, 2, Op1));
3790     APFloat A2(APFloat::PPCDoubleDouble(), APInt(128, 2, Op2));
3791     EXPECT_EQ(Expected, A1.bitwiseIsEqual(A2))
3792         << formatv("({0:x} + {1:x}) = ({2:x} + {3:x})", Op1[0], Op1[1], Op2[0],
3793                    Op2[1])
3794                .str();
3795   }
3796 }
3797 
3798 TEST(APFloatTest, PPCDoubleDoubleHashValue) {
3799   uint64_t Data1[] = {0x3ff0000000000001ull, 0x0000000000000001ull};
3800   uint64_t Data2[] = {0x3ff0000000000001ull, 0};
3801   // The hash values are *hopefully* different.
3802   EXPECT_NE(
3803       hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data1))),
3804       hash_value(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data2))));
3805 }
3806 
3807 TEST(APFloatTest, PPCDoubleDoubleChangeSign) {
3808   uint64_t Data[] = {
3809       0x400f000000000000ull, 0xbcb0000000000000ull,
3810   };
3811   APFloat Float(APFloat::PPCDoubleDouble(), APInt(128, 2, Data));
3812   {
3813     APFloat Actual =
3814         APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "1"));
3815     EXPECT_EQ(0x400f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]);
3816     EXPECT_EQ(0xbcb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]);
3817   }
3818   {
3819     APFloat Actual =
3820         APFloat::copySign(Float, APFloat(APFloat::IEEEdouble(), "-1"));
3821     EXPECT_EQ(0xc00f000000000000ull, Actual.bitcastToAPInt().getRawData()[0]);
3822     EXPECT_EQ(0x3cb0000000000000ull, Actual.bitcastToAPInt().getRawData()[1]);
3823   }
3824 }
3825 
3826 TEST(APFloatTest, PPCDoubleDoubleFactories) {
3827   {
3828     uint64_t Data[] = {
3829         0, 0,
3830     };
3831     EXPECT_EQ(APInt(128, 2, Data),
3832               APFloat::getZero(APFloat::PPCDoubleDouble()).bitcastToAPInt());
3833   }
3834   {
3835     uint64_t Data[] = {
3836         0x7fefffffffffffffull, 0x7c8ffffffffffffeull,
3837     };
3838     EXPECT_EQ(APInt(128, 2, Data),
3839               APFloat::getLargest(APFloat::PPCDoubleDouble()).bitcastToAPInt());
3840   }
3841   {
3842     uint64_t Data[] = {
3843         0x0000000000000001ull, 0,
3844     };
3845     EXPECT_EQ(
3846         APInt(128, 2, Data),
3847         APFloat::getSmallest(APFloat::PPCDoubleDouble()).bitcastToAPInt());
3848   }
3849   {
3850     uint64_t Data[] = {0x0360000000000000ull, 0};
3851     EXPECT_EQ(APInt(128, 2, Data),
3852               APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble())
3853                   .bitcastToAPInt());
3854   }
3855   {
3856     uint64_t Data[] = {
3857         0x8000000000000000ull, 0x0000000000000000ull,
3858     };
3859     EXPECT_EQ(
3860         APInt(128, 2, Data),
3861         APFloat::getZero(APFloat::PPCDoubleDouble(), true).bitcastToAPInt());
3862   }
3863   {
3864     uint64_t Data[] = {
3865         0xffefffffffffffffull, 0xfc8ffffffffffffeull,
3866     };
3867     EXPECT_EQ(
3868         APInt(128, 2, Data),
3869         APFloat::getLargest(APFloat::PPCDoubleDouble(), true).bitcastToAPInt());
3870   }
3871   {
3872     uint64_t Data[] = {
3873         0x8000000000000001ull, 0x0000000000000000ull,
3874     };
3875     EXPECT_EQ(APInt(128, 2, Data),
3876               APFloat::getSmallest(APFloat::PPCDoubleDouble(), true)
3877                   .bitcastToAPInt());
3878   }
3879   {
3880     uint64_t Data[] = {
3881         0x8360000000000000ull, 0x0000000000000000ull,
3882     };
3883     EXPECT_EQ(APInt(128, 2, Data),
3884               APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble(), true)
3885                   .bitcastToAPInt());
3886   }
3887   EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isSmallest());
3888   EXPECT_TRUE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isLargest());
3889 }
3890 
3891 TEST(APFloatTest, PPCDoubleDoubleIsDenormal) {
3892   EXPECT_TRUE(APFloat::getSmallest(APFloat::PPCDoubleDouble()).isDenormal());
3893   EXPECT_FALSE(APFloat::getLargest(APFloat::PPCDoubleDouble()).isDenormal());
3894   EXPECT_FALSE(
3895       APFloat::getSmallestNormalized(APFloat::PPCDoubleDouble()).isDenormal());
3896   {
3897     // (4 + 3) is not normalized
3898     uint64_t Data[] = {
3899         0x4010000000000000ull, 0x4008000000000000ull,
3900     };
3901     EXPECT_TRUE(
3902         APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Data)).isDenormal());
3903   }
3904 }
3905 
3906 TEST(APFloatTest, PPCDoubleDoubleScalbn) {
3907   // 3.0 + 3.0 << 53
3908   uint64_t Input[] = {
3909       0x4008000000000000ull, 0x3cb8000000000000ull,
3910   };
3911   APFloat Result =
3912       scalbn(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), 1,
3913              APFloat::rmNearestTiesToEven);
3914   // 6.0 + 6.0 << 53
3915   EXPECT_EQ(0x4018000000000000ull, Result.bitcastToAPInt().getRawData()[0]);
3916   EXPECT_EQ(0x3cc8000000000000ull, Result.bitcastToAPInt().getRawData()[1]);
3917 }
3918 
3919 TEST(APFloatTest, PPCDoubleDoubleFrexp) {
3920   // 3.0 + 3.0 << 53
3921   uint64_t Input[] = {
3922       0x4008000000000000ull, 0x3cb8000000000000ull,
3923   };
3924   int Exp;
3925   // 0.75 + 0.75 << 53
3926   APFloat Result =
3927       frexp(APFloat(APFloat::PPCDoubleDouble(), APInt(128, 2, Input)), Exp,
3928             APFloat::rmNearestTiesToEven);
3929   EXPECT_EQ(2, Exp);
3930   EXPECT_EQ(0x3fe8000000000000ull, Result.bitcastToAPInt().getRawData()[0]);
3931   EXPECT_EQ(0x3c98000000000000ull, Result.bitcastToAPInt().getRawData()[1]);
3932 }
3933 }
3934