Home | History | Annotate | Download | only in ADT
      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/SmallString.h"
     13 #include "llvm/ADT/SmallVector.h"
     14 #include "llvm/Support/raw_ostream.h"
     15 #include "gtest/gtest.h"
     16 #include <ostream>
     17 #include <string>
     18 
     19 using namespace llvm;
     20 
     21 static double convertToDoubleFromString(const char *Str) {
     22   llvm::APFloat F(0.0);
     23   F.convertFromString(Str, llvm::APFloat::rmNearestTiesToEven);
     24   return F.convertToDouble();
     25 }
     26 
     27 static std::string convertToString(double d, unsigned Prec, unsigned Pad) {
     28   llvm::SmallVector<char, 100> Buffer;
     29   llvm::APFloat F(d);
     30   F.toString(Buffer, Prec, Pad);
     31   return std::string(Buffer.data(), Buffer.size());
     32 }
     33 
     34 namespace {
     35 
     36 TEST(APFloatTest, isSignaling) {
     37   // We test qNaN, -qNaN, +sNaN, -sNaN with and without payloads. *NOTE* The
     38   // positive/negative distinction is included only since the getQNaN/getSNaN
     39   // API provides the option.
     40   APInt payload = APInt::getOneBitSet(4, 2);
     41   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false).isSignaling());
     42   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true).isSignaling());
     43   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
     44   EXPECT_FALSE(APFloat::getQNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
     45   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isSignaling());
     46   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isSignaling());
     47   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false, &payload).isSignaling());
     48   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true, &payload).isSignaling());
     49 }
     50 
     51 TEST(APFloatTest, next) {
     52 
     53   APFloat test(APFloat::IEEEquad, APFloat::uninitialized);
     54   APFloat expected(APFloat::IEEEquad, APFloat::uninitialized);
     55 
     56   // 1. Test Special Cases Values.
     57   //
     58   // Test all special values for nextUp and nextDown perscribed by IEEE-754R
     59   // 2008. These are:
     60   //   1.  +inf
     61   //   2.  -inf
     62   //   3.  getLargest()
     63   //   4.  -getLargest()
     64   //   5.  getSmallest()
     65   //   6.  -getSmallest()
     66   //   7.  qNaN
     67   //   8.  sNaN
     68   //   9.  +0
     69   //   10. -0
     70 
     71   // nextUp(+inf) = +inf.
     72   test = APFloat::getInf(APFloat::IEEEquad, false);
     73   expected = APFloat::getInf(APFloat::IEEEquad, false);
     74   EXPECT_EQ(test.next(false), APFloat::opOK);
     75   EXPECT_TRUE(test.isInfinity());
     76   EXPECT_TRUE(!test.isNegative());
     77   EXPECT_TRUE(test.bitwiseIsEqual(expected));
     78 
     79   // nextDown(+inf) = -nextUp(-inf) = -(-getLargest()) = getLargest()
     80   test = APFloat::getInf(APFloat::IEEEquad, false);
     81   expected = APFloat::getLargest(APFloat::IEEEquad, false);
     82   EXPECT_EQ(test.next(true), APFloat::opOK);
     83   EXPECT_TRUE(!test.isNegative());
     84   EXPECT_TRUE(test.bitwiseIsEqual(expected));
     85 
     86   // nextUp(-inf) = -getLargest()
     87   test = APFloat::getInf(APFloat::IEEEquad, true);
     88   expected = APFloat::getLargest(APFloat::IEEEquad, true);
     89   EXPECT_EQ(test.next(false), APFloat::opOK);
     90   EXPECT_TRUE(test.isNegative());
     91   EXPECT_TRUE(test.bitwiseIsEqual(expected));
     92 
     93   // nextDown(-inf) = -nextUp(+inf) = -(+inf) = -inf.
     94   test = APFloat::getInf(APFloat::IEEEquad, true);
     95   expected = APFloat::getInf(APFloat::IEEEquad, true);
     96   EXPECT_EQ(test.next(true), APFloat::opOK);
     97   EXPECT_TRUE(test.isInfinity() && test.isNegative());
     98   EXPECT_TRUE(test.bitwiseIsEqual(expected));
     99 
    100   // nextUp(getLargest()) = +inf
    101   test = APFloat::getLargest(APFloat::IEEEquad, false);
    102   expected = APFloat::getInf(APFloat::IEEEquad, false);
    103   EXPECT_EQ(test.next(false), APFloat::opOK);
    104   EXPECT_TRUE(test.isInfinity() && !test.isNegative());
    105   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    106 
    107   // nextDown(getLargest()) = -nextUp(-getLargest())
    108   //                        = -(-getLargest() + inc)
    109   //                        = getLargest() - inc.
    110   test = APFloat::getLargest(APFloat::IEEEquad, false);
    111   expected = APFloat(APFloat::IEEEquad,
    112                      "0x1.fffffffffffffffffffffffffffep+16383");
    113   EXPECT_EQ(test.next(true), APFloat::opOK);
    114   EXPECT_TRUE(!test.isInfinity() && !test.isNegative());
    115   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    116 
    117   // nextUp(-getLargest()) = -getLargest() + inc.
    118   test = APFloat::getLargest(APFloat::IEEEquad, true);
    119   expected = APFloat(APFloat::IEEEquad,
    120                      "-0x1.fffffffffffffffffffffffffffep+16383");
    121   EXPECT_EQ(test.next(false), APFloat::opOK);
    122   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    123 
    124   // nextDown(-getLargest()) = -nextUp(getLargest()) = -(inf) = -inf.
    125   test = APFloat::getLargest(APFloat::IEEEquad, true);
    126   expected = APFloat::getInf(APFloat::IEEEquad, true);
    127   EXPECT_EQ(test.next(true), APFloat::opOK);
    128   EXPECT_TRUE(test.isInfinity() && test.isNegative());
    129   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    130 
    131   // nextUp(getSmallest()) = getSmallest() + inc.
    132   test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
    133   expected = APFloat(APFloat::IEEEquad,
    134                      "0x0.0000000000000000000000000002p-16382");
    135   EXPECT_EQ(test.next(false), APFloat::opOK);
    136   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    137 
    138   // nextDown(getSmallest()) = -nextUp(-getSmallest()) = -(-0) = +0.
    139   test = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
    140   expected = APFloat::getZero(APFloat::IEEEquad, false);
    141   EXPECT_EQ(test.next(true), APFloat::opOK);
    142   EXPECT_TRUE(test.isZero() && !test.isNegative());
    143   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    144 
    145   // nextUp(-getSmallest()) = -0.
    146   test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
    147   expected = APFloat::getZero(APFloat::IEEEquad, true);
    148   EXPECT_EQ(test.next(false), APFloat::opOK);
    149   EXPECT_TRUE(test.isZero() && test.isNegative());
    150   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    151 
    152   // nextDown(-getSmallest()) = -nextUp(getSmallest()) = -getSmallest() - inc.
    153   test = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
    154   expected = APFloat(APFloat::IEEEquad,
    155                      "-0x0.0000000000000000000000000002p-16382");
    156   EXPECT_EQ(test.next(true), APFloat::opOK);
    157   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    158 
    159   // nextUp(qNaN) = qNaN
    160   test = APFloat::getQNaN(APFloat::IEEEquad, false);
    161   expected = APFloat::getQNaN(APFloat::IEEEquad, false);
    162   EXPECT_EQ(test.next(false), APFloat::opOK);
    163   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    164 
    165   // nextDown(qNaN) = qNaN
    166   test = APFloat::getQNaN(APFloat::IEEEquad, false);
    167   expected = APFloat::getQNaN(APFloat::IEEEquad, false);
    168   EXPECT_EQ(test.next(true), APFloat::opOK);
    169   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    170 
    171   // nextUp(sNaN) = qNaN
    172   test = APFloat::getSNaN(APFloat::IEEEquad, false);
    173   expected = APFloat::getQNaN(APFloat::IEEEquad, false);
    174   EXPECT_EQ(test.next(false), APFloat::opInvalidOp);
    175   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    176 
    177   // nextDown(sNaN) = qNaN
    178   test = APFloat::getSNaN(APFloat::IEEEquad, false);
    179   expected = APFloat::getQNaN(APFloat::IEEEquad, false);
    180   EXPECT_EQ(test.next(true), APFloat::opInvalidOp);
    181   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    182 
    183   // nextUp(+0) = +getSmallest()
    184   test = APFloat::getZero(APFloat::IEEEquad, false);
    185   expected = APFloat::getSmallest(APFloat::IEEEquad, false);
    186   EXPECT_EQ(test.next(false), APFloat::opOK);
    187   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    188 
    189   // nextDown(+0) = -nextUp(-0) = -getSmallest()
    190   test = APFloat::getZero(APFloat::IEEEquad, false);
    191   expected = APFloat::getSmallest(APFloat::IEEEquad, true);
    192   EXPECT_EQ(test.next(true), APFloat::opOK);
    193   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    194 
    195   // nextUp(-0) = +getSmallest()
    196   test = APFloat::getZero(APFloat::IEEEquad, true);
    197   expected = APFloat::getSmallest(APFloat::IEEEquad, false);
    198   EXPECT_EQ(test.next(false), APFloat::opOK);
    199   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    200 
    201   // nextDown(-0) = -nextUp(0) = -getSmallest()
    202   test = APFloat::getZero(APFloat::IEEEquad, true);
    203   expected = APFloat::getSmallest(APFloat::IEEEquad, true);
    204   EXPECT_EQ(test.next(true), APFloat::opOK);
    205   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    206 
    207   // 2. Binade Boundary Tests.
    208 
    209   // 2a. Test denormal <-> normal binade boundaries.
    210   //     * nextUp(+Largest Denormal) -> +Smallest Normal.
    211   //     * nextDown(-Largest Denormal) -> -Smallest Normal.
    212   //     * nextUp(-Smallest Normal) -> -Largest Denormal.
    213   //     * nextDown(+Smallest Normal) -> +Largest Denormal.
    214 
    215   // nextUp(+Largest Denormal) -> +Smallest Normal.
    216   test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
    217   expected = APFloat(APFloat::IEEEquad,
    218                      "0x1.0000000000000000000000000000p-16382");
    219   EXPECT_EQ(test.next(false), APFloat::opOK);
    220   EXPECT_FALSE(test.isDenormal());
    221   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    222 
    223   // nextDown(-Largest Denormal) -> -Smallest Normal.
    224   test = APFloat(APFloat::IEEEquad,
    225                  "-0x0.ffffffffffffffffffffffffffffp-16382");
    226   expected = APFloat(APFloat::IEEEquad,
    227                      "-0x1.0000000000000000000000000000p-16382");
    228   EXPECT_EQ(test.next(true), APFloat::opOK);
    229   EXPECT_FALSE(test.isDenormal());
    230   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    231 
    232   // nextUp(-Smallest Normal) -> -LargestDenormal.
    233   test = APFloat(APFloat::IEEEquad,
    234                  "-0x1.0000000000000000000000000000p-16382");
    235   expected = APFloat(APFloat::IEEEquad,
    236                      "-0x0.ffffffffffffffffffffffffffffp-16382");
    237   EXPECT_EQ(test.next(false), APFloat::opOK);
    238   EXPECT_TRUE(test.isDenormal());
    239   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    240 
    241   // nextDown(+Smallest Normal) -> +Largest Denormal.
    242   test = APFloat(APFloat::IEEEquad,
    243                  "+0x1.0000000000000000000000000000p-16382");
    244   expected = APFloat(APFloat::IEEEquad,
    245                      "+0x0.ffffffffffffffffffffffffffffp-16382");
    246   EXPECT_EQ(test.next(true), APFloat::opOK);
    247   EXPECT_TRUE(test.isDenormal());
    248   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    249 
    250   // 2b. Test normal <-> normal binade boundaries.
    251   //     * nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
    252   //     * nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
    253   //     * nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
    254   //     * nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
    255 
    256   // nextUp(-Normal Binade Boundary) -> -Normal Binade Boundary + 1.
    257   test = APFloat(APFloat::IEEEquad, "-0x1p+1");
    258   expected = APFloat(APFloat::IEEEquad,
    259                      "-0x1.ffffffffffffffffffffffffffffp+0");
    260   EXPECT_EQ(test.next(false), APFloat::opOK);
    261   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    262 
    263   // nextDown(+Normal Binade Boundary) -> +Normal Binade Boundary - 1.
    264   test = APFloat(APFloat::IEEEquad, "0x1p+1");
    265   expected = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
    266   EXPECT_EQ(test.next(true), APFloat::opOK);
    267   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    268 
    269   // nextUp(+Normal Binade Boundary - 1) -> +Normal Binade Boundary.
    270   test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp+0");
    271   expected = APFloat(APFloat::IEEEquad, "0x1p+1");
    272   EXPECT_EQ(test.next(false), APFloat::opOK);
    273   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    274 
    275   // nextDown(-Normal Binade Boundary + 1) -> -Normal Binade Boundary.
    276   test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp+0");
    277   expected = APFloat(APFloat::IEEEquad, "-0x1p+1");
    278   EXPECT_EQ(test.next(true), APFloat::opOK);
    279   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    280 
    281   // 2c. Test using next at binade boundaries with a direction away from the
    282   // binade boundary. Away from denormal <-> normal boundaries.
    283   //
    284   // This is to make sure that even though we are at a binade boundary, since
    285   // we are rounding away, we do not trigger the binade boundary code. Thus we
    286   // test:
    287   //   * nextUp(-Largest Denormal) -> -Largest Denormal + inc.
    288   //   * nextDown(+Largest Denormal) -> +Largest Denormal - inc.
    289   //   * nextUp(+Smallest Normal) -> +Smallest Normal + inc.
    290   //   * nextDown(-Smallest Normal) -> -Smallest Normal - inc.
    291 
    292   // nextUp(-Largest Denormal) -> -Largest Denormal + inc.
    293   test = APFloat(APFloat::IEEEquad, "-0x0.ffffffffffffffffffffffffffffp-16382");
    294   expected = APFloat(APFloat::IEEEquad,
    295                      "-0x0.fffffffffffffffffffffffffffep-16382");
    296   EXPECT_EQ(test.next(false), APFloat::opOK);
    297   EXPECT_TRUE(test.isDenormal());
    298   EXPECT_TRUE(test.isNegative());
    299   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    300 
    301   // nextDown(+Largest Denormal) -> +Largest Denormal - inc.
    302   test = APFloat(APFloat::IEEEquad, "0x0.ffffffffffffffffffffffffffffp-16382");
    303   expected = APFloat(APFloat::IEEEquad,
    304                      "0x0.fffffffffffffffffffffffffffep-16382");
    305   EXPECT_EQ(test.next(true), APFloat::opOK);
    306   EXPECT_TRUE(test.isDenormal());
    307   EXPECT_TRUE(!test.isNegative());
    308   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    309 
    310   // nextUp(+Smallest Normal) -> +Smallest Normal + inc.
    311   test = APFloat(APFloat::IEEEquad, "0x1.0000000000000000000000000000p-16382");
    312   expected = APFloat(APFloat::IEEEquad,
    313                      "0x1.0000000000000000000000000001p-16382");
    314   EXPECT_EQ(test.next(false), APFloat::opOK);
    315   EXPECT_TRUE(!test.isDenormal());
    316   EXPECT_TRUE(!test.isNegative());
    317   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    318 
    319   // nextDown(-Smallest Normal) -> -Smallest Normal - inc.
    320   test = APFloat(APFloat::IEEEquad, "-0x1.0000000000000000000000000000p-16382");
    321   expected = APFloat(APFloat::IEEEquad,
    322                      "-0x1.0000000000000000000000000001p-16382");
    323   EXPECT_EQ(test.next(true), APFloat::opOK);
    324   EXPECT_TRUE(!test.isDenormal());
    325   EXPECT_TRUE(test.isNegative());
    326   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    327 
    328   // 2d. Test values which cause our exponent to go to min exponent. This
    329   // is to ensure that guards in the code to check for min exponent
    330   // trigger properly.
    331   //     * nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
    332   //     * nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
    333   //         -0x1p-16381
    334   //     * nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16382
    335   //     * nextDown(0x1p-16382) -> 0x1.ffffffffffffffffffffffffffffp-16382
    336 
    337   // nextUp(-0x1p-16381) -> -0x1.ffffffffffffffffffffffffffffp-16382
    338   test = APFloat(APFloat::IEEEquad, "-0x1p-16381");
    339   expected = APFloat(APFloat::IEEEquad,
    340                      "-0x1.ffffffffffffffffffffffffffffp-16382");
    341   EXPECT_EQ(test.next(false), APFloat::opOK);
    342   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    343 
    344   // nextDown(-0x1.ffffffffffffffffffffffffffffp-16382) ->
    345   //         -0x1p-16381
    346   test = APFloat(APFloat::IEEEquad, "-0x1.ffffffffffffffffffffffffffffp-16382");
    347   expected = APFloat(APFloat::IEEEquad, "-0x1p-16381");
    348   EXPECT_EQ(test.next(true), APFloat::opOK);
    349   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    350 
    351   // nextUp(0x1.ffffffffffffffffffffffffffffp-16382) -> 0x1p-16381
    352   test = APFloat(APFloat::IEEEquad, "0x1.ffffffffffffffffffffffffffffp-16382");
    353   expected = APFloat(APFloat::IEEEquad, "0x1p-16381");
    354   EXPECT_EQ(test.next(false), APFloat::opOK);
    355   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    356 
    357   // nextDown(0x1p-16381) -> 0x1.ffffffffffffffffffffffffffffp-16382
    358   test = APFloat(APFloat::IEEEquad, "0x1p-16381");
    359   expected = APFloat(APFloat::IEEEquad,
    360                      "0x1.ffffffffffffffffffffffffffffp-16382");
    361   EXPECT_EQ(test.next(true), APFloat::opOK);
    362   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    363 
    364   // 3. Now we test both denormal/normal computation which will not cause us
    365   // to go across binade boundaries. Specifically we test:
    366   //   * nextUp(+Denormal) -> +Denormal.
    367   //   * nextDown(+Denormal) -> +Denormal.
    368   //   * nextUp(-Denormal) -> -Denormal.
    369   //   * nextDown(-Denormal) -> -Denormal.
    370   //   * nextUp(+Normal) -> +Normal.
    371   //   * nextDown(+Normal) -> +Normal.
    372   //   * nextUp(-Normal) -> -Normal.
    373   //   * nextDown(-Normal) -> -Normal.
    374 
    375   // nextUp(+Denormal) -> +Denormal.
    376   test = APFloat(APFloat::IEEEquad,
    377                  "0x0.ffffffffffffffffffffffff000cp-16382");
    378   expected = APFloat(APFloat::IEEEquad,
    379                  "0x0.ffffffffffffffffffffffff000dp-16382");
    380   EXPECT_EQ(test.next(false), APFloat::opOK);
    381   EXPECT_TRUE(test.isDenormal());
    382   EXPECT_TRUE(!test.isNegative());
    383   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    384 
    385   // nextDown(+Denormal) -> +Denormal.
    386   test = APFloat(APFloat::IEEEquad,
    387                  "0x0.ffffffffffffffffffffffff000cp-16382");
    388   expected = APFloat(APFloat::IEEEquad,
    389                  "0x0.ffffffffffffffffffffffff000bp-16382");
    390   EXPECT_EQ(test.next(true), APFloat::opOK);
    391   EXPECT_TRUE(test.isDenormal());
    392   EXPECT_TRUE(!test.isNegative());
    393   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    394 
    395   // nextUp(-Denormal) -> -Denormal.
    396   test = APFloat(APFloat::IEEEquad,
    397                  "-0x0.ffffffffffffffffffffffff000cp-16382");
    398   expected = APFloat(APFloat::IEEEquad,
    399                  "-0x0.ffffffffffffffffffffffff000bp-16382");
    400   EXPECT_EQ(test.next(false), APFloat::opOK);
    401   EXPECT_TRUE(test.isDenormal());
    402   EXPECT_TRUE(test.isNegative());
    403   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    404 
    405   // nextDown(-Denormal) -> -Denormal
    406   test = APFloat(APFloat::IEEEquad,
    407                  "-0x0.ffffffffffffffffffffffff000cp-16382");
    408   expected = APFloat(APFloat::IEEEquad,
    409                  "-0x0.ffffffffffffffffffffffff000dp-16382");
    410   EXPECT_EQ(test.next(true), APFloat::opOK);
    411   EXPECT_TRUE(test.isDenormal());
    412   EXPECT_TRUE(test.isNegative());
    413   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    414 
    415   // nextUp(+Normal) -> +Normal.
    416   test = APFloat(APFloat::IEEEquad,
    417                  "0x1.ffffffffffffffffffffffff000cp-16000");
    418   expected = APFloat(APFloat::IEEEquad,
    419                  "0x1.ffffffffffffffffffffffff000dp-16000");
    420   EXPECT_EQ(test.next(false), APFloat::opOK);
    421   EXPECT_TRUE(!test.isDenormal());
    422   EXPECT_TRUE(!test.isNegative());
    423   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    424 
    425   // nextDown(+Normal) -> +Normal.
    426   test = APFloat(APFloat::IEEEquad,
    427                  "0x1.ffffffffffffffffffffffff000cp-16000");
    428   expected = APFloat(APFloat::IEEEquad,
    429                  "0x1.ffffffffffffffffffffffff000bp-16000");
    430   EXPECT_EQ(test.next(true), APFloat::opOK);
    431   EXPECT_TRUE(!test.isDenormal());
    432   EXPECT_TRUE(!test.isNegative());
    433   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    434 
    435   // nextUp(-Normal) -> -Normal.
    436   test = APFloat(APFloat::IEEEquad,
    437                  "-0x1.ffffffffffffffffffffffff000cp-16000");
    438   expected = APFloat(APFloat::IEEEquad,
    439                  "-0x1.ffffffffffffffffffffffff000bp-16000");
    440   EXPECT_EQ(test.next(false), APFloat::opOK);
    441   EXPECT_TRUE(!test.isDenormal());
    442   EXPECT_TRUE(test.isNegative());
    443   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    444 
    445   // nextDown(-Normal) -> -Normal.
    446   test = APFloat(APFloat::IEEEquad,
    447                  "-0x1.ffffffffffffffffffffffff000cp-16000");
    448   expected = APFloat(APFloat::IEEEquad,
    449                  "-0x1.ffffffffffffffffffffffff000dp-16000");
    450   EXPECT_EQ(test.next(true), APFloat::opOK);
    451   EXPECT_TRUE(!test.isDenormal());
    452   EXPECT_TRUE(test.isNegative());
    453   EXPECT_TRUE(test.bitwiseIsEqual(expected));
    454 }
    455 
    456 TEST(APFloatTest, FMA) {
    457   APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
    458 
    459   {
    460     APFloat f1(14.5f);
    461     APFloat f2(-14.5f);
    462     APFloat f3(225.0f);
    463     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
    464     EXPECT_EQ(14.75f, f1.convertToFloat());
    465   }
    466 
    467   {
    468     APFloat Val2(2.0f);
    469     APFloat f1((float)1.17549435e-38F);
    470     APFloat f2((float)1.17549435e-38F);
    471     f1.divide(Val2, rdmd);
    472     f2.divide(Val2, rdmd);
    473     APFloat f3(12.0f);
    474     f1.fusedMultiplyAdd(f2, f3, APFloat::rmNearestTiesToEven);
    475     EXPECT_EQ(12.0f, f1.convertToFloat());
    476   }
    477 }
    478 
    479 TEST(APFloatTest, Denormal) {
    480   APFloat::roundingMode rdmd = APFloat::rmNearestTiesToEven;
    481 
    482   // Test single precision
    483   {
    484     const char *MinNormalStr = "1.17549435082228750797e-38";
    485     EXPECT_FALSE(APFloat(APFloat::IEEEsingle, MinNormalStr).isDenormal());
    486     EXPECT_FALSE(APFloat(APFloat::IEEEsingle, 0.0).isDenormal());
    487 
    488     APFloat Val2(APFloat::IEEEsingle, 2.0e0);
    489     APFloat T(APFloat::IEEEsingle, MinNormalStr);
    490     T.divide(Val2, rdmd);
    491     EXPECT_TRUE(T.isDenormal());
    492   }
    493 
    494   // Test double precision
    495   {
    496     const char *MinNormalStr = "2.22507385850720138309e-308";
    497     EXPECT_FALSE(APFloat(APFloat::IEEEdouble, MinNormalStr).isDenormal());
    498     EXPECT_FALSE(APFloat(APFloat::IEEEdouble, 0.0).isDenormal());
    499 
    500     APFloat Val2(APFloat::IEEEdouble, 2.0e0);
    501     APFloat T(APFloat::IEEEdouble, MinNormalStr);
    502     T.divide(Val2, rdmd);
    503     EXPECT_TRUE(T.isDenormal());
    504   }
    505 
    506   // Test Intel double-ext
    507   {
    508     const char *MinNormalStr = "3.36210314311209350626e-4932";
    509     EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, MinNormalStr).isDenormal());
    510     EXPECT_FALSE(APFloat(APFloat::x87DoubleExtended, 0.0).isDenormal());
    511 
    512     APFloat Val2(APFloat::x87DoubleExtended, 2.0e0);
    513     APFloat T(APFloat::x87DoubleExtended, MinNormalStr);
    514     T.divide(Val2, rdmd);
    515     EXPECT_TRUE(T.isDenormal());
    516   }
    517 
    518   // Test quadruple precision
    519   {
    520     const char *MinNormalStr = "3.36210314311209350626267781732175260e-4932";
    521     EXPECT_FALSE(APFloat(APFloat::IEEEquad, MinNormalStr).isDenormal());
    522     EXPECT_FALSE(APFloat(APFloat::IEEEquad, 0.0).isDenormal());
    523 
    524     APFloat Val2(APFloat::IEEEquad, 2.0e0);
    525     APFloat T(APFloat::IEEEquad, MinNormalStr);
    526     T.divide(Val2, rdmd);
    527     EXPECT_TRUE(T.isDenormal());
    528   }
    529 }
    530 
    531 TEST(APFloatTest, Zero) {
    532   EXPECT_EQ(0.0f,  APFloat(0.0f).convertToFloat());
    533   EXPECT_EQ(-0.0f, APFloat(-0.0f).convertToFloat());
    534   EXPECT_TRUE(APFloat(-0.0f).isNegative());
    535 
    536   EXPECT_EQ(0.0,  APFloat(0.0).convertToDouble());
    537   EXPECT_EQ(-0.0, APFloat(-0.0).convertToDouble());
    538   EXPECT_TRUE(APFloat(-0.0).isNegative());
    539 }
    540 
    541 TEST(APFloatTest, DecimalStringsWithoutNullTerminators) {
    542   // Make sure that we can parse strings without null terminators.
    543   // rdar://14323230.
    544   APFloat Val(APFloat::IEEEdouble);
    545   Val.convertFromString(StringRef("0.00", 3),
    546                         llvm::APFloat::rmNearestTiesToEven);
    547   EXPECT_EQ(Val.convertToDouble(), 0.0);
    548   Val.convertFromString(StringRef("0.01", 3),
    549                         llvm::APFloat::rmNearestTiesToEven);
    550   EXPECT_EQ(Val.convertToDouble(), 0.0);
    551   Val.convertFromString(StringRef("0.09", 3),
    552                         llvm::APFloat::rmNearestTiesToEven);
    553   EXPECT_EQ(Val.convertToDouble(), 0.0);
    554   Val.convertFromString(StringRef("0.095", 4),
    555                         llvm::APFloat::rmNearestTiesToEven);
    556   EXPECT_EQ(Val.convertToDouble(), 0.09);
    557   Val.convertFromString(StringRef("0.00e+3", 7),
    558                         llvm::APFloat::rmNearestTiesToEven);
    559   EXPECT_EQ(Val.convertToDouble(), 0.00);
    560   Val.convertFromString(StringRef("0e+3", 4),
    561                         llvm::APFloat::rmNearestTiesToEven);
    562   EXPECT_EQ(Val.convertToDouble(), 0.00);
    563 
    564 }
    565 
    566 TEST(APFloatTest, fromZeroDecimalString) {
    567   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0").convertToDouble());
    568   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0").convertToDouble());
    569   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0").convertToDouble());
    570 
    571   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.").convertToDouble());
    572   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.").convertToDouble());
    573   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.").convertToDouble());
    574 
    575   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  ".0").convertToDouble());
    576   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0").convertToDouble());
    577   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0").convertToDouble());
    578 
    579   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.0").convertToDouble());
    580   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0").convertToDouble());
    581   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0").convertToDouble());
    582 
    583   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "00000.").convertToDouble());
    584   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+00000.").convertToDouble());
    585   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-00000.").convertToDouble());
    586 
    587   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble, ".00000").convertToDouble());
    588   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.00000").convertToDouble());
    589   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.00000").convertToDouble());
    590 
    591   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0000.00000").convertToDouble());
    592   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0000.00000").convertToDouble());
    593   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0000.00000").convertToDouble());
    594 }
    595 
    596 TEST(APFloatTest, fromZeroDecimalSingleExponentString) {
    597   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,   "0e1").convertToDouble());
    598   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble,  "+0e1").convertToDouble());
    599   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble,  "-0e1").convertToDouble());
    600 
    601   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0e+1").convertToDouble());
    602   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1").convertToDouble());
    603   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1").convertToDouble());
    604 
    605   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0e-1").convertToDouble());
    606   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1").convertToDouble());
    607   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1").convertToDouble());
    608 
    609 
    610   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,   "0.e1").convertToDouble());
    611   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble,  "+0.e1").convertToDouble());
    612   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble,  "-0.e1").convertToDouble());
    613 
    614   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.e+1").convertToDouble());
    615   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e+1").convertToDouble());
    616   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e+1").convertToDouble());
    617 
    618   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.e-1").convertToDouble());
    619   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.e-1").convertToDouble());
    620   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.e-1").convertToDouble());
    621 
    622   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,   ".0e1").convertToDouble());
    623   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble,  "+.0e1").convertToDouble());
    624   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble,  "-.0e1").convertToDouble());
    625 
    626   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  ".0e+1").convertToDouble());
    627   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e+1").convertToDouble());
    628   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e+1").convertToDouble());
    629 
    630   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  ".0e-1").convertToDouble());
    631   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+.0e-1").convertToDouble());
    632   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-.0e-1").convertToDouble());
    633 
    634 
    635   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,   "0.0e1").convertToDouble());
    636   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble,  "+0.0e1").convertToDouble());
    637   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble,  "-0.0e1").convertToDouble());
    638 
    639   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.0e+1").convertToDouble());
    640   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e+1").convertToDouble());
    641   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e+1").convertToDouble());
    642 
    643   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0.0e-1").convertToDouble());
    644   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0.0e-1").convertToDouble());
    645   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0.0e-1").convertToDouble());
    646 
    647 
    648   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "000.0000e1").convertToDouble());
    649   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+000.0000e+1").convertToDouble());
    650   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-000.0000e+1").convertToDouble());
    651 }
    652 
    653 TEST(APFloatTest, fromZeroDecimalLargeExponentString) {
    654   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0e1234").convertToDouble());
    655   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e1234").convertToDouble());
    656   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e1234").convertToDouble());
    657 
    658   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0e+1234").convertToDouble());
    659   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e+1234").convertToDouble());
    660   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e+1234").convertToDouble());
    661 
    662   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0e-1234").convertToDouble());
    663   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0e-1234").convertToDouble());
    664   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0e-1234").convertToDouble());
    665 
    666   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble, "000.0000e1234").convertToDouble());
    667   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble, "000.0000e-1234").convertToDouble());
    668 
    669   EXPECT_EQ(0.0,  APFloat(APFloat::IEEEdouble, StringRef("0e1234\02", 6)).convertToDouble());
    670 }
    671 
    672 TEST(APFloatTest, fromZeroHexadecimalString) {
    673   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0p1").convertToDouble());
    674   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p1").convertToDouble());
    675   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1").convertToDouble());
    676 
    677   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0p+1").convertToDouble());
    678   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p+1").convertToDouble());
    679   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p+1").convertToDouble());
    680 
    681   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0p-1").convertToDouble());
    682   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0p-1").convertToDouble());
    683   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p-1").convertToDouble());
    684 
    685 
    686   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.p1").convertToDouble());
    687   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p1").convertToDouble());
    688   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p1").convertToDouble());
    689 
    690   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.p+1").convertToDouble());
    691   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p+1").convertToDouble());
    692   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p+1").convertToDouble());
    693 
    694   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.p-1").convertToDouble());
    695   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.p-1").convertToDouble());
    696   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.p-1").convertToDouble());
    697 
    698 
    699   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x.0p1").convertToDouble());
    700   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p1").convertToDouble());
    701   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p1").convertToDouble());
    702 
    703   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x.0p+1").convertToDouble());
    704   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p+1").convertToDouble());
    705   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p+1").convertToDouble());
    706 
    707   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x.0p-1").convertToDouble());
    708   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x.0p-1").convertToDouble());
    709   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x.0p-1").convertToDouble());
    710 
    711 
    712   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.0p1").convertToDouble());
    713   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p1").convertToDouble());
    714   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p1").convertToDouble());
    715 
    716   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.0p+1").convertToDouble());
    717   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p+1").convertToDouble());
    718   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p+1").convertToDouble());
    719 
    720   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble,  "0x0.0p-1").convertToDouble());
    721   EXPECT_EQ(+0.0, APFloat(APFloat::IEEEdouble, "+0x0.0p-1").convertToDouble());
    722   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0.0p-1").convertToDouble());
    723 
    724 
    725   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1").convertToDouble());
    726   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1").convertToDouble());
    727   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1").convertToDouble());
    728   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1").convertToDouble());
    729   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0p1234").convertToDouble());
    730   EXPECT_EQ(-0.0, APFloat(APFloat::IEEEdouble, "-0x0p1234").convertToDouble());
    731   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x00000.p1234").convertToDouble());
    732   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0000.00000p1234").convertToDouble());
    733   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x.00000p1234").convertToDouble());
    734   EXPECT_EQ( 0.0, APFloat(APFloat::IEEEdouble, "0x0.p1234").convertToDouble());
    735 }
    736 
    737 TEST(APFloatTest, fromDecimalString) {
    738   EXPECT_EQ(1.0,      APFloat(APFloat::IEEEdouble, "1").convertToDouble());
    739   EXPECT_EQ(2.0,      APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
    740   EXPECT_EQ(0.5,      APFloat(APFloat::IEEEdouble, ".5").convertToDouble());
    741   EXPECT_EQ(1.0,      APFloat(APFloat::IEEEdouble, "1.0").convertToDouble());
    742   EXPECT_EQ(-2.0,     APFloat(APFloat::IEEEdouble, "-2").convertToDouble());
    743   EXPECT_EQ(-4.0,     APFloat(APFloat::IEEEdouble, "-4.").convertToDouble());
    744   EXPECT_EQ(-0.5,     APFloat(APFloat::IEEEdouble, "-.5").convertToDouble());
    745   EXPECT_EQ(-1.5,     APFloat(APFloat::IEEEdouble, "-1.5").convertToDouble());
    746   EXPECT_EQ(1.25e12,  APFloat(APFloat::IEEEdouble, "1.25e12").convertToDouble());
    747   EXPECT_EQ(1.25e+12, APFloat(APFloat::IEEEdouble, "1.25e+12").convertToDouble());
    748   EXPECT_EQ(1.25e-12, APFloat(APFloat::IEEEdouble, "1.25e-12").convertToDouble());
    749   EXPECT_EQ(1024.0,   APFloat(APFloat::IEEEdouble, "1024.").convertToDouble());
    750   EXPECT_EQ(1024.05,  APFloat(APFloat::IEEEdouble, "1024.05000").convertToDouble());
    751   EXPECT_EQ(0.05,     APFloat(APFloat::IEEEdouble, ".05000").convertToDouble());
    752   EXPECT_EQ(2.0,      APFloat(APFloat::IEEEdouble, "2.").convertToDouble());
    753   EXPECT_EQ(2.0e2,    APFloat(APFloat::IEEEdouble, "2.e2").convertToDouble());
    754   EXPECT_EQ(2.0e+2,   APFloat(APFloat::IEEEdouble, "2.e+2").convertToDouble());
    755   EXPECT_EQ(2.0e-2,   APFloat(APFloat::IEEEdouble, "2.e-2").convertToDouble());
    756   EXPECT_EQ(2.05e2,    APFloat(APFloat::IEEEdouble, "002.05000e2").convertToDouble());
    757   EXPECT_EQ(2.05e+2,   APFloat(APFloat::IEEEdouble, "002.05000e+2").convertToDouble());
    758   EXPECT_EQ(2.05e-2,   APFloat(APFloat::IEEEdouble, "002.05000e-2").convertToDouble());
    759   EXPECT_EQ(2.05e12,   APFloat(APFloat::IEEEdouble, "002.05000e12").convertToDouble());
    760   EXPECT_EQ(2.05e+12,  APFloat(APFloat::IEEEdouble, "002.05000e+12").convertToDouble());
    761   EXPECT_EQ(2.05e-12,  APFloat(APFloat::IEEEdouble, "002.05000e-12").convertToDouble());
    762 
    763   // These are "carefully selected" to overflow the fast log-base
    764   // calculations in APFloat.cpp
    765   EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "99e99999").isInfinity());
    766   EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-99e99999").isInfinity());
    767   EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "1e-99999").isPosZero());
    768   EXPECT_TRUE(APFloat(APFloat::IEEEdouble, "-1e-99999").isNegZero());
    769 
    770   EXPECT_EQ(2.71828, convertToDoubleFromString("2.71828"));
    771 }
    772 
    773 TEST(APFloatTest, fromHexadecimalString) {
    774   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble,  "0x1p0").convertToDouble());
    775   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p0").convertToDouble());
    776   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p0").convertToDouble());
    777 
    778   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble,  "0x1p+0").convertToDouble());
    779   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p+0").convertToDouble());
    780   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p+0").convertToDouble());
    781 
    782   EXPECT_EQ( 1.0, APFloat(APFloat::IEEEdouble,  "0x1p-0").convertToDouble());
    783   EXPECT_EQ(+1.0, APFloat(APFloat::IEEEdouble, "+0x1p-0").convertToDouble());
    784   EXPECT_EQ(-1.0, APFloat(APFloat::IEEEdouble, "-0x1p-0").convertToDouble());
    785 
    786 
    787   EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble,  "0x1p1").convertToDouble());
    788   EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p1").convertToDouble());
    789   EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p1").convertToDouble());
    790 
    791   EXPECT_EQ( 2.0, APFloat(APFloat::IEEEdouble,  "0x1p+1").convertToDouble());
    792   EXPECT_EQ(+2.0, APFloat(APFloat::IEEEdouble, "+0x1p+1").convertToDouble());
    793   EXPECT_EQ(-2.0, APFloat(APFloat::IEEEdouble, "-0x1p+1").convertToDouble());
    794 
    795   EXPECT_EQ( 0.5, APFloat(APFloat::IEEEdouble,  "0x1p-1").convertToDouble());
    796   EXPECT_EQ(+0.5, APFloat(APFloat::IEEEdouble, "+0x1p-1").convertToDouble());
    797   EXPECT_EQ(-0.5, APFloat(APFloat::IEEEdouble, "-0x1p-1").convertToDouble());
    798 
    799 
    800   EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble,  "0x1.8p1").convertToDouble());
    801   EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p1").convertToDouble());
    802   EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p1").convertToDouble());
    803 
    804   EXPECT_EQ( 3.0, APFloat(APFloat::IEEEdouble,  "0x1.8p+1").convertToDouble());
    805   EXPECT_EQ(+3.0, APFloat(APFloat::IEEEdouble, "+0x1.8p+1").convertToDouble());
    806   EXPECT_EQ(-3.0, APFloat(APFloat::IEEEdouble, "-0x1.8p+1").convertToDouble());
    807 
    808   EXPECT_EQ( 0.75, APFloat(APFloat::IEEEdouble,  "0x1.8p-1").convertToDouble());
    809   EXPECT_EQ(+0.75, APFloat(APFloat::IEEEdouble, "+0x1.8p-1").convertToDouble());
    810   EXPECT_EQ(-0.75, APFloat(APFloat::IEEEdouble, "-0x1.8p-1").convertToDouble());
    811 
    812 
    813   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble,  "0x1000.000p1").convertToDouble());
    814   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p1").convertToDouble());
    815   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p1").convertToDouble());
    816 
    817   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble,  "0x1000.000p+1").convertToDouble());
    818   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p+1").convertToDouble());
    819   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p+1").convertToDouble());
    820 
    821   EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble,  "0x1000.000p-1").convertToDouble());
    822   EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000.000p-1").convertToDouble());
    823   EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000.000p-1").convertToDouble());
    824 
    825 
    826   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble,  "0x1000p1").convertToDouble());
    827   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p1").convertToDouble());
    828   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p1").convertToDouble());
    829 
    830   EXPECT_EQ( 8192.0, APFloat(APFloat::IEEEdouble,  "0x1000p+1").convertToDouble());
    831   EXPECT_EQ(+8192.0, APFloat(APFloat::IEEEdouble, "+0x1000p+1").convertToDouble());
    832   EXPECT_EQ(-8192.0, APFloat(APFloat::IEEEdouble, "-0x1000p+1").convertToDouble());
    833 
    834   EXPECT_EQ( 2048.0, APFloat(APFloat::IEEEdouble,  "0x1000p-1").convertToDouble());
    835   EXPECT_EQ(+2048.0, APFloat(APFloat::IEEEdouble, "+0x1000p-1").convertToDouble());
    836   EXPECT_EQ(-2048.0, APFloat(APFloat::IEEEdouble, "-0x1000p-1").convertToDouble());
    837 
    838 
    839   EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble,  "0x10p10").convertToDouble());
    840   EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p10").convertToDouble());
    841   EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p10").convertToDouble());
    842 
    843   EXPECT_EQ( 16384.0, APFloat(APFloat::IEEEdouble,  "0x10p+10").convertToDouble());
    844   EXPECT_EQ(+16384.0, APFloat(APFloat::IEEEdouble, "+0x10p+10").convertToDouble());
    845   EXPECT_EQ(-16384.0, APFloat(APFloat::IEEEdouble, "-0x10p+10").convertToDouble());
    846 
    847   EXPECT_EQ( 0.015625, APFloat(APFloat::IEEEdouble,  "0x10p-10").convertToDouble());
    848   EXPECT_EQ(+0.015625, APFloat(APFloat::IEEEdouble, "+0x10p-10").convertToDouble());
    849   EXPECT_EQ(-0.015625, APFloat(APFloat::IEEEdouble, "-0x10p-10").convertToDouble());
    850 
    851   EXPECT_EQ(1.0625, APFloat(APFloat::IEEEdouble, "0x1.1p0").convertToDouble());
    852   EXPECT_EQ(1.0, APFloat(APFloat::IEEEdouble, "0x1p0").convertToDouble());
    853 
    854   EXPECT_EQ(convertToDoubleFromString("0x1p-150"),
    855             convertToDoubleFromString("+0x800000000000000001.p-221"));
    856   EXPECT_EQ(2251799813685248.5,
    857             convertToDoubleFromString("0x80000000000004000000.010p-28"));
    858 }
    859 
    860 TEST(APFloatTest, toString) {
    861   ASSERT_EQ("10", convertToString(10.0, 6, 3));
    862   ASSERT_EQ("1.0E+1", convertToString(10.0, 6, 0));
    863   ASSERT_EQ("10100", convertToString(1.01E+4, 5, 2));
    864   ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 4, 2));
    865   ASSERT_EQ("1.01E+4", convertToString(1.01E+4, 5, 1));
    866   ASSERT_EQ("0.0101", convertToString(1.01E-2, 5, 2));
    867   ASSERT_EQ("0.0101", convertToString(1.01E-2, 4, 2));
    868   ASSERT_EQ("1.01E-2", convertToString(1.01E-2, 5, 1));
    869   ASSERT_EQ("0.7853981633974483", convertToString(0.78539816339744830961, 0, 3));
    870   ASSERT_EQ("4.940656458412465E-324", convertToString(4.9406564584124654e-324, 0, 3));
    871   ASSERT_EQ("873.1834", convertToString(873.1834, 0, 1));
    872   ASSERT_EQ("8.731834E+2", convertToString(873.1834, 0, 0));
    873 }
    874 
    875 TEST(APFloatTest, toInteger) {
    876   bool isExact = false;
    877   APSInt result(5, /*isUnsigned=*/true);
    878 
    879   EXPECT_EQ(APFloat::opOK,
    880             APFloat(APFloat::IEEEdouble, "10")
    881             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    882   EXPECT_TRUE(isExact);
    883   EXPECT_EQ(APSInt(APInt(5, 10), true), result);
    884 
    885   EXPECT_EQ(APFloat::opInvalidOp,
    886             APFloat(APFloat::IEEEdouble, "-10")
    887             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    888   EXPECT_FALSE(isExact);
    889   EXPECT_EQ(APSInt::getMinValue(5, true), result);
    890 
    891   EXPECT_EQ(APFloat::opInvalidOp,
    892             APFloat(APFloat::IEEEdouble, "32")
    893             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    894   EXPECT_FALSE(isExact);
    895   EXPECT_EQ(APSInt::getMaxValue(5, true), result);
    896 
    897   EXPECT_EQ(APFloat::opInexact,
    898             APFloat(APFloat::IEEEdouble, "7.9")
    899             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    900   EXPECT_FALSE(isExact);
    901   EXPECT_EQ(APSInt(APInt(5, 7), true), result);
    902 
    903   result.setIsUnsigned(false);
    904   EXPECT_EQ(APFloat::opOK,
    905             APFloat(APFloat::IEEEdouble, "-10")
    906             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    907   EXPECT_TRUE(isExact);
    908   EXPECT_EQ(APSInt(APInt(5, -10, true), false), result);
    909 
    910   EXPECT_EQ(APFloat::opInvalidOp,
    911             APFloat(APFloat::IEEEdouble, "-17")
    912             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    913   EXPECT_FALSE(isExact);
    914   EXPECT_EQ(APSInt::getMinValue(5, false), result);
    915 
    916   EXPECT_EQ(APFloat::opInvalidOp,
    917             APFloat(APFloat::IEEEdouble, "16")
    918             .convertToInteger(result, APFloat::rmTowardZero, &isExact));
    919   EXPECT_FALSE(isExact);
    920   EXPECT_EQ(APSInt::getMaxValue(5, false), result);
    921 }
    922 
    923 static APInt nanbits(const fltSemantics &Sem,
    924                      bool SNaN, bool Negative, uint64_t fill) {
    925   APInt apfill(64, fill);
    926   if (SNaN)
    927     return APFloat::getSNaN(Sem, Negative, &apfill).bitcastToAPInt();
    928   else
    929     return APFloat::getQNaN(Sem, Negative, &apfill).bitcastToAPInt();
    930 }
    931 
    932 TEST(APFloatTest, makeNaN) {
    933   ASSERT_EQ(0x7fc00000, nanbits(APFloat::IEEEsingle, false, false, 0));
    934   ASSERT_EQ(0xffc00000, nanbits(APFloat::IEEEsingle, false, true, 0));
    935   ASSERT_EQ(0x7fc0ae72, nanbits(APFloat::IEEEsingle, false, false, 0xae72));
    936   ASSERT_EQ(0x7fffae72, nanbits(APFloat::IEEEsingle, false, false, 0xffffae72));
    937   ASSERT_EQ(0x7fa00000, nanbits(APFloat::IEEEsingle, true, false, 0));
    938   ASSERT_EQ(0xffa00000, nanbits(APFloat::IEEEsingle, true, true, 0));
    939   ASSERT_EQ(0x7f80ae72, nanbits(APFloat::IEEEsingle, true, false, 0xae72));
    940   ASSERT_EQ(0x7fbfae72, nanbits(APFloat::IEEEsingle, true, false, 0xffffae72));
    941 
    942   ASSERT_EQ(0x7ff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, false, 0));
    943   ASSERT_EQ(0xfff8000000000000ULL, nanbits(APFloat::IEEEdouble, false, true, 0));
    944   ASSERT_EQ(0x7ff800000000ae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xae72));
    945   ASSERT_EQ(0x7fffffffffffae72ULL, nanbits(APFloat::IEEEdouble, false, false, 0xffffffffffffae72ULL));
    946   ASSERT_EQ(0x7ff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, false, 0));
    947   ASSERT_EQ(0xfff4000000000000ULL, nanbits(APFloat::IEEEdouble, true, true, 0));
    948   ASSERT_EQ(0x7ff000000000ae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xae72));
    949   ASSERT_EQ(0x7ff7ffffffffae72ULL, nanbits(APFloat::IEEEdouble, true, false, 0xffffffffffffae72ULL));
    950 }
    951 
    952 #ifdef GTEST_HAS_DEATH_TEST
    953 #ifndef NDEBUG
    954 TEST(APFloatTest, SemanticsDeath) {
    955   EXPECT_DEATH(APFloat(APFloat::IEEEsingle, 0.0f).convertToDouble(), "Float semantics are not IEEEdouble");
    956   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, 0.0 ).convertToFloat(),  "Float semantics are not IEEEsingle");
    957 }
    958 
    959 TEST(APFloatTest, StringDecimalDeath) {
    960   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  ""), "Invalid string length");
    961   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+"), "String has no digits");
    962   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-"), "String has no digits");
    963 
    964   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("\0", 1)), "Invalid character in significand");
    965   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\0", 2)), "Invalid character in significand");
    966   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02", 3)), "Invalid character in significand");
    967   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1\02e1", 5)), "Invalid character in significand");
    968   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e\0", 3)), "Invalid character in exponent");
    969   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\0", 4)), "Invalid character in exponent");
    970   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("1e1\02", 5)), "Invalid character in exponent");
    971 
    972   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0f"), "Invalid character in significand");
    973 
    974   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".."), "String contains multiple dots");
    975   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "..0"), "String contains multiple dots");
    976   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0.0"), "String contains multiple dots");
    977 }
    978 
    979 TEST(APFloatTest, StringDecimalSignificandDeath) {
    980   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "."), "Significand has no digits");
    981   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+."), "Significand has no digits");
    982   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-."), "Significand has no digits");
    983 
    984 
    985   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "e"), "Significand has no digits");
    986   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e"), "Significand has no digits");
    987   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e"), "Significand has no digits");
    988 
    989   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "e1"), "Significand has no digits");
    990   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+e1"), "Significand has no digits");
    991   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-e1"), "Significand has no digits");
    992 
    993   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  ".e1"), "Significand has no digits");
    994   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e1"), "Significand has no digits");
    995   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e1"), "Significand has no digits");
    996 
    997 
    998   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  ".e"), "Significand has no digits");
    999   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+.e"), "Significand has no digits");
   1000   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-.e"), "Significand has no digits");
   1001 }
   1002 
   1003 TEST(APFloatTest, StringDecimalExponentDeath) {
   1004   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,   "1e"), "Exponent has no digits");
   1005   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "+1e"), "Exponent has no digits");
   1006   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "-1e"), "Exponent has no digits");
   1007 
   1008   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,   "1.e"), "Exponent has no digits");
   1009   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "+1.e"), "Exponent has no digits");
   1010   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "-1.e"), "Exponent has no digits");
   1011 
   1012   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,   ".1e"), "Exponent has no digits");
   1013   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "+.1e"), "Exponent has no digits");
   1014   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "-.1e"), "Exponent has no digits");
   1015 
   1016   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,   "1.1e"), "Exponent has no digits");
   1017   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "+1.1e"), "Exponent has no digits");
   1018   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "-1.1e"), "Exponent has no digits");
   1019 
   1020 
   1021   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e+"), "Exponent has no digits");
   1022   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1e-"), "Exponent has no digits");
   1023 
   1024   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  ".1e"), "Exponent has no digits");
   1025   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e+"), "Exponent has no digits");
   1026   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, ".1e-"), "Exponent has no digits");
   1027 
   1028   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "1.0e"), "Exponent has no digits");
   1029   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e+"), "Exponent has no digits");
   1030   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "1.0e-"), "Exponent has no digits");
   1031 }
   1032 
   1033 TEST(APFloatTest, StringHexadecimalDeath) {
   1034   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x"), "Invalid string");
   1035   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x"), "Invalid string");
   1036   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x"), "Invalid string");
   1037 
   1038   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x0"), "Hex strings require an exponent");
   1039   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0"), "Hex strings require an exponent");
   1040   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0"), "Hex strings require an exponent");
   1041 
   1042   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x0."), "Hex strings require an exponent");
   1043   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0."), "Hex strings require an exponent");
   1044   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0."), "Hex strings require an exponent");
   1045 
   1046   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.0"), "Hex strings require an exponent");
   1047   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.0"), "Hex strings require an exponent");
   1048   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.0"), "Hex strings require an exponent");
   1049 
   1050   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x0.0"), "Hex strings require an exponent");
   1051   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x0.0"), "Hex strings require an exponent");
   1052   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x0.0"), "Hex strings require an exponent");
   1053 
   1054   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x\0", 3)), "Invalid character in significand");
   1055   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\0", 4)), "Invalid character in significand");
   1056   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02", 5)), "Invalid character in significand");
   1057   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1\02p1", 7)), "Invalid character in significand");
   1058   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p\0", 5)), "Invalid character in exponent");
   1059   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\0", 6)), "Invalid character in exponent");
   1060   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, StringRef("0x1p1\02", 7)), "Invalid character in exponent");
   1061 
   1062   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1p0f"), "Invalid character in exponent");
   1063 
   1064   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..p1"), "String contains multiple dots");
   1065   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x..0p1"), "String contains multiple dots");
   1066   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "0x1.0.0p1"), "String contains multiple dots");
   1067 }
   1068 
   1069 TEST(APFloatTest, StringHexadecimalSignificandDeath) {
   1070   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x."), "Significand has no digits");
   1071   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x."), "Significand has no digits");
   1072   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x."), "Significand has no digits");
   1073 
   1074   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0xp"), "Significand has no digits");
   1075   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp"), "Significand has no digits");
   1076   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp"), "Significand has no digits");
   1077 
   1078   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0xp+"), "Significand has no digits");
   1079   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp+"), "Significand has no digits");
   1080   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp+"), "Significand has no digits");
   1081 
   1082   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0xp-"), "Significand has no digits");
   1083   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0xp-"), "Significand has no digits");
   1084   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0xp-"), "Significand has no digits");
   1085 
   1086 
   1087   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.p"), "Significand has no digits");
   1088   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p"), "Significand has no digits");
   1089   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p"), "Significand has no digits");
   1090 
   1091   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.p+"), "Significand has no digits");
   1092   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p+"), "Significand has no digits");
   1093   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p+"), "Significand has no digits");
   1094 
   1095   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.p-"), "Significand has no digits");
   1096   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.p-"), "Significand has no digits");
   1097   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.p-"), "Significand has no digits");
   1098 }
   1099 
   1100 TEST(APFloatTest, StringHexadecimalExponentDeath) {
   1101   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1p"), "Exponent has no digits");
   1102   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p"), "Exponent has no digits");
   1103   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p"), "Exponent has no digits");
   1104 
   1105   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1p+"), "Exponent has no digits");
   1106   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p+"), "Exponent has no digits");
   1107   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p+"), "Exponent has no digits");
   1108 
   1109   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1p-"), "Exponent has no digits");
   1110   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1p-"), "Exponent has no digits");
   1111   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1p-"), "Exponent has no digits");
   1112 
   1113 
   1114   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.p"), "Exponent has no digits");
   1115   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p"), "Exponent has no digits");
   1116   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p"), "Exponent has no digits");
   1117 
   1118   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.p+"), "Exponent has no digits");
   1119   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p+"), "Exponent has no digits");
   1120   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p+"), "Exponent has no digits");
   1121 
   1122   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.p-"), "Exponent has no digits");
   1123   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.p-"), "Exponent has no digits");
   1124   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.p-"), "Exponent has no digits");
   1125 
   1126 
   1127   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.1p"), "Exponent has no digits");
   1128   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p"), "Exponent has no digits");
   1129   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p"), "Exponent has no digits");
   1130 
   1131   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.1p+"), "Exponent has no digits");
   1132   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p+"), "Exponent has no digits");
   1133   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p+"), "Exponent has no digits");
   1134 
   1135   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x.1p-"), "Exponent has no digits");
   1136   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x.1p-"), "Exponent has no digits");
   1137   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x.1p-"), "Exponent has no digits");
   1138 
   1139 
   1140   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.1p"), "Exponent has no digits");
   1141   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p"), "Exponent has no digits");
   1142   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p"), "Exponent has no digits");
   1143 
   1144   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.1p+"), "Exponent has no digits");
   1145   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p+"), "Exponent has no digits");
   1146   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p+"), "Exponent has no digits");
   1147 
   1148   EXPECT_DEATH(APFloat(APFloat::IEEEdouble,  "0x1.1p-"), "Exponent has no digits");
   1149   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "+0x1.1p-"), "Exponent has no digits");
   1150   EXPECT_DEATH(APFloat(APFloat::IEEEdouble, "-0x1.1p-"), "Exponent has no digits");
   1151 }
   1152 #endif
   1153 #endif
   1154 
   1155 TEST(APFloatTest, exactInverse) {
   1156   APFloat inv(0.0f);
   1157 
   1158   // Trivial operation.
   1159   EXPECT_TRUE(APFloat(2.0).getExactInverse(&inv));
   1160   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5)));
   1161   EXPECT_TRUE(APFloat(2.0f).getExactInverse(&inv));
   1162   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(0.5f)));
   1163   EXPECT_TRUE(APFloat(APFloat::IEEEquad, "2.0").getExactInverse(&inv));
   1164   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::IEEEquad, "0.5")));
   1165   EXPECT_TRUE(APFloat(APFloat::PPCDoubleDouble, "2.0").getExactInverse(&inv));
   1166   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::PPCDoubleDouble, "0.5")));
   1167   EXPECT_TRUE(APFloat(APFloat::x87DoubleExtended, "2.0").getExactInverse(&inv));
   1168   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(APFloat::x87DoubleExtended, "0.5")));
   1169 
   1170   // FLT_MIN
   1171   EXPECT_TRUE(APFloat(1.17549435e-38f).getExactInverse(&inv));
   1172   EXPECT_TRUE(inv.bitwiseIsEqual(APFloat(8.5070592e+37f)));
   1173 
   1174   // Large float, inverse is a denormal.
   1175   EXPECT_FALSE(APFloat(1.7014118e38f).getExactInverse(0));
   1176   // Zero
   1177   EXPECT_FALSE(APFloat(0.0).getExactInverse(0));
   1178   // Denormalized float
   1179   EXPECT_FALSE(APFloat(1.40129846e-45f).getExactInverse(0));
   1180 }
   1181 
   1182 TEST(APFloatTest, roundToIntegral) {
   1183   APFloat T(-0.5), S(3.14), R(APFloat::getLargest(APFloat::IEEEdouble)), P(0.0);
   1184 
   1185   P = T;
   1186   P.roundToIntegral(APFloat::rmTowardZero);
   1187   EXPECT_EQ(-0.0, P.convertToDouble());
   1188   P = T;
   1189   P.roundToIntegral(APFloat::rmTowardNegative);
   1190   EXPECT_EQ(-1.0, P.convertToDouble());
   1191   P = T;
   1192   P.roundToIntegral(APFloat::rmTowardPositive);
   1193   EXPECT_EQ(-0.0, P.convertToDouble());
   1194   P = T;
   1195   P.roundToIntegral(APFloat::rmNearestTiesToEven);
   1196   EXPECT_EQ(-0.0, P.convertToDouble());
   1197 
   1198   P = S;
   1199   P.roundToIntegral(APFloat::rmTowardZero);
   1200   EXPECT_EQ(3.0, P.convertToDouble());
   1201   P = S;
   1202   P.roundToIntegral(APFloat::rmTowardNegative);
   1203   EXPECT_EQ(3.0, P.convertToDouble());
   1204   P = S;
   1205   P.roundToIntegral(APFloat::rmTowardPositive);
   1206   EXPECT_EQ(4.0, P.convertToDouble());
   1207   P = S;
   1208   P.roundToIntegral(APFloat::rmNearestTiesToEven);
   1209   EXPECT_EQ(3.0, P.convertToDouble());
   1210 
   1211   P = R;
   1212   P.roundToIntegral(APFloat::rmTowardZero);
   1213   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
   1214   P = R;
   1215   P.roundToIntegral(APFloat::rmTowardNegative);
   1216   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
   1217   P = R;
   1218   P.roundToIntegral(APFloat::rmTowardPositive);
   1219   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
   1220   P = R;
   1221   P.roundToIntegral(APFloat::rmNearestTiesToEven);
   1222   EXPECT_EQ(R.convertToDouble(), P.convertToDouble());
   1223 
   1224   P = APFloat::getZero(APFloat::IEEEdouble);
   1225   P.roundToIntegral(APFloat::rmTowardZero);
   1226   EXPECT_EQ(0.0, P.convertToDouble());
   1227   P = APFloat::getZero(APFloat::IEEEdouble, true);
   1228   P.roundToIntegral(APFloat::rmTowardZero);
   1229   EXPECT_EQ(-0.0, P.convertToDouble());
   1230   P = APFloat::getNaN(APFloat::IEEEdouble);
   1231   P.roundToIntegral(APFloat::rmTowardZero);
   1232   EXPECT_TRUE(IsNAN(P.convertToDouble()));
   1233   P = APFloat::getInf(APFloat::IEEEdouble);
   1234   P.roundToIntegral(APFloat::rmTowardZero);
   1235   EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() > 0.0);
   1236   P = APFloat::getInf(APFloat::IEEEdouble, true);
   1237   P.roundToIntegral(APFloat::rmTowardZero);
   1238   EXPECT_TRUE(IsInf(P.convertToDouble()) && P.convertToDouble() < 0.0);
   1239 
   1240 }
   1241 
   1242 TEST(APFloatTest, getLargest) {
   1243   EXPECT_EQ(3.402823466e+38f, APFloat::getLargest(APFloat::IEEEsingle).convertToFloat());
   1244   EXPECT_EQ(1.7976931348623158e+308, APFloat::getLargest(APFloat::IEEEdouble).convertToDouble());
   1245 }
   1246 
   1247 TEST(APFloatTest, getSmallest) {
   1248   APFloat test = APFloat::getSmallest(APFloat::IEEEsingle, false);
   1249   APFloat expected = APFloat(APFloat::IEEEsingle, "0x0.000002p-126");
   1250   EXPECT_FALSE(test.isNegative());
   1251   EXPECT_TRUE(test.isFiniteNonZero());
   1252   EXPECT_TRUE(test.isDenormal());
   1253   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1254 
   1255   test = APFloat::getSmallest(APFloat::IEEEsingle, true);
   1256   expected = APFloat(APFloat::IEEEsingle, "-0x0.000002p-126");
   1257   EXPECT_TRUE(test.isNegative());
   1258   EXPECT_TRUE(test.isFiniteNonZero());
   1259   EXPECT_TRUE(test.isDenormal());
   1260   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1261 
   1262   test = APFloat::getSmallest(APFloat::IEEEquad, false);
   1263   expected = APFloat(APFloat::IEEEquad, "0x0.0000000000000000000000000001p-16382");
   1264   EXPECT_FALSE(test.isNegative());
   1265   EXPECT_TRUE(test.isFiniteNonZero());
   1266   EXPECT_TRUE(test.isDenormal());
   1267   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1268 
   1269   test = APFloat::getSmallest(APFloat::IEEEquad, true);
   1270   expected = APFloat(APFloat::IEEEquad, "-0x0.0000000000000000000000000001p-16382");
   1271   EXPECT_TRUE(test.isNegative());
   1272   EXPECT_TRUE(test.isFiniteNonZero());
   1273   EXPECT_TRUE(test.isDenormal());
   1274   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1275 }
   1276 
   1277 TEST(APFloatTest, getSmallestNormalized) {
   1278   APFloat test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
   1279   APFloat expected = APFloat(APFloat::IEEEsingle, "0x1p-126");
   1280   EXPECT_FALSE(test.isNegative());
   1281   EXPECT_TRUE(test.isFiniteNonZero());
   1282   EXPECT_FALSE(test.isDenormal());
   1283   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1284 
   1285   test = APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
   1286   expected = APFloat(APFloat::IEEEsingle, "-0x1p-126");
   1287   EXPECT_TRUE(test.isNegative());
   1288   EXPECT_TRUE(test.isFiniteNonZero());
   1289   EXPECT_FALSE(test.isDenormal());
   1290   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1291 
   1292   test = APFloat::getSmallestNormalized(APFloat::IEEEquad, false);
   1293   expected = APFloat(APFloat::IEEEquad, "0x1p-16382");
   1294   EXPECT_FALSE(test.isNegative());
   1295   EXPECT_TRUE(test.isFiniteNonZero());
   1296   EXPECT_FALSE(test.isDenormal());
   1297   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1298 
   1299   test = APFloat::getSmallestNormalized(APFloat::IEEEquad, true);
   1300   expected = APFloat(APFloat::IEEEquad, "-0x1p-16382");
   1301   EXPECT_TRUE(test.isNegative());
   1302   EXPECT_TRUE(test.isFiniteNonZero());
   1303   EXPECT_FALSE(test.isDenormal());
   1304   EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1305 }
   1306 
   1307 TEST(APFloatTest, getZero) {
   1308   struct {
   1309     const fltSemantics *semantics;
   1310     const bool sign;
   1311     const unsigned long long bitPattern[2];
   1312     const unsigned bitPatternLength;
   1313   } const GetZeroTest[] = {
   1314     { &APFloat::IEEEhalf, false, {0, 0}, 1},
   1315     { &APFloat::IEEEhalf, true, {0x8000ULL, 0}, 1},
   1316     { &APFloat::IEEEsingle, false, {0, 0}, 1},
   1317     { &APFloat::IEEEsingle, true, {0x80000000ULL, 0}, 1},
   1318     { &APFloat::IEEEdouble, false, {0, 0}, 1},
   1319     { &APFloat::IEEEdouble, true, {0x8000000000000000ULL, 0}, 1},
   1320     { &APFloat::IEEEquad, false, {0, 0}, 2},
   1321     { &APFloat::IEEEquad, true, {0, 0x8000000000000000ULL}, 2},
   1322     { &APFloat::PPCDoubleDouble, false, {0, 0}, 2},
   1323     { &APFloat::PPCDoubleDouble, true, {0x8000000000000000ULL, 0}, 2},
   1324     { &APFloat::x87DoubleExtended, false, {0, 0}, 2},
   1325     { &APFloat::x87DoubleExtended, true, {0, 0x8000ULL}, 2},
   1326   };
   1327   const unsigned NumGetZeroTests = 12;
   1328   for (unsigned i = 0; i < NumGetZeroTests; ++i) {
   1329     APFloat test = APFloat::getZero(*GetZeroTest[i].semantics,
   1330 				    GetZeroTest[i].sign);
   1331     const char *pattern = GetZeroTest[i].sign? "-0x0p+0" : "0x0p+0";
   1332     APFloat expected = APFloat(*GetZeroTest[i].semantics,
   1333 			       pattern);
   1334     EXPECT_TRUE(test.isZero());
   1335     EXPECT_TRUE(GetZeroTest[i].sign? test.isNegative() : !test.isNegative());
   1336     EXPECT_TRUE(test.bitwiseIsEqual(expected));
   1337     for (unsigned j = 0, je = GetZeroTest[i].bitPatternLength; j < je; ++j) {
   1338       EXPECT_EQ(GetZeroTest[i].bitPattern[j],
   1339 		test.bitcastToAPInt().getRawData()[j]);
   1340     }
   1341   }
   1342 }
   1343 
   1344 TEST(APFloatTest, convert) {
   1345   bool losesInfo;
   1346   APFloat test(APFloat::IEEEdouble, "1.0");
   1347   test.convert(APFloat::IEEEsingle, APFloat::rmNearestTiesToEven, &losesInfo);
   1348   EXPECT_EQ(1.0f, test.convertToFloat());
   1349   EXPECT_FALSE(losesInfo);
   1350 
   1351   test = APFloat(APFloat::x87DoubleExtended, "0x1p-53");
   1352   test.add(APFloat(APFloat::x87DoubleExtended, "1.0"), APFloat::rmNearestTiesToEven);
   1353   test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
   1354   EXPECT_EQ(1.0, test.convertToDouble());
   1355   EXPECT_TRUE(losesInfo);
   1356 
   1357   test = APFloat(APFloat::IEEEquad, "0x1p-53");
   1358   test.add(APFloat(APFloat::IEEEquad, "1.0"), APFloat::rmNearestTiesToEven);
   1359   test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
   1360   EXPECT_EQ(1.0, test.convertToDouble());
   1361   EXPECT_TRUE(losesInfo);
   1362 
   1363   test = APFloat(APFloat::x87DoubleExtended, "0xf.fffffffp+28");
   1364   test.convert(APFloat::IEEEdouble, APFloat::rmNearestTiesToEven, &losesInfo);
   1365   EXPECT_EQ(4294967295.0, test.convertToDouble());
   1366   EXPECT_FALSE(losesInfo);
   1367 
   1368   test = APFloat::getSNaN(APFloat::IEEEsingle);
   1369   APFloat X87SNaN = APFloat::getSNaN(APFloat::x87DoubleExtended);
   1370   test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
   1371                &losesInfo);
   1372   EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
   1373   EXPECT_FALSE(losesInfo);
   1374 
   1375   test = APFloat::getQNaN(APFloat::IEEEsingle);
   1376   APFloat X87QNaN = APFloat::getQNaN(APFloat::x87DoubleExtended);
   1377   test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
   1378                &losesInfo);
   1379   EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
   1380   EXPECT_FALSE(losesInfo);
   1381 
   1382   test = APFloat::getSNaN(APFloat::x87DoubleExtended);
   1383   test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
   1384                &losesInfo);
   1385   EXPECT_TRUE(test.bitwiseIsEqual(X87SNaN));
   1386   EXPECT_FALSE(losesInfo);
   1387 
   1388   test = APFloat::getQNaN(APFloat::x87DoubleExtended);
   1389   test.convert(APFloat::x87DoubleExtended, APFloat::rmNearestTiesToEven,
   1390                &losesInfo);
   1391   EXPECT_TRUE(test.bitwiseIsEqual(X87QNaN));
   1392   EXPECT_FALSE(losesInfo);
   1393 }
   1394 
   1395 TEST(APFloatTest, PPCDoubleDouble) {
   1396   APFloat test(APFloat::PPCDoubleDouble, "1.0");
   1397   EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
   1398   EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
   1399 
   1400   test.divide(APFloat(APFloat::PPCDoubleDouble, "3.0"), APFloat::rmNearestTiesToEven);
   1401   EXPECT_EQ(0x3fd5555555555555ull, test.bitcastToAPInt().getRawData()[0]);
   1402   EXPECT_EQ(0x3c75555555555556ull, test.bitcastToAPInt().getRawData()[1]);
   1403 
   1404   // LDBL_MAX
   1405   test = APFloat(APFloat::PPCDoubleDouble, "1.79769313486231580793728971405301e+308");
   1406   EXPECT_EQ(0x7fefffffffffffffull, test.bitcastToAPInt().getRawData()[0]);
   1407   EXPECT_EQ(0x7c8ffffffffffffeull, test.bitcastToAPInt().getRawData()[1]);
   1408 
   1409   // LDBL_MIN
   1410   test = APFloat(APFloat::PPCDoubleDouble, "2.00416836000897277799610805135016e-292");
   1411   EXPECT_EQ(0x0360000000000000ull, test.bitcastToAPInt().getRawData()[0]);
   1412   EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
   1413 
   1414   test = APFloat(APFloat::PPCDoubleDouble, "1.0");
   1415   test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-105"), APFloat::rmNearestTiesToEven);
   1416   EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
   1417   EXPECT_EQ(0x3960000000000000ull, test.bitcastToAPInt().getRawData()[1]);
   1418 
   1419   test = APFloat(APFloat::PPCDoubleDouble, "1.0");
   1420   test.add(APFloat(APFloat::PPCDoubleDouble, "0x1p-106"), APFloat::rmNearestTiesToEven);
   1421   EXPECT_EQ(0x3ff0000000000000ull, test.bitcastToAPInt().getRawData()[0]);
   1422 #if 0 // XFAIL
   1423   // This is what we would expect with a true double-double implementation
   1424   EXPECT_EQ(0x3950000000000000ull, test.bitcastToAPInt().getRawData()[1]);
   1425 #else
   1426   // This is what we get with our 106-bit mantissa approximation
   1427   EXPECT_EQ(0x0000000000000000ull, test.bitcastToAPInt().getRawData()[1]);
   1428 #endif
   1429 }
   1430 
   1431 TEST(APFloatTest, isNegative) {
   1432   APFloat t(APFloat::IEEEsingle, "0x1p+0");
   1433   EXPECT_FALSE(t.isNegative());
   1434   t = APFloat(APFloat::IEEEsingle, "-0x1p+0");
   1435   EXPECT_TRUE(t.isNegative());
   1436 
   1437   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNegative());
   1438   EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, true).isNegative());
   1439 
   1440   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNegative());
   1441   EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, true).isNegative());
   1442 
   1443   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNegative());
   1444   EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, true).isNegative());
   1445 
   1446   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNegative());
   1447   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, true).isNegative());
   1448 }
   1449 
   1450 TEST(APFloatTest, isNormal) {
   1451   APFloat t(APFloat::IEEEsingle, "0x1p+0");
   1452   EXPECT_TRUE(t.isNormal());
   1453 
   1454   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNormal());
   1455   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNormal());
   1456   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isNormal());
   1457   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNormal());
   1458   EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNormal());
   1459 }
   1460 
   1461 TEST(APFloatTest, isFinite) {
   1462   APFloat t(APFloat::IEEEsingle, "0x1p+0");
   1463   EXPECT_TRUE(t.isFinite());
   1464   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFinite());
   1465   EXPECT_TRUE(APFloat::getZero(APFloat::IEEEsingle, false).isFinite());
   1466   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFinite());
   1467   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFinite());
   1468   EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFinite());
   1469 }
   1470 
   1471 TEST(APFloatTest, isInfinity) {
   1472   APFloat t(APFloat::IEEEsingle, "0x1p+0");
   1473   EXPECT_FALSE(t.isInfinity());
   1474   EXPECT_TRUE(APFloat::getInf(APFloat::IEEEsingle, false).isInfinity());
   1475   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isInfinity());
   1476   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isInfinity());
   1477   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isInfinity());
   1478   EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isInfinity());
   1479 }
   1480 
   1481 TEST(APFloatTest, isNaN) {
   1482   APFloat t(APFloat::IEEEsingle, "0x1p+0");
   1483   EXPECT_FALSE(t.isNaN());
   1484   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isNaN());
   1485   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isNaN());
   1486   EXPECT_TRUE(APFloat::getNaN(APFloat::IEEEsingle, false).isNaN());
   1487   EXPECT_TRUE(APFloat::getSNaN(APFloat::IEEEsingle, false).isNaN());
   1488   EXPECT_FALSE(APFloat(APFloat::IEEEsingle, "0x1p-149").isNaN());
   1489 }
   1490 
   1491 TEST(APFloatTest, isFiniteNonZero) {
   1492   // Test positive/negative normal value.
   1493   EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p+0").isFiniteNonZero());
   1494   EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p+0").isFiniteNonZero());
   1495 
   1496   // Test positive/negative denormal value.
   1497   EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "0x1p-149").isFiniteNonZero());
   1498   EXPECT_TRUE(APFloat(APFloat::IEEEsingle, "-0x1p-149").isFiniteNonZero());
   1499 
   1500   // Test +/- Infinity.
   1501   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, false).isFiniteNonZero());
   1502   EXPECT_FALSE(APFloat::getInf(APFloat::IEEEsingle, true).isFiniteNonZero());
   1503 
   1504   // Test +/- Zero.
   1505   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, false).isFiniteNonZero());
   1506   EXPECT_FALSE(APFloat::getZero(APFloat::IEEEsingle, true).isFiniteNonZero());
   1507 
   1508   // Test +/- qNaN. +/- dont mean anything with qNaN but paranoia can't hurt in
   1509   // this instance.
   1510   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
   1511   EXPECT_FALSE(APFloat::getNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
   1512 
   1513   // Test +/- sNaN. +/- dont mean anything with sNaN but paranoia can't hurt in
   1514   // this instance.
   1515   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, false).isFiniteNonZero());
   1516   EXPECT_FALSE(APFloat::getSNaN(APFloat::IEEEsingle, true).isFiniteNonZero());
   1517 }
   1518 
   1519 TEST(APFloatTest, add) {
   1520   // Test Special Cases against each other and normal values.
   1521 
   1522   // TODOS/NOTES:
   1523   // 1. Since we perform only default exception handling all operations with
   1524   // signaling NaNs should have a result that is a quiet NaN. Currently they
   1525   // return sNaN.
   1526 
   1527   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
   1528   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
   1529   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
   1530   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
   1531   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
   1532   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
   1533   APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
   1534   APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
   1535   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
   1536   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
   1537   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
   1538   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
   1539   APFloat PSmallestNormalized =
   1540     APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
   1541   APFloat MSmallestNormalized =
   1542     APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
   1543 
   1544   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
   1545 
   1546   const unsigned NumTests = 169;
   1547   struct {
   1548     APFloat x;
   1549     APFloat y;
   1550     const char *result;
   1551     int status;
   1552     int category;
   1553   } SpecialCaseTests[NumTests] = {
   1554     { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1555     { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1556     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   1557     { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   1558     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1559 #if 0
   1560     // See Note 1.
   1561     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1562 #endif
   1563     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1564     { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1565     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1566     { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1567     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1568     { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1569     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   1570     { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   1571     { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1572     { MInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1573     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1574     { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1575     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1576 #if 0
   1577     // See Note 1.
   1578     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1579 #endif
   1580     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1581     { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1582     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1583     { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1584     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1585     { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1586     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1587     { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1588     { PZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1589     { PZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1590     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1591     { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1592     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1593 #if 0
   1594     // See Note 1.
   1595     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1596 #endif
   1597     { PZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1598     { PZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1599     { PZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1600     { PZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1601     { PZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1602     { PZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1603     { PZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1604     { PZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1605     { MZero, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1606     { MZero, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1607     { MZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1608     { MZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   1609     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1610 #if 0
   1611     // See Note 1.
   1612     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1613 #endif
   1614     { MZero, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1615     { MZero, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1616     { MZero, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1617     { MZero, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1618     { MZero, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1619     { MZero, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1620     { MZero, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1621     { MZero, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1622     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
   1623     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
   1624     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
   1625     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
   1626     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1627 #if 0
   1628     // See Note 1.
   1629     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1630 #endif
   1631     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1632     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1633     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1634     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1635     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1636     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1637     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   1638     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   1639 #if 0
   1640     // See Note 1.
   1641     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1642     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1643     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1644     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1645     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1646     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1647     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1648     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1649     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1650     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1651     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1652     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1653     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1654     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1655 #endif
   1656     { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1657     { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1658     { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1659     { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1660     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1661 #if 0
   1662     // See Note 1.
   1663     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1664 #endif
   1665     { PNormalValue, PNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
   1666     { PNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1667     { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1668     { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1669     { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1670     { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1671     { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1672     { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1673     { MNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1674     { MNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1675     { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1676     { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1677     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1678 #if 0
   1679     // See Note 1.
   1680     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1681 #endif
   1682     { MNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1683     { MNormalValue, MNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
   1684     { MNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1685     { MNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1686     { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1687     { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1688     { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1689     { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1690     { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1691     { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1692     { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1693     { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1694     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1695 #if 0
   1696     // See Note 1.
   1697     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1698 #endif
   1699     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1700     { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1701     { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   1702     { PLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1703     { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1704     { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1705     { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1706     { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1707     { MLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1708     { MLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1709     { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1710     { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1711     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1712 #if 0
   1713     // See Note 1.
   1714     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1715 #endif
   1716     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1717     { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1718     { MLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1719     { MLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   1720     { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1721     { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1722     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1723     { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1724     { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1725     { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1726     { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1727     { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1728     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1729 #if 0
   1730     // See Note 1.
   1731     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1732 #endif
   1733     { PSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1734     { PSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1735     { PSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1736     { PSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1737     { PSmallestValue, PSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
   1738     { PSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1739     { PSmallestValue, PSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   1740     { PSmallestValue, MSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   1741     { MSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1742     { MSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1743     { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1744     { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1745     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1746 #if 0
   1747     // See Note 1.
   1748     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1749 #endif
   1750     { MSmallestValue, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1751     { MSmallestValue, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1752     { MSmallestValue, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1753     { MSmallestValue, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1754     { MSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1755     { MSmallestValue, MSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
   1756     { MSmallestValue, PSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   1757     { MSmallestValue, MSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   1758     { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1759     { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1760     { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1761     { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1762     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1763 #if 0
   1764 // See Note 1.
   1765     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1766 #endif
   1767     { PSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1768     { PSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1769     { PSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1770     { PSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1771     { PSmallestNormalized, PSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   1772     { PSmallestNormalized, MSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   1773     { PSmallestNormalized, PSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
   1774     { PSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1775     { MSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1776     { MSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1777     { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1778     { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1779     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1780 #if 0
   1781     // See Note 1.
   1782     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1783 #endif
   1784     { MSmallestNormalized, PNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1785     { MSmallestNormalized, MNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1786     { MSmallestNormalized, PLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1787     { MSmallestNormalized, MLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1788     { MSmallestNormalized, PSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   1789     { MSmallestNormalized, MSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   1790     { MSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1791     { MSmallestNormalized, MSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal }
   1792   };
   1793 
   1794   for (size_t i = 0; i < NumTests; ++i) {
   1795     APFloat x(SpecialCaseTests[i].x);
   1796     APFloat y(SpecialCaseTests[i].y);
   1797     APFloat::opStatus status = x.add(y, APFloat::rmNearestTiesToEven);
   1798 
   1799     APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
   1800 
   1801     EXPECT_TRUE(result.bitwiseIsEqual(x));
   1802     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
   1803     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
   1804   }
   1805 }
   1806 
   1807 TEST(APFloatTest, subtract) {
   1808   // Test Special Cases against each other and normal values.
   1809 
   1810   // TODOS/NOTES:
   1811   // 1. Since we perform only default exception handling all operations with
   1812   // signaling NaNs should have a result that is a quiet NaN. Currently they
   1813   // return sNaN.
   1814 
   1815   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
   1816   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
   1817   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
   1818   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
   1819   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
   1820   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
   1821   APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
   1822   APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
   1823   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
   1824   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
   1825   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
   1826   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
   1827   APFloat PSmallestNormalized =
   1828     APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
   1829   APFloat MSmallestNormalized =
   1830     APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
   1831 
   1832   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
   1833 
   1834   const unsigned NumTests = 169;
   1835   struct {
   1836     APFloat x;
   1837     APFloat y;
   1838     const char *result;
   1839     int status;
   1840     int category;
   1841   } SpecialCaseTests[NumTests] = {
   1842     { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1843     { PInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1844     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   1845     { PInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   1846     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1847 #if 0
   1848 // See Note 1.
   1849     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1850 #endif
   1851     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1852     { PInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1853     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1854     { PInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1855     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1856     { PInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   1857     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   1858     { PInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   1859     { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1860     { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1861     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1862     { MInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1863     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1864 #if 0
   1865 // See Note 1.
   1866     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1867 #endif
   1868     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1869     { MInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1870     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1871     { MInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1872     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1873     { MInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1874     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1875     { MInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1876     { PZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1877     { PZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1878     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1879     { PZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1880     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1881 #if 0
   1882 // See Note 1.
   1883     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1884 #endif
   1885     { PZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1886     { PZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1887     { PZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1888     { PZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1889     { PZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1890     { PZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1891     { PZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1892     { PZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1893     { MZero, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1894     { MZero, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1895     { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   1896     { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1897     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1898 #if 0
   1899 // See Note 1.
   1900     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1901 #endif
   1902     { MZero, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1903     { MZero, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1904     { MZero, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1905     { MZero, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1906     { MZero, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1907     { MZero, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   1908     { MZero, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1909     { MZero, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   1910     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
   1911     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
   1912     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
   1913     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
   1914     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1915 #if 0
   1916 // See Note 1.
   1917     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1918 #endif
   1919     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1920     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1921     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1922     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1923     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1924     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   1925     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   1926     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   1927 #if 0
   1928 // See Note 1.
   1929     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1930     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1931     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1932     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1933     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1934     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1935     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1936     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1937     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1938     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1939     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1940     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1941     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1942     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1943 #endif
   1944     { PNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1945     { PNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1946     { PNormalValue, PZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1947     { PNormalValue, MZero, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1948     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1949 #if 0
   1950 // See Note 1.
   1951     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1952 #endif
   1953     { PNormalValue, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1954     { PNormalValue, MNormalValue, "0x1p+1", APFloat::opOK, APFloat::fcNormal },
   1955     { PNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1956     { PNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1957     { PNormalValue, PSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1958     { PNormalValue, MSmallestValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1959     { PNormalValue, PSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1960     { PNormalValue, MSmallestNormalized, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1961     { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1962     { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1963     { MNormalValue, PZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1964     { MNormalValue, MZero, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   1965     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1966 #if 0
   1967 // See Note 1.
   1968     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1969 #endif
   1970     { MNormalValue, PNormalValue, "-0x1p+1", APFloat::opOK, APFloat::fcNormal },
   1971     { MNormalValue, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1972     { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1973     { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1974     { MNormalValue, PSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1975     { MNormalValue, MSmallestValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1976     { MNormalValue, PSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1977     { MNormalValue, MSmallestNormalized, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   1978     { PLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1979     { PLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1980     { PLargestValue, PZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1981     { PLargestValue, MZero, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1982     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   1983 #if 0
   1984 // See Note 1.
   1985     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   1986 #endif
   1987     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1988     { PLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1989     { PLargestValue, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   1990     { PLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   1991     { PLargestValue, PSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1992     { PLargestValue, MSmallestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1993     { PLargestValue, PSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1994     { PLargestValue, MSmallestNormalized, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   1995     { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   1996     { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   1997     { MLargestValue, PZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1998     { MLargestValue, MZero, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   1999     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2000 #if 0
   2001 // See Note 1.
   2002     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2003 #endif
   2004     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2005     { MLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2006     { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2007     { MLargestValue, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2008     { MLargestValue, PSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2009     { MLargestValue, MSmallestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2010     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2011     { MLargestValue, MSmallestNormalized, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2012     { PSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2013     { PSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2014     { PSmallestValue, PZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2015     { PSmallestValue, MZero, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2016     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2017 #if 0
   2018 // See Note 1.
   2019     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2020 #endif
   2021     { PSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2022     { PSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2023     { PSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2024     { PSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2025     { PSmallestValue, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2026     { PSmallestValue, MSmallestValue, "0x1p-148", APFloat::opOK, APFloat::fcNormal },
   2027     { PSmallestValue, PSmallestNormalized, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   2028     { PSmallestValue, MSmallestNormalized, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   2029     { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2030     { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2031     { MSmallestValue, PZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2032     { MSmallestValue, MZero, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2033     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2034 #if 0
   2035 // See Note 1.
   2036     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2037 #endif
   2038     { MSmallestValue, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2039     { MSmallestValue, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2040     { MSmallestValue, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2041     { MSmallestValue, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2042     { MSmallestValue, PSmallestValue, "-0x1p-148", APFloat::opOK, APFloat::fcNormal },
   2043     { MSmallestValue, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2044     { MSmallestValue, PSmallestNormalized, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   2045     { MSmallestValue, MSmallestNormalized, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   2046     { PSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2047     { PSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2048     { PSmallestNormalized, PZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2049     { PSmallestNormalized, MZero, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2050     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2051 #if 0
   2052 // See Note 1.
   2053     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2054 #endif
   2055     { PSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2056     { PSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2057     { PSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2058     { PSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2059     { PSmallestNormalized, PSmallestValue, "0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   2060     { PSmallestNormalized, MSmallestValue, "0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   2061     { PSmallestNormalized, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2062     { PSmallestNormalized, MSmallestNormalized, "0x1p-125", APFloat::opOK, APFloat::fcNormal },
   2063     { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2064     { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2065     { MSmallestNormalized, PZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2066     { MSmallestNormalized, MZero, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2067     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2068 #if 0
   2069 // See Note 1.
   2070     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2071 #endif
   2072     { MSmallestNormalized, PNormalValue, "-0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2073     { MSmallestNormalized, MNormalValue, "0x1p+0", APFloat::opInexact, APFloat::fcNormal },
   2074     { MSmallestNormalized, PLargestValue, "-0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2075     { MSmallestNormalized, MLargestValue, "0x1.fffffep+127", APFloat::opInexact, APFloat::fcNormal },
   2076     { MSmallestNormalized, PSmallestValue, "-0x1.000002p-126", APFloat::opOK, APFloat::fcNormal },
   2077     { MSmallestNormalized, MSmallestValue, "-0x1.fffffcp-127", APFloat::opOK, APFloat::fcNormal },
   2078     { MSmallestNormalized, PSmallestNormalized, "-0x1p-125", APFloat::opOK, APFloat::fcNormal },
   2079     { MSmallestNormalized, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero }
   2080   };
   2081 
   2082   for (size_t i = 0; i < NumTests; ++i) {
   2083     APFloat x(SpecialCaseTests[i].x);
   2084     APFloat y(SpecialCaseTests[i].y);
   2085     APFloat::opStatus status = x.subtract(y, APFloat::rmNearestTiesToEven);
   2086 
   2087     APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
   2088 
   2089     EXPECT_TRUE(result.bitwiseIsEqual(x));
   2090     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
   2091     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
   2092   }
   2093 }
   2094 
   2095 TEST(APFloatTest, multiply) {
   2096   // Test Special Cases against each other and normal values.
   2097 
   2098   // TODOS/NOTES:
   2099   // 1. Since we perform only default exception handling all operations with
   2100   // signaling NaNs should have a result that is a quiet NaN. Currently they
   2101   // return sNaN.
   2102 
   2103   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
   2104   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
   2105   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
   2106   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
   2107   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
   2108   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
   2109   APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
   2110   APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
   2111   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
   2112   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
   2113   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
   2114   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
   2115   APFloat PSmallestNormalized =
   2116     APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
   2117   APFloat MSmallestNormalized =
   2118     APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
   2119 
   2120   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
   2121   const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
   2122 
   2123   const unsigned NumTests = 169;
   2124   struct {
   2125     APFloat x;
   2126     APFloat y;
   2127     const char *result;
   2128     int status;
   2129     int category;
   2130   } SpecialCaseTests[NumTests] = {
   2131     { PInf, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2132     { PInf, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2133     { PInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2134     { PInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2135     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2136 #if 0
   2137 // See Note 1.
   2138     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2139 #endif
   2140     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2141     { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2142     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2143     { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2144     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2145     { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2146     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   2147     { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2148     { MInf, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2149     { MInf, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2150     { MInf, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2151     { MInf, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2152     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2153 #if 0
   2154 // See Note 1.
   2155     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2156 #endif
   2157     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2158     { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2159     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2160     { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2161     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2162     { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2163     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2164     { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   2165     { PZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2166     { PZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2167     { PZero, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2168     { PZero, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2169     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2170 #if 0
   2171 // See Note 1.
   2172     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2173 #endif
   2174     { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2175     { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2176     { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2177     { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2178     { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2179     { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2180     { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2181     { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2182     { MZero, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2183     { MZero, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2184     { MZero, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2185     { MZero, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2186     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2187 #if 0
   2188 // See Note 1.
   2189     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2190 #endif
   2191     { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2192     { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2193     { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2194     { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2195     { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2196     { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2197     { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2198     { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2199     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
   2200     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
   2201     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
   2202     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
   2203     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2204 #if 0
   2205 // See Note 1.
   2206     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2207 #endif
   2208     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2209     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2210     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2211     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2212     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2213     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2214     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   2215     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   2216 #if 0
   2217 // See Note 1.
   2218     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2219     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2220     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2221     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2222     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2223     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2224     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2225     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2226     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2227     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2228     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2229     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2230     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2231     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2232 #endif
   2233     { PNormalValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2234     { PNormalValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2235     { PNormalValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2236     { PNormalValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2237     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2238 #if 0
   2239 // See Note 1.
   2240     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2241 #endif
   2242     { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2243     { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2244     { PNormalValue, PLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2245     { PNormalValue, MLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2246     { PNormalValue, PSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2247     { PNormalValue, MSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2248     { PNormalValue, PSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2249     { PNormalValue, MSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2250     { MNormalValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2251     { MNormalValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2252     { MNormalValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2253     { MNormalValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2254     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2255 #if 0
   2256 // See Note 1.
   2257     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2258 #endif
   2259     { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2260     { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2261     { MNormalValue, PLargestValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2262     { MNormalValue, MLargestValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2263     { MNormalValue, PSmallestValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2264     { MNormalValue, MSmallestValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2265     { MNormalValue, PSmallestNormalized, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2266     { MNormalValue, MSmallestNormalized, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2267     { PLargestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2268     { PLargestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2269     { PLargestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2270     { PLargestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2271     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2272 #if 0
   2273 // See Note 1.
   2274     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2275 #endif
   2276     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2277     { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2278     { PLargestValue, PLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2279     { PLargestValue, MLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2280     { PLargestValue, PSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2281     { PLargestValue, MSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2282     { PLargestValue, PSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2283     { PLargestValue, MSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2284     { MLargestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2285     { MLargestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2286     { MLargestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2287     { MLargestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2288     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2289 #if 0
   2290 // See Note 1.
   2291     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2292 #endif
   2293     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2294     { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2295     { MLargestValue, PLargestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2296     { MLargestValue, MLargestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2297     { MLargestValue, PSmallestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2298     { MLargestValue, MSmallestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2299     { MLargestValue, PSmallestNormalized, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2300     { MLargestValue, MSmallestNormalized, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2301     { PSmallestValue, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2302     { PSmallestValue, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2303     { PSmallestValue, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2304     { PSmallestValue, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2305     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2306 #if 0
   2307 // See Note 1.
   2308     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2309 #endif
   2310     { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2311     { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2312     { PSmallestValue, PLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2313     { PSmallestValue, MLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2314     { PSmallestValue, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2315     { PSmallestValue, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2316     { PSmallestValue, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2317     { PSmallestValue, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2318     { MSmallestValue, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2319     { MSmallestValue, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2320     { MSmallestValue, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2321     { MSmallestValue, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2322     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2323 #if 0
   2324 // See Note 1.
   2325     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2326 #endif
   2327     { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2328     { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2329     { MSmallestValue, PLargestValue, "-0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2330     { MSmallestValue, MLargestValue, "0x1.fffffep-22", APFloat::opOK, APFloat::fcNormal },
   2331     { MSmallestValue, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2332     { MSmallestValue, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2333     { MSmallestValue, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2334     { MSmallestValue, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2335     { PSmallestNormalized, PInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2336     { PSmallestNormalized, MInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2337     { PSmallestNormalized, PZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2338     { PSmallestNormalized, MZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2339     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2340 #if 0
   2341 // See Note 1.
   2342     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2343 #endif
   2344     { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2345     { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2346     { PSmallestNormalized, PLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2347     { PSmallestNormalized, MLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2348     { PSmallestNormalized, PSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2349     { PSmallestNormalized, MSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2350     { PSmallestNormalized, PSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2351     { PSmallestNormalized, MSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2352     { MSmallestNormalized, PInf, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2353     { MSmallestNormalized, MInf, "inf", APFloat::opOK, APFloat::fcInfinity },
   2354     { MSmallestNormalized, PZero, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2355     { MSmallestNormalized, MZero, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2356     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2357 #if 0
   2358 // See Note 1.
   2359     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2360 #endif
   2361     { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2362     { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2363     { MSmallestNormalized, PLargestValue, "-0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2364     { MSmallestNormalized, MLargestValue, "0x1.fffffep+1", APFloat::opOK, APFloat::fcNormal },
   2365     { MSmallestNormalized, PSmallestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2366     { MSmallestNormalized, MSmallestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2367     { MSmallestNormalized, PSmallestNormalized, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2368     { MSmallestNormalized, MSmallestNormalized, "0x0p+0", UnderflowStatus, APFloat::fcZero }
   2369   };
   2370 
   2371   for (size_t i = 0; i < NumTests; ++i) {
   2372     APFloat x(SpecialCaseTests[i].x);
   2373     APFloat y(SpecialCaseTests[i].y);
   2374     APFloat::opStatus status = x.multiply(y, APFloat::rmNearestTiesToEven);
   2375 
   2376     APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
   2377 
   2378     EXPECT_TRUE(result.bitwiseIsEqual(x));
   2379     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
   2380     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
   2381   }
   2382 }
   2383 
   2384 TEST(APFloatTest, divide) {
   2385   // Test Special Cases against each other and normal values.
   2386 
   2387   // TODOS/NOTES:
   2388   // 1. Since we perform only default exception handling all operations with
   2389   // signaling NaNs should have a result that is a quiet NaN. Currently they
   2390   // return sNaN.
   2391 
   2392   APFloat PInf = APFloat::getInf(APFloat::IEEEsingle, false);
   2393   APFloat MInf = APFloat::getInf(APFloat::IEEEsingle, true);
   2394   APFloat PZero = APFloat::getZero(APFloat::IEEEsingle, false);
   2395   APFloat MZero = APFloat::getZero(APFloat::IEEEsingle, true);
   2396   APFloat QNaN = APFloat::getNaN(APFloat::IEEEsingle, false);
   2397   APFloat SNaN = APFloat::getSNaN(APFloat::IEEEsingle, false);
   2398   APFloat PNormalValue = APFloat(APFloat::IEEEsingle, "0x1p+0");
   2399   APFloat MNormalValue = APFloat(APFloat::IEEEsingle, "-0x1p+0");
   2400   APFloat PLargestValue = APFloat::getLargest(APFloat::IEEEsingle, false);
   2401   APFloat MLargestValue = APFloat::getLargest(APFloat::IEEEsingle, true);
   2402   APFloat PSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, false);
   2403   APFloat MSmallestValue = APFloat::getSmallest(APFloat::IEEEsingle, true);
   2404   APFloat PSmallestNormalized =
   2405     APFloat::getSmallestNormalized(APFloat::IEEEsingle, false);
   2406   APFloat MSmallestNormalized =
   2407     APFloat::getSmallestNormalized(APFloat::IEEEsingle, true);
   2408 
   2409   const int OverflowStatus = APFloat::opOverflow | APFloat::opInexact;
   2410   const int UnderflowStatus = APFloat::opUnderflow | APFloat::opInexact;
   2411 
   2412   const unsigned NumTests = 169;
   2413   struct {
   2414     APFloat x;
   2415     APFloat y;
   2416     const char *result;
   2417     int status;
   2418     int category;
   2419   } SpecialCaseTests[NumTests] = {
   2420     { PInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2421     { PInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2422     { PInf, PZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   2423     { PInf, MZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2424     { PInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2425 #if 0
   2426 // See Note 1.
   2427     { PInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2428 #endif
   2429     { PInf, PNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2430     { PInf, MNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2431     { PInf, PLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2432     { PInf, MLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2433     { PInf, PSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2434     { PInf, MSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2435     { PInf, PSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   2436     { PInf, MSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2437     { MInf, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2438     { MInf, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2439     { MInf, PZero, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2440     { MInf, MZero, "inf", APFloat::opOK, APFloat::fcInfinity },
   2441     { MInf, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2442 #if 0
   2443 // See Note 1.
   2444     { MInf, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2445 #endif
   2446     { MInf, PNormalValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2447     { MInf, MNormalValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2448     { MInf, PLargestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2449     { MInf, MLargestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2450     { MInf, PSmallestValue, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2451     { MInf, MSmallestValue, "inf", APFloat::opOK, APFloat::fcInfinity },
   2452     { MInf, PSmallestNormalized, "-inf", APFloat::opOK, APFloat::fcInfinity },
   2453     { MInf, MSmallestNormalized, "inf", APFloat::opOK, APFloat::fcInfinity },
   2454     { PZero, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2455     { PZero, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2456     { PZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2457     { PZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2458     { PZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2459 #if 0
   2460 // See Note 1.
   2461     { PZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2462 #endif
   2463     { PZero, PNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2464     { PZero, MNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2465     { PZero, PLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2466     { PZero, MLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2467     { PZero, PSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2468     { PZero, MSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2469     { PZero, PSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2470     { PZero, MSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2471     { MZero, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2472     { MZero, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2473     { MZero, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2474     { MZero, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2475     { MZero, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2476 #if 0
   2477 // See Note 1.
   2478     { MZero, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2479 #endif
   2480     { MZero, PNormalValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2481     { MZero, MNormalValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2482     { MZero, PLargestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2483     { MZero, MLargestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2484     { MZero, PSmallestValue, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2485     { MZero, MSmallestValue, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2486     { MZero, PSmallestNormalized, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2487     { MZero, MSmallestNormalized, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2488     { QNaN, PInf, "nan", APFloat::opOK, APFloat::fcNaN },
   2489     { QNaN, MInf, "nan", APFloat::opOK, APFloat::fcNaN },
   2490     { QNaN, PZero, "nan", APFloat::opOK, APFloat::fcNaN },
   2491     { QNaN, MZero, "nan", APFloat::opOK, APFloat::fcNaN },
   2492     { QNaN, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2493 #if 0
   2494 // See Note 1.
   2495     { QNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2496 #endif
   2497     { QNaN, PNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2498     { QNaN, MNormalValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2499     { QNaN, PLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2500     { QNaN, MLargestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2501     { QNaN, PSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2502     { QNaN, MSmallestValue, "nan", APFloat::opOK, APFloat::fcNaN },
   2503     { QNaN, PSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   2504     { QNaN, MSmallestNormalized, "nan", APFloat::opOK, APFloat::fcNaN },
   2505 #if 0
   2506 // See Note 1.
   2507     { SNaN, PInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2508     { SNaN, MInf, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2509     { SNaN, PZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2510     { SNaN, MZero, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2511     { SNaN, QNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2512     { SNaN, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2513     { SNaN, PNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2514     { SNaN, MNormalValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2515     { SNaN, PLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2516     { SNaN, MLargestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2517     { SNaN, PSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2518     { SNaN, MSmallestValue, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2519     { SNaN, PSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2520     { SNaN, MSmallestNormalized, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2521 #endif
   2522     { PNormalValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2523     { PNormalValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2524     { PNormalValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2525     { PNormalValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2526     { PNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2527 #if 0
   2528 // See Note 1.
   2529     { PNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2530 #endif
   2531     { PNormalValue, PNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2532     { PNormalValue, MNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2533     { PNormalValue, PLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
   2534     { PNormalValue, MLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
   2535     { PNormalValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2536     { PNormalValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2537     { PNormalValue, PSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
   2538     { PNormalValue, MSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
   2539     { MNormalValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2540     { MNormalValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2541     { MNormalValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2542     { MNormalValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2543     { MNormalValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2544 #if 0
   2545 // See Note 1.
   2546     { MNormalValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2547 #endif
   2548     { MNormalValue, PNormalValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2549     { MNormalValue, MNormalValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2550     { MNormalValue, PLargestValue, "-0x1p-128", UnderflowStatus, APFloat::fcNormal },
   2551     { MNormalValue, MLargestValue, "0x1p-128", UnderflowStatus, APFloat::fcNormal },
   2552     { MNormalValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2553     { MNormalValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2554     { MNormalValue, PSmallestNormalized, "-0x1p+126", APFloat::opOK, APFloat::fcNormal },
   2555     { MNormalValue, MSmallestNormalized, "0x1p+126", APFloat::opOK, APFloat::fcNormal },
   2556     { PLargestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2557     { PLargestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2558     { PLargestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2559     { PLargestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2560     { PLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2561 #if 0
   2562 // See Note 1.
   2563     { PLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2564 #endif
   2565     { PLargestValue, PNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2566     { PLargestValue, MNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2567     { PLargestValue, PLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2568     { PLargestValue, MLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2569     { PLargestValue, PSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2570     { PLargestValue, MSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2571     { PLargestValue, PSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
   2572     { PLargestValue, MSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
   2573     { MLargestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2574     { MLargestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2575     { MLargestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2576     { MLargestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2577     { MLargestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2578 #if 0
   2579 // See Note 1.
   2580     { MLargestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2581 #endif
   2582     { MLargestValue, PNormalValue, "-0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2583     { MLargestValue, MNormalValue, "0x1.fffffep+127", APFloat::opOK, APFloat::fcNormal },
   2584     { MLargestValue, PLargestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2585     { MLargestValue, MLargestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2586     { MLargestValue, PSmallestValue, "-inf", OverflowStatus, APFloat::fcInfinity },
   2587     { MLargestValue, MSmallestValue, "inf", OverflowStatus, APFloat::fcInfinity },
   2588     { MLargestValue, PSmallestNormalized, "-inf", OverflowStatus, APFloat::fcInfinity },
   2589     { MLargestValue, MSmallestNormalized, "inf", OverflowStatus, APFloat::fcInfinity },
   2590     { PSmallestValue, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2591     { PSmallestValue, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2592     { PSmallestValue, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2593     { PSmallestValue, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2594     { PSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2595 #if 0
   2596 // See Note 1.
   2597     { PSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2598 #endif
   2599     { PSmallestValue, PNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2600     { PSmallestValue, MNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2601     { PSmallestValue, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2602     { PSmallestValue, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2603     { PSmallestValue, PSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2604     { PSmallestValue, MSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2605     { PSmallestValue, PSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
   2606     { PSmallestValue, MSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
   2607     { MSmallestValue, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2608     { MSmallestValue, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2609     { MSmallestValue, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2610     { MSmallestValue, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2611     { MSmallestValue, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2612 #if 0
   2613 // See Note 1.
   2614     { MSmallestValue, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2615 #endif
   2616     { MSmallestValue, PNormalValue, "-0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2617     { MSmallestValue, MNormalValue, "0x1p-149", APFloat::opOK, APFloat::fcNormal },
   2618     { MSmallestValue, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2619     { MSmallestValue, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2620     { MSmallestValue, PSmallestValue, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2621     { MSmallestValue, MSmallestValue, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2622     { MSmallestValue, PSmallestNormalized, "-0x1p-23", APFloat::opOK, APFloat::fcNormal },
   2623     { MSmallestValue, MSmallestNormalized, "0x1p-23", APFloat::opOK, APFloat::fcNormal },
   2624     { PSmallestNormalized, PInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2625     { PSmallestNormalized, MInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2626     { PSmallestNormalized, PZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2627     { PSmallestNormalized, MZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2628     { PSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2629 #if 0
   2630 // See Note 1.
   2631     { PSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2632 #endif
   2633     { PSmallestNormalized, PNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2634     { PSmallestNormalized, MNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2635     { PSmallestNormalized, PLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2636     { PSmallestNormalized, MLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2637     { PSmallestNormalized, PSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
   2638     { PSmallestNormalized, MSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
   2639     { PSmallestNormalized, PSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2640     { PSmallestNormalized, MSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2641     { MSmallestNormalized, PInf, "-0x0p+0", APFloat::opOK, APFloat::fcZero },
   2642     { MSmallestNormalized, MInf, "0x0p+0", APFloat::opOK, APFloat::fcZero },
   2643     { MSmallestNormalized, PZero, "-inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2644     { MSmallestNormalized, MZero, "inf", APFloat::opDivByZero, APFloat::fcInfinity },
   2645     { MSmallestNormalized, QNaN, "nan", APFloat::opOK, APFloat::fcNaN },
   2646 #if 0
   2647 // See Note 1.
   2648     { MSmallestNormalized, SNaN, "nan", APFloat::opInvalidOp, APFloat::fcNaN },
   2649 #endif
   2650     { MSmallestNormalized, PNormalValue, "-0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2651     { MSmallestNormalized, MNormalValue, "0x1p-126", APFloat::opOK, APFloat::fcNormal },
   2652     { MSmallestNormalized, PLargestValue, "-0x0p+0", UnderflowStatus, APFloat::fcZero },
   2653     { MSmallestNormalized, MLargestValue, "0x0p+0", UnderflowStatus, APFloat::fcZero },
   2654     { MSmallestNormalized, PSmallestValue, "-0x1p+23", APFloat::opOK, APFloat::fcNormal },
   2655     { MSmallestNormalized, MSmallestValue, "0x1p+23", APFloat::opOK, APFloat::fcNormal },
   2656     { MSmallestNormalized, PSmallestNormalized, "-0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2657     { MSmallestNormalized, MSmallestNormalized, "0x1p+0", APFloat::opOK, APFloat::fcNormal },
   2658   };
   2659 
   2660   for (size_t i = 0; i < NumTests; ++i) {
   2661     APFloat x(SpecialCaseTests[i].x);
   2662     APFloat y(SpecialCaseTests[i].y);
   2663     APFloat::opStatus status = x.divide(y, APFloat::rmNearestTiesToEven);
   2664 
   2665     APFloat result(APFloat::IEEEsingle, SpecialCaseTests[i].result);
   2666 
   2667     EXPECT_TRUE(result.bitwiseIsEqual(x));
   2668     EXPECT_TRUE((int)status == SpecialCaseTests[i].status);
   2669     EXPECT_TRUE((int)x.getCategory() == SpecialCaseTests[i].category);
   2670   }
   2671 }
   2672 
   2673 }
   2674