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