xref: /llvm-project/llvm/unittests/ADT/APFixedPointTest.cpp (revision 255a99c29f9fa1a89b03a85a3a73d6f44d03c6c1)
11a995a0aSBevin Hansson //===- unittests/ADT/FixedPointTest.cpp -- fixed point number tests -----===//
21a995a0aSBevin Hansson //
31a995a0aSBevin Hansson // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
41a995a0aSBevin Hansson // See https://llvm.org/LICENSE.txt for license information.
51a995a0aSBevin Hansson // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61a995a0aSBevin Hansson //
71a995a0aSBevin Hansson //===----------------------------------------------------------------------===//
81a995a0aSBevin Hansson 
91a995a0aSBevin Hansson #include "llvm/ADT/APFixedPoint.h"
10dd3014f3SBevin Hansson #include "llvm/ADT/APFloat.h"
111a995a0aSBevin Hansson #include "llvm/ADT/APSInt.h"
121a995a0aSBevin Hansson #include "gtest/gtest.h"
131a995a0aSBevin Hansson 
141a995a0aSBevin Hansson using llvm::APFixedPoint;
15dd3014f3SBevin Hansson using llvm::APFloat;
161a995a0aSBevin Hansson using llvm::APInt;
171a995a0aSBevin Hansson using llvm::APSInt;
18dd3014f3SBevin Hansson using llvm::FixedPointSemantics;
191a995a0aSBevin Hansson 
201a995a0aSBevin Hansson namespace {
211a995a0aSBevin Hansson 
221a995a0aSBevin Hansson FixedPointSemantics Saturated(FixedPointSemantics Sema) {
231a995a0aSBevin Hansson   Sema.setSaturated(true);
241a995a0aSBevin Hansson   return Sema;
251a995a0aSBevin Hansson }
261a995a0aSBevin Hansson 
271a995a0aSBevin Hansson FixedPointSemantics getSAccumSema() {
281a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/7, /*isSigned=*/true,
291a995a0aSBevin Hansson                              /*isSaturated=*/false,
301a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
311a995a0aSBevin Hansson }
321a995a0aSBevin Hansson 
331a995a0aSBevin Hansson FixedPointSemantics getAccumSema() {
341a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/15, /*isSigned=*/true,
351a995a0aSBevin Hansson                              /*isSaturated=*/false,
361a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
371a995a0aSBevin Hansson }
381a995a0aSBevin Hansson 
391a995a0aSBevin Hansson FixedPointSemantics getLAccumSema() {
401a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/64, /*scale=*/31, /*isSigned=*/true,
411a995a0aSBevin Hansson                              /*isSaturated=*/false,
421a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
431a995a0aSBevin Hansson }
441a995a0aSBevin Hansson 
451a995a0aSBevin Hansson FixedPointSemantics getSFractSema() {
461a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/8, /*scale=*/7, /*isSigned=*/true,
471a995a0aSBevin Hansson                              /*isSaturated=*/false,
481a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
491a995a0aSBevin Hansson }
501a995a0aSBevin Hansson 
511a995a0aSBevin Hansson FixedPointSemantics getFractSema() {
521a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/15, /*isSigned=*/true,
531a995a0aSBevin Hansson                              /*isSaturated=*/false,
541a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
551a995a0aSBevin Hansson }
561a995a0aSBevin Hansson 
571a995a0aSBevin Hansson FixedPointSemantics getLFractSema() {
581a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/31, /*isSigned=*/true,
591a995a0aSBevin Hansson                              /*isSaturated=*/false,
601a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
611a995a0aSBevin Hansson }
621a995a0aSBevin Hansson 
631a995a0aSBevin Hansson FixedPointSemantics getUSAccumSema() {
641a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/8, /*isSigned=*/false,
651a995a0aSBevin Hansson                              /*isSaturated=*/false,
661a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
671a995a0aSBevin Hansson }
681a995a0aSBevin Hansson 
691a995a0aSBevin Hansson FixedPointSemantics getUAccumSema() {
701a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/16, /*isSigned=*/false,
711a995a0aSBevin Hansson                              /*isSaturated=*/false,
721a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
731a995a0aSBevin Hansson }
741a995a0aSBevin Hansson 
751a995a0aSBevin Hansson FixedPointSemantics getULAccumSema() {
761a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/64, /*scale=*/32, /*isSigned=*/false,
771a995a0aSBevin Hansson                              /*isSaturated=*/false,
781a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
791a995a0aSBevin Hansson }
801a995a0aSBevin Hansson 
811a995a0aSBevin Hansson FixedPointSemantics getUSFractSema() {
821a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/8, /*scale=*/8, /*isSigned=*/false,
831a995a0aSBevin Hansson                              /*isSaturated=*/false,
841a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
851a995a0aSBevin Hansson }
861a995a0aSBevin Hansson 
871a995a0aSBevin Hansson FixedPointSemantics getUFractSema() {
881a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/16, /*isSigned=*/false,
891a995a0aSBevin Hansson                              /*isSaturated=*/false,
901a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
911a995a0aSBevin Hansson }
921a995a0aSBevin Hansson 
931a995a0aSBevin Hansson FixedPointSemantics getULFractSema() {
941a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/32, /*isSigned=*/false,
951a995a0aSBevin Hansson                              /*isSaturated=*/false,
961a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/false);
971a995a0aSBevin Hansson }
981a995a0aSBevin Hansson 
991a995a0aSBevin Hansson FixedPointSemantics getPadUSAccumSema() {
1001a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/7, /*isSigned=*/false,
1011a995a0aSBevin Hansson                              /*isSaturated=*/false,
1021a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1031a995a0aSBevin Hansson }
1041a995a0aSBevin Hansson 
1051a995a0aSBevin Hansson FixedPointSemantics getPadUAccumSema() {
1061a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/15, /*isSigned=*/false,
1071a995a0aSBevin Hansson                              /*isSaturated=*/false,
1081a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1091a995a0aSBevin Hansson }
1101a995a0aSBevin Hansson 
1111a995a0aSBevin Hansson FixedPointSemantics getPadULAccumSema() {
1121a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/64, /*scale=*/31, /*isSigned=*/false,
1131a995a0aSBevin Hansson                              /*isSaturated=*/false,
1141a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1151a995a0aSBevin Hansson }
1161a995a0aSBevin Hansson 
1171a995a0aSBevin Hansson FixedPointSemantics getPadUSFractSema() {
1181a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/8, /*scale=*/7, /*isSigned=*/false,
1191a995a0aSBevin Hansson                              /*isSaturated=*/false,
1201a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1211a995a0aSBevin Hansson }
1221a995a0aSBevin Hansson 
1231a995a0aSBevin Hansson FixedPointSemantics getPadUFractSema() {
1241a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/16, /*scale=*/15, /*isSigned=*/false,
1251a995a0aSBevin Hansson                              /*isSaturated=*/false,
1261a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1271a995a0aSBevin Hansson }
1281a995a0aSBevin Hansson 
1291a995a0aSBevin Hansson FixedPointSemantics getPadULFractSema() {
1301a995a0aSBevin Hansson   return FixedPointSemantics(/*width=*/32, /*scale=*/31, /*isSigned=*/false,
1311a995a0aSBevin Hansson                              /*isSaturated=*/false,
1321a995a0aSBevin Hansson                              /*hasUnsignedPadding=*/true);
1331a995a0aSBevin Hansson }
1341a995a0aSBevin Hansson 
1351654b22aSTyker FixedPointSemantics getU8Neg10() {
1361654b22aSTyker   return FixedPointSemantics(/*width=*/8, /*lsb=*/FixedPointSemantics::Lsb{-10},
1371654b22aSTyker                              /*isSigned=*/false,
1381654b22aSTyker                              /*isSaturated=*/false,
1391654b22aSTyker                              /*hasUnsignedPadding=*/false);
1401654b22aSTyker }
1411654b22aSTyker 
1421654b22aSTyker FixedPointSemantics getS16Neg18() {
1431654b22aSTyker   return FixedPointSemantics(/*width=*/16,
1441654b22aSTyker                              /*lsb=*/FixedPointSemantics::Lsb{-18},
1451654b22aSTyker                              /*isSigned=*/true,
1461654b22aSTyker                              /*isSaturated=*/false,
1471654b22aSTyker                              /*hasUnsignedPadding=*/false);
1481654b22aSTyker }
1491654b22aSTyker 
1501654b22aSTyker FixedPointSemantics getU8Pos4() {
1511654b22aSTyker   return FixedPointSemantics(/*width=*/8, /*lsb=*/FixedPointSemantics::Lsb{4},
1521654b22aSTyker                              /*isSigned=*/false,
1531654b22aSTyker                              /*isSaturated=*/false,
1541654b22aSTyker                              /*hasUnsignedPadding=*/false);
1551654b22aSTyker }
1561654b22aSTyker 
1571654b22aSTyker FixedPointSemantics getS32Pos2() {
1581654b22aSTyker   return FixedPointSemantics(/*width=*/32, /*lsb=*/FixedPointSemantics::Lsb{2},
1591654b22aSTyker                              /*isSigned=*/true,
1601654b22aSTyker                              /*isSaturated=*/false,
1611654b22aSTyker                              /*hasUnsignedPadding=*/false);
1621654b22aSTyker }
1631654b22aSTyker 
1641a995a0aSBevin Hansson void CheckUnpaddedMax(const FixedPointSemantics &Sema) {
1651a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint::getMax(Sema).getValue(),
1661a995a0aSBevin Hansson             APSInt::getMaxValue(Sema.getWidth(), !Sema.isSigned()));
1671a995a0aSBevin Hansson }
1681a995a0aSBevin Hansson 
1691a995a0aSBevin Hansson void CheckPaddedMax(const FixedPointSemantics &Sema) {
1701a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint::getMax(Sema).getValue(),
1711a995a0aSBevin Hansson             APSInt::getMaxValue(Sema.getWidth(), !Sema.isSigned()) >> 1);
1721a995a0aSBevin Hansson }
1731a995a0aSBevin Hansson 
1741a995a0aSBevin Hansson void CheckMin(const FixedPointSemantics &Sema) {
1751a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint::getMin(Sema).getValue(),
1761a995a0aSBevin Hansson             APSInt::getMinValue(Sema.getWidth(), !Sema.isSigned()));
1771a995a0aSBevin Hansson }
1781a995a0aSBevin Hansson 
1791a995a0aSBevin Hansson TEST(FixedPointTest, getMax) {
1801a995a0aSBevin Hansson   CheckUnpaddedMax(getSAccumSema());
1811a995a0aSBevin Hansson   CheckUnpaddedMax(getAccumSema());
1821a995a0aSBevin Hansson   CheckUnpaddedMax(getLAccumSema());
1831a995a0aSBevin Hansson   CheckUnpaddedMax(getUSAccumSema());
1841a995a0aSBevin Hansson   CheckUnpaddedMax(getUAccumSema());
1851a995a0aSBevin Hansson   CheckUnpaddedMax(getULAccumSema());
1861a995a0aSBevin Hansson   CheckUnpaddedMax(getSFractSema());
1871a995a0aSBevin Hansson   CheckUnpaddedMax(getFractSema());
1881a995a0aSBevin Hansson   CheckUnpaddedMax(getLFractSema());
1891a995a0aSBevin Hansson   CheckUnpaddedMax(getUSFractSema());
1901a995a0aSBevin Hansson   CheckUnpaddedMax(getUFractSema());
1911a995a0aSBevin Hansson   CheckUnpaddedMax(getULFractSema());
1921654b22aSTyker   CheckUnpaddedMax(getU8Neg10());
1931654b22aSTyker   CheckUnpaddedMax(getS16Neg18());
1941654b22aSTyker   CheckUnpaddedMax(getU8Pos4());
1951654b22aSTyker   CheckUnpaddedMax(getS32Pos2());
1961a995a0aSBevin Hansson 
1971a995a0aSBevin Hansson   CheckPaddedMax(getPadUSAccumSema());
1981a995a0aSBevin Hansson   CheckPaddedMax(getPadUAccumSema());
1991a995a0aSBevin Hansson   CheckPaddedMax(getPadULAccumSema());
2001a995a0aSBevin Hansson   CheckPaddedMax(getPadUSFractSema());
2011a995a0aSBevin Hansson   CheckPaddedMax(getPadUFractSema());
2021a995a0aSBevin Hansson   CheckPaddedMax(getPadULFractSema());
2031a995a0aSBevin Hansson }
2041a995a0aSBevin Hansson 
2051a995a0aSBevin Hansson TEST(FixedPointTest, getMin) {
2061a995a0aSBevin Hansson   CheckMin(getSAccumSema());
2071a995a0aSBevin Hansson   CheckMin(getAccumSema());
2081a995a0aSBevin Hansson   CheckMin(getLAccumSema());
2091a995a0aSBevin Hansson   CheckMin(getUSAccumSema());
2101a995a0aSBevin Hansson   CheckMin(getUAccumSema());
2111a995a0aSBevin Hansson   CheckMin(getULAccumSema());
2121a995a0aSBevin Hansson   CheckMin(getSFractSema());
2131a995a0aSBevin Hansson   CheckMin(getFractSema());
2141a995a0aSBevin Hansson   CheckMin(getLFractSema());
2151a995a0aSBevin Hansson   CheckMin(getUSFractSema());
2161a995a0aSBevin Hansson   CheckMin(getUFractSema());
2171a995a0aSBevin Hansson   CheckMin(getULFractSema());
2181654b22aSTyker   CheckMin(getU8Neg10());
2191654b22aSTyker   CheckMin(getS16Neg18());
2201654b22aSTyker   CheckMin(getU8Pos4());
2211654b22aSTyker   CheckMin(getS32Pos2());
2221a995a0aSBevin Hansson 
2231a995a0aSBevin Hansson   CheckMin(getPadUSAccumSema());
2241a995a0aSBevin Hansson   CheckMin(getPadUAccumSema());
2251a995a0aSBevin Hansson   CheckMin(getPadULAccumSema());
2261a995a0aSBevin Hansson   CheckMin(getPadUSFractSema());
2271a995a0aSBevin Hansson   CheckMin(getPadUFractSema());
2281a995a0aSBevin Hansson   CheckMin(getPadULFractSema());
2291a995a0aSBevin Hansson }
2301a995a0aSBevin Hansson 
2311654b22aSTyker int64_t relativeShr(int64_t Int, int64_t Shift) {
2321654b22aSTyker   return (Shift > 0) ? Int >> Shift : Int << -Shift;
2331654b22aSTyker }
2341654b22aSTyker 
2351a995a0aSBevin Hansson void CheckIntPart(const FixedPointSemantics &Sema, int64_t IntPart) {
2361654b22aSTyker   int64_t FullFactPart =
2371654b22aSTyker       (Sema.getLsbWeight() > 0) ? 0 : (1ULL << (-Sema.getLsbWeight() - 1));
2381a995a0aSBevin Hansson 
2391a995a0aSBevin Hansson   // Value with a fraction
2401654b22aSTyker   APFixedPoint ValWithFract(
2411654b22aSTyker       APInt(Sema.getWidth(),
2421654b22aSTyker             relativeShr(IntPart, Sema.getLsbWeight()) + FullFactPart,
243*255a99c2SNikita Popov             Sema.isSigned(), /*implicitTrunc=*/true),
2441a995a0aSBevin Hansson       Sema);
2451a995a0aSBevin Hansson   ASSERT_EQ(ValWithFract.getIntPart(), IntPart);
2461a995a0aSBevin Hansson 
2471a995a0aSBevin Hansson   // Just fraction
248*255a99c2SNikita Popov   APFixedPoint JustFract(APInt(Sema.getWidth(), FullFactPart, Sema.isSigned(),
249*255a99c2SNikita Popov                                /*implicitTrunc=*/true),
2501654b22aSTyker                          Sema);
2511a995a0aSBevin Hansson   ASSERT_EQ(JustFract.getIntPart(), 0);
2521a995a0aSBevin Hansson 
2531a995a0aSBevin Hansson   // Whole number
2541654b22aSTyker   APFixedPoint WholeNum(APInt(Sema.getWidth(),
2551654b22aSTyker                               relativeShr(IntPart, Sema.getLsbWeight()),
256*255a99c2SNikita Popov                               Sema.isSigned(), /*implicitTrunc=*/true),
2571654b22aSTyker                         Sema);
2581a995a0aSBevin Hansson   ASSERT_EQ(WholeNum.getIntPart(), IntPart);
2591a995a0aSBevin Hansson 
2601a995a0aSBevin Hansson   // Negative
2611a995a0aSBevin Hansson   if (Sema.isSigned()) {
2621654b22aSTyker     APFixedPoint Negative(APInt(Sema.getWidth(),
2631654b22aSTyker                                 relativeShr(IntPart, Sema.getLsbWeight()),
264*255a99c2SNikita Popov                                 Sema.isSigned(), /*implicitTrunc=*/true),
2651654b22aSTyker                           Sema);
2661a995a0aSBevin Hansson     ASSERT_EQ(Negative.getIntPart(), IntPart);
2671a995a0aSBevin Hansson   }
2681a995a0aSBevin Hansson }
2691a995a0aSBevin Hansson 
2701a995a0aSBevin Hansson void CheckIntPartMin(const FixedPointSemantics &Sema, int64_t Expected) {
271b6528152SAntonio Frighetto   EXPECT_TRUE(APSInt::compareValues(APFixedPoint::getMin(Sema).getIntPart(),
272b6528152SAntonio Frighetto                                     APSInt::get(Expected)) == 0);
2731a995a0aSBevin Hansson }
2741a995a0aSBevin Hansson 
2751a995a0aSBevin Hansson void CheckIntPartMax(const FixedPointSemantics &Sema, uint64_t Expected) {
276b6528152SAntonio Frighetto   EXPECT_TRUE(APSInt::compareValues(APFixedPoint::getMax(Sema).getIntPart(),
277b6528152SAntonio Frighetto                                     APSInt::getUnsigned(Expected)) == 0);
2781a995a0aSBevin Hansson }
2791a995a0aSBevin Hansson 
28034bbe654SNico Weber void CheckIntPartRes(const FixedPointSemantics &Sema, int64_t Representation,
28134bbe654SNico Weber                      uint64_t Result) {
2822c7b7ecaSTyker   APFixedPoint Val(Representation, Sema);
283adf29726STyker   ASSERT_EQ(Val.getIntPart().getZExtValue(), Result) ;
2842c7b7ecaSTyker }
2852c7b7ecaSTyker 
2861a995a0aSBevin Hansson TEST(FixedPoint, getIntPart) {
2871a995a0aSBevin Hansson   // Normal values
2881a995a0aSBevin Hansson   CheckIntPart(getSAccumSema(), 2);
2891a995a0aSBevin Hansson   CheckIntPart(getAccumSema(), 2);
2901a995a0aSBevin Hansson   CheckIntPart(getLAccumSema(), 2);
2911a995a0aSBevin Hansson   CheckIntPart(getUSAccumSema(), 2);
2921a995a0aSBevin Hansson   CheckIntPart(getUAccumSema(), 2);
2931a995a0aSBevin Hansson   CheckIntPart(getULAccumSema(), 2);
2941654b22aSTyker   CheckIntPart(getU8Pos4(), 32);
2951654b22aSTyker   CheckIntPart(getS32Pos2(), 32);
2961a995a0aSBevin Hansson 
2971a995a0aSBevin Hansson   // Zero
2981a995a0aSBevin Hansson   CheckIntPart(getSAccumSema(), 0);
2991a995a0aSBevin Hansson   CheckIntPart(getAccumSema(), 0);
3001a995a0aSBevin Hansson   CheckIntPart(getLAccumSema(), 0);
3011a995a0aSBevin Hansson   CheckIntPart(getUSAccumSema(), 0);
3021a995a0aSBevin Hansson   CheckIntPart(getUAccumSema(), 0);
3031a995a0aSBevin Hansson   CheckIntPart(getULAccumSema(), 0);
3041a995a0aSBevin Hansson 
3051a995a0aSBevin Hansson   CheckIntPart(getSFractSema(), 0);
3061a995a0aSBevin Hansson   CheckIntPart(getFractSema(), 0);
3071a995a0aSBevin Hansson   CheckIntPart(getLFractSema(), 0);
3081a995a0aSBevin Hansson   CheckIntPart(getUSFractSema(), 0);
3091a995a0aSBevin Hansson   CheckIntPart(getUFractSema(), 0);
3101a995a0aSBevin Hansson   CheckIntPart(getULFractSema(), 0);
3111a995a0aSBevin Hansson 
3121654b22aSTyker   CheckIntPart(getS16Neg18(), 0);
3131654b22aSTyker   CheckIntPart(getU8Neg10(), 0);
3141654b22aSTyker   CheckIntPart(getU8Pos4(), 0);
3151654b22aSTyker   CheckIntPart(getS32Pos2(), 0);
3161654b22aSTyker 
3171a995a0aSBevin Hansson   // Min
3181a995a0aSBevin Hansson   CheckIntPartMin(getSAccumSema(), -256);
3191a995a0aSBevin Hansson   CheckIntPartMin(getAccumSema(), -65536);
3201a995a0aSBevin Hansson   CheckIntPartMin(getLAccumSema(), -4294967296);
3211a995a0aSBevin Hansson 
3221a995a0aSBevin Hansson   CheckIntPartMin(getSFractSema(), -1);
3231a995a0aSBevin Hansson   CheckIntPartMin(getFractSema(), -1);
3241a995a0aSBevin Hansson   CheckIntPartMin(getLFractSema(), -1);
3251a995a0aSBevin Hansson 
3261654b22aSTyker   CheckIntPartMin(getS32Pos2(), -8589934592);
3271654b22aSTyker 
3281a995a0aSBevin Hansson   // Max
3291a995a0aSBevin Hansson   CheckIntPartMax(getSAccumSema(), 255);
3301a995a0aSBevin Hansson   CheckIntPartMax(getAccumSema(), 65535);
3311a995a0aSBevin Hansson   CheckIntPartMax(getLAccumSema(), 4294967295);
3321a995a0aSBevin Hansson   CheckIntPartMax(getUSAccumSema(), 255);
3331a995a0aSBevin Hansson   CheckIntPartMax(getUAccumSema(), 65535);
3341a995a0aSBevin Hansson   CheckIntPartMax(getULAccumSema(), 4294967295);
3351a995a0aSBevin Hansson 
3361654b22aSTyker   CheckIntPartMax(getU8Pos4(), 255 << 4);
3371654b22aSTyker   CheckIntPartMax(getS32Pos2(), 2147483647ull << 2);
3381654b22aSTyker 
3391a995a0aSBevin Hansson   CheckIntPartMax(getSFractSema(), 0);
3401a995a0aSBevin Hansson   CheckIntPartMax(getFractSema(), 0);
3411a995a0aSBevin Hansson   CheckIntPartMax(getLFractSema(), 0);
3421a995a0aSBevin Hansson   CheckIntPartMax(getUSFractSema(), 0);
3431a995a0aSBevin Hansson   CheckIntPartMax(getUFractSema(), 0);
3441a995a0aSBevin Hansson   CheckIntPartMax(getULFractSema(), 0);
3451a995a0aSBevin Hansson 
3461a995a0aSBevin Hansson   // Padded
3471a995a0aSBevin Hansson   // Normal Values
3481a995a0aSBevin Hansson   CheckIntPart(getPadUSAccumSema(), 2);
3491a995a0aSBevin Hansson   CheckIntPart(getPadUAccumSema(), 2);
3501a995a0aSBevin Hansson   CheckIntPart(getPadULAccumSema(), 2);
3511a995a0aSBevin Hansson 
3521a995a0aSBevin Hansson   // Zero
3531a995a0aSBevin Hansson   CheckIntPart(getPadUSAccumSema(), 0);
3541a995a0aSBevin Hansson   CheckIntPart(getPadUAccumSema(), 0);
3551a995a0aSBevin Hansson   CheckIntPart(getPadULAccumSema(), 0);
3561a995a0aSBevin Hansson 
3571a995a0aSBevin Hansson   CheckIntPart(getPadUSFractSema(), 0);
3581a995a0aSBevin Hansson   CheckIntPart(getPadUFractSema(), 0);
3591a995a0aSBevin Hansson   CheckIntPart(getPadULFractSema(), 0);
3601a995a0aSBevin Hansson 
3611a995a0aSBevin Hansson   // Max
3621a995a0aSBevin Hansson   CheckIntPartMax(getPadUSAccumSema(), 255);
3631a995a0aSBevin Hansson   CheckIntPartMax(getPadUAccumSema(), 65535);
3641a995a0aSBevin Hansson   CheckIntPartMax(getPadULAccumSema(), 4294967295);
3651a995a0aSBevin Hansson 
3661a995a0aSBevin Hansson   CheckIntPartMax(getPadUSFractSema(), 0);
3671a995a0aSBevin Hansson   CheckIntPartMax(getPadUFractSema(), 0);
3681a995a0aSBevin Hansson   CheckIntPartMax(getPadULFractSema(), 0);
3692c7b7ecaSTyker 
3702c7b7ecaSTyker   // Rounded Towards Zero
3712c7b7ecaSTyker   CheckIntPartRes(getSFractSema(), -127, 0);
3722c7b7ecaSTyker   CheckIntPartRes(getFractSema(), -32767, 0);
3732c7b7ecaSTyker   CheckIntPartRes(getLFractSema(), -2147483647, 0);
3742c7b7ecaSTyker   CheckIntPartRes(getS16Neg18(), -32768, 0);
3751a995a0aSBevin Hansson }
3761a995a0aSBevin Hansson 
3771a995a0aSBevin Hansson TEST(FixedPoint, compare) {
3781a995a0aSBevin Hansson   // Equality
3791a995a0aSBevin Hansson   // With fractional part (2.5)
3801a995a0aSBevin Hansson   // Across sizes
3811a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(320, getSAccumSema()),
3821a995a0aSBevin Hansson             APFixedPoint(81920, getAccumSema()));
3831a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(320, getSAccumSema()),
3841a995a0aSBevin Hansson             APFixedPoint(5368709120, getLAccumSema()));
3851a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(0, getSAccumSema()), APFixedPoint(0, getLAccumSema()));
3861a995a0aSBevin Hansson 
3871654b22aSTyker   ASSERT_EQ(APFixedPoint(0, getS16Neg18()), APFixedPoint(0, getU8Neg10()));
3881654b22aSTyker   ASSERT_EQ(APFixedPoint(256, getS16Neg18()), APFixedPoint(1, getU8Neg10()));
3891654b22aSTyker   ASSERT_EQ(APFixedPoint(32512, getS16Neg18()),
3901654b22aSTyker             APFixedPoint(127, getU8Neg10()));
3911654b22aSTyker   ASSERT_EQ(APFixedPoint(4, getS32Pos2()), APFixedPoint(1, getU8Pos4()));
3921654b22aSTyker   ASSERT_EQ(APFixedPoint(1020, getS32Pos2()), APFixedPoint(255, getU8Pos4()));
3931654b22aSTyker 
3941a995a0aSBevin Hansson   // Across types (0.5)
3951a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(64, getSAccumSema()),
3961a995a0aSBevin Hansson             APFixedPoint(64, getSFractSema()));
3971a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(16384, getAccumSema()),
3981a995a0aSBevin Hansson             APFixedPoint(16384, getFractSema()));
3991a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(1073741824, getLAccumSema()),
4001a995a0aSBevin Hansson             APFixedPoint(1073741824, getLFractSema()));
4011a995a0aSBevin Hansson 
4021a995a0aSBevin Hansson   // Across widths and types (0.5)
4031a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(64, getSAccumSema()),
4041a995a0aSBevin Hansson             APFixedPoint(16384, getFractSema()));
4051a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(64, getSAccumSema()),
4061a995a0aSBevin Hansson             APFixedPoint(1073741824, getLFractSema()));
4071a995a0aSBevin Hansson 
4081a995a0aSBevin Hansson   // Across saturation
4091a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(320, getSAccumSema()),
4101a995a0aSBevin Hansson             APFixedPoint(81920, Saturated(getAccumSema())));
4111a995a0aSBevin Hansson 
4121a995a0aSBevin Hansson   // Across signs
4131a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(320, getSAccumSema()),
4141a995a0aSBevin Hansson             APFixedPoint(640, getUSAccumSema()));
4151a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(-320, getSAccumSema()),
4161a995a0aSBevin Hansson             APFixedPoint(-81920, getAccumSema()));
4171a995a0aSBevin Hansson 
4181a995a0aSBevin Hansson   // Across padding
4191a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(320, getSAccumSema()),
4201a995a0aSBevin Hansson             APFixedPoint(320, getPadUSAccumSema()));
4211a995a0aSBevin Hansson   ASSERT_EQ(APFixedPoint(640, getUSAccumSema()),
4221a995a0aSBevin Hansson             APFixedPoint(320, getPadUSAccumSema()));
4231a995a0aSBevin Hansson 
4241a995a0aSBevin Hansson   // Less than
4251a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(-1, getSAccumSema()), APFixedPoint(0, getAccumSema()));
4261a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(-1, getSAccumSema()),
4271a995a0aSBevin Hansson             APFixedPoint(0, getUAccumSema()));
4281a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(0, getSAccumSema()), APFixedPoint(1, getAccumSema()));
4291a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(0, getSAccumSema()), APFixedPoint(1, getUAccumSema()));
4301a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(0, getUSAccumSema()), APFixedPoint(1, getAccumSema()));
4311a995a0aSBevin Hansson   ASSERT_LT(APFixedPoint(0, getUSAccumSema()),
4321a995a0aSBevin Hansson             APFixedPoint(1, getUAccumSema()));
4331654b22aSTyker   ASSERT_LT(APFixedPoint(65280, getS16Neg18()),
4341654b22aSTyker             APFixedPoint(255, getU8Neg10()));
4351a995a0aSBevin Hansson 
4361a995a0aSBevin Hansson   // Greater than
4371a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(0, getAccumSema()), APFixedPoint(-1, getSAccumSema()));
4381a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(0, getUAccumSema()),
4391a995a0aSBevin Hansson             APFixedPoint(-1, getSAccumSema()));
4401a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(1, getAccumSema()), APFixedPoint(0, getSAccumSema()));
4411a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(1, getUAccumSema()), APFixedPoint(0, getSAccumSema()));
4421a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(1, getAccumSema()), APFixedPoint(0, getUSAccumSema()));
4431a995a0aSBevin Hansson   ASSERT_GT(APFixedPoint(1, getUAccumSema()),
4441a995a0aSBevin Hansson             APFixedPoint(0, getUSAccumSema()));
4451a995a0aSBevin Hansson }
4461a995a0aSBevin Hansson 
4471a995a0aSBevin Hansson // Check that a fixed point value in one sema is the same in another sema
4481a995a0aSBevin Hansson void CheckUnsaturatedConversion(FixedPointSemantics Src,
4491a995a0aSBevin Hansson                                 FixedPointSemantics Dst, int64_t TestVal) {
4501a995a0aSBevin Hansson   int64_t ScaledVal = TestVal;
4511a995a0aSBevin Hansson   bool IsNegative = ScaledVal < 0;
4521a995a0aSBevin Hansson   if (IsNegative)
4531a995a0aSBevin Hansson     ScaledVal = -ScaledVal;
4541a995a0aSBevin Hansson 
4551654b22aSTyker   if (Dst.getLsbWeight() < Src.getLsbWeight()) {
4561654b22aSTyker     ScaledVal <<= (Src.getLsbWeight() - Dst.getLsbWeight());
4571a995a0aSBevin Hansson   } else {
4581654b22aSTyker     ScaledVal >>= (Dst.getLsbWeight() - Src.getLsbWeight());
4591a995a0aSBevin Hansson   }
4601a995a0aSBevin Hansson 
4611a995a0aSBevin Hansson   if (IsNegative)
4621a995a0aSBevin Hansson     ScaledVal = -ScaledVal;
4631a995a0aSBevin Hansson 
4641a995a0aSBevin Hansson   APFixedPoint Fixed(TestVal, Src);
4651a995a0aSBevin Hansson   APFixedPoint Expected(ScaledVal, Dst);
4661a995a0aSBevin Hansson   ASSERT_EQ(Fixed.convert(Dst), Expected);
4671a995a0aSBevin Hansson }
4681a995a0aSBevin Hansson 
4691a995a0aSBevin Hansson // Check the value in a given fixed point sema overflows to the saturated min
4701a995a0aSBevin Hansson // for another sema
4711a995a0aSBevin Hansson void CheckSaturatedConversionMin(FixedPointSemantics Src,
4721a995a0aSBevin Hansson                                  FixedPointSemantics Dst, int64_t TestVal) {
4731a995a0aSBevin Hansson   APFixedPoint Fixed(TestVal, Src);
4741a995a0aSBevin Hansson   ASSERT_EQ(Fixed.convert(Dst), APFixedPoint::getMin(Dst));
4751a995a0aSBevin Hansson }
4761a995a0aSBevin Hansson 
4771a995a0aSBevin Hansson // Check the value in a given fixed point sema overflows to the saturated max
4781a995a0aSBevin Hansson // for another sema
4791a995a0aSBevin Hansson void CheckSaturatedConversionMax(FixedPointSemantics Src,
4801a995a0aSBevin Hansson                                  FixedPointSemantics Dst, int64_t TestVal) {
4811a995a0aSBevin Hansson   APFixedPoint Fixed(TestVal, Src);
4821a995a0aSBevin Hansson   ASSERT_EQ(Fixed.convert(Dst), APFixedPoint::getMax(Dst));
4831a995a0aSBevin Hansson }
4841a995a0aSBevin Hansson 
4851a995a0aSBevin Hansson // Check one signed _Accum sema converted to other sema for different values.
4861a995a0aSBevin Hansson void CheckSignedAccumConversionsAgainstOthers(FixedPointSemantics Src,
4871a995a0aSBevin Hansson                                               int64_t OneVal) {
4881a995a0aSBevin Hansson   int64_t NormalVal = (OneVal * 2) + (OneVal / 2); // 2.5
4891a995a0aSBevin Hansson   int64_t HalfVal = (OneVal / 2);                  // 0.5
4901a995a0aSBevin Hansson 
4911a995a0aSBevin Hansson   // +Accums to Accums
4921a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSAccumSema(), NormalVal);
4931a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getAccumSema(), NormalVal);
4941a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLAccumSema(), NormalVal);
4951a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSAccumSema(), NormalVal);
4961a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUAccumSema(), NormalVal);
4971a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULAccumSema(), NormalVal);
4981a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSAccumSema(), NormalVal);
4991a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUAccumSema(), NormalVal);
5001a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULAccumSema(), NormalVal);
5011a995a0aSBevin Hansson 
5021a995a0aSBevin Hansson   // -Accums to Accums
5031a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSAccumSema(), -NormalVal);
5041a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getAccumSema(), -NormalVal);
5051a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLAccumSema(), -NormalVal);
5061a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getUSAccumSema()), -NormalVal);
5071a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getUAccumSema()), -NormalVal);
5081a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getULAccumSema()), -NormalVal);
5091a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadUSAccumSema()), -NormalVal);
5101a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadUAccumSema()), -NormalVal);
5111a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadULAccumSema()), -NormalVal);
5121a995a0aSBevin Hansson 
5131a995a0aSBevin Hansson   // +Accums to Fracts
5141a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSFractSema(), HalfVal);
5151a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getFractSema(), HalfVal);
5161a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLFractSema(), HalfVal);
5171a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSFractSema(), HalfVal);
5181a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUFractSema(), HalfVal);
5191a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULFractSema(), HalfVal);
5201a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSFractSema(), HalfVal);
5211a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUFractSema(), HalfVal);
5221a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULFractSema(), HalfVal);
5231a995a0aSBevin Hansson 
5241a995a0aSBevin Hansson   // -Accums to Fracts
5251a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSFractSema(), -HalfVal);
5261a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getFractSema(), -HalfVal);
5271a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLFractSema(), -HalfVal);
5281a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getUSFractSema()), -HalfVal);
5291a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getUFractSema()), -HalfVal);
5301a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getULFractSema()), -HalfVal);
5311a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadUSFractSema()), -HalfVal);
5321a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadUFractSema()), -HalfVal);
5331a995a0aSBevin Hansson   CheckSaturatedConversionMin(Src, Saturated(getPadULFractSema()), -HalfVal);
5341a995a0aSBevin Hansson 
5351a995a0aSBevin Hansson   // 0 to Accums
5361a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSAccumSema(), 0);
5371a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getAccumSema(), 0);
5381a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLAccumSema(), 0);
5391a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSAccumSema(), 0);
5401a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUAccumSema(), 0);
5411a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULAccumSema(), 0);
5421a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSAccumSema(), 0);
5431a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUAccumSema(), 0);
5441a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULAccumSema(), 0);
5451a995a0aSBevin Hansson 
5461a995a0aSBevin Hansson   // 0 to Fracts
5471a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSFractSema(), 0);
5481a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getFractSema(), 0);
5491a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLFractSema(), 0);
5501a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSFractSema(), 0);
5511a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUFractSema(), 0);
5521a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULFractSema(), 0);
5531a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSFractSema(), 0);
5541a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUFractSema(), 0);
5551a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULFractSema(), 0);
5561a995a0aSBevin Hansson }
5571a995a0aSBevin Hansson 
5581a995a0aSBevin Hansson // Check one unsigned _Accum sema converted to other sema for different
5591a995a0aSBevin Hansson // values.
5601a995a0aSBevin Hansson void CheckUnsignedAccumConversionsAgainstOthers(FixedPointSemantics Src,
5611a995a0aSBevin Hansson                                                 int64_t OneVal) {
5621a995a0aSBevin Hansson   int64_t NormalVal = (OneVal * 2) + (OneVal / 2); // 2.5
5631a995a0aSBevin Hansson   int64_t HalfVal = (OneVal / 2);                  // 0.5
5641a995a0aSBevin Hansson 
5651a995a0aSBevin Hansson   // +UAccums to Accums
5661a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSAccumSema(), NormalVal);
5671a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getAccumSema(), NormalVal);
5681a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLAccumSema(), NormalVal);
5691a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSAccumSema(), NormalVal);
5701a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUAccumSema(), NormalVal);
5711a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULAccumSema(), NormalVal);
5721a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSAccumSema(), NormalVal);
5731a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUAccumSema(), NormalVal);
5741a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULAccumSema(), NormalVal);
5751a995a0aSBevin Hansson 
5761a995a0aSBevin Hansson   // +UAccums to Fracts
5771a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getSFractSema(), HalfVal);
5781a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getFractSema(), HalfVal);
5791a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getLFractSema(), HalfVal);
5801a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUSFractSema(), HalfVal);
5811a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getUFractSema(), HalfVal);
5821a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getULFractSema(), HalfVal);
5831a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUSFractSema(), HalfVal);
5841a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadUFractSema(), HalfVal);
5851a995a0aSBevin Hansson   CheckUnsaturatedConversion(Src, getPadULFractSema(), HalfVal);
5861a995a0aSBevin Hansson }
5871a995a0aSBevin Hansson 
5881a995a0aSBevin Hansson TEST(FixedPoint, AccumConversions) {
5891a995a0aSBevin Hansson   // Normal conversions
5901a995a0aSBevin Hansson   CheckSignedAccumConversionsAgainstOthers(getSAccumSema(), 128);
5911a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getUSAccumSema(), 256);
5921a995a0aSBevin Hansson   CheckSignedAccumConversionsAgainstOthers(getAccumSema(), 32768);
5931a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getUAccumSema(), 65536);
5941a995a0aSBevin Hansson   CheckSignedAccumConversionsAgainstOthers(getLAccumSema(), 2147483648);
5951a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getULAccumSema(), 4294967296);
5961a995a0aSBevin Hansson 
5971a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getPadUSAccumSema(), 128);
5981a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getPadUAccumSema(), 32768);
5991a995a0aSBevin Hansson   CheckUnsignedAccumConversionsAgainstOthers(getPadULAccumSema(), 2147483648);
6001a995a0aSBevin Hansson }
6011a995a0aSBevin Hansson 
6021a995a0aSBevin Hansson TEST(FixedPoint, AccumConversionOverflow) {
6031a995a0aSBevin Hansson   // To SAccum max limit (65536)
6041a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getAccumSema()),
6051a995a0aSBevin Hansson                               140737488355328);
6061a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getUAccumSema()),
6071a995a0aSBevin Hansson                               140737488355328);
6081a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getPadUAccumSema()),
6091a995a0aSBevin Hansson                               140737488355328);
6101a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getAccumSema()),
6111a995a0aSBevin Hansson                               281474976710656);
6121a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getUAccumSema()),
6131a995a0aSBevin Hansson                               281474976710656);
6141a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getPadUAccumSema()),
6151a995a0aSBevin Hansson                               281474976710656);
6161a995a0aSBevin Hansson 
6171a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(), Saturated(getAccumSema()),
6181a995a0aSBevin Hansson                               140737488355328);
6191a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(), Saturated(getUAccumSema()),
6201a995a0aSBevin Hansson                               140737488355328);
6211a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(),
6221a995a0aSBevin Hansson                               Saturated(getPadUAccumSema()), 140737488355328);
6231a995a0aSBevin Hansson 
6241a995a0aSBevin Hansson   // To SAccum min limit (-65536)
6251a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getAccumSema()),
6261a995a0aSBevin Hansson                               -140737488355328);
6271a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getUAccumSema()),
6281a995a0aSBevin Hansson                               -140737488355328);
6291a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getPadUAccumSema()),
6301a995a0aSBevin Hansson                               -140737488355328);
6311a995a0aSBevin Hansson }
6321a995a0aSBevin Hansson 
6331a995a0aSBevin Hansson TEST(FixedPoint, SAccumConversionOverflow) {
6341a995a0aSBevin Hansson   // To SAccum max limit (256)
6351a995a0aSBevin Hansson   CheckSaturatedConversionMax(getAccumSema(), Saturated(getSAccumSema()),
6361a995a0aSBevin Hansson                               8388608);
6371a995a0aSBevin Hansson   CheckSaturatedConversionMax(getAccumSema(), Saturated(getUSAccumSema()),
6381a995a0aSBevin Hansson                               8388608);
6391a995a0aSBevin Hansson   CheckSaturatedConversionMax(getAccumSema(), Saturated(getPadUSAccumSema()),
6401a995a0aSBevin Hansson                               8388608);
6411a995a0aSBevin Hansson   CheckSaturatedConversionMax(getUAccumSema(), Saturated(getSAccumSema()),
6421a995a0aSBevin Hansson                               16777216);
6431a995a0aSBevin Hansson   CheckSaturatedConversionMax(getUAccumSema(), Saturated(getUSAccumSema()),
6441a995a0aSBevin Hansson                               16777216);
6451a995a0aSBevin Hansson   CheckSaturatedConversionMax(getUAccumSema(), Saturated(getPadUSAccumSema()),
6461a995a0aSBevin Hansson                               16777216);
6471a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getSAccumSema()),
6481a995a0aSBevin Hansson                               549755813888);
6491a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getUSAccumSema()),
6501a995a0aSBevin Hansson                               549755813888);
6511a995a0aSBevin Hansson   CheckSaturatedConversionMax(getLAccumSema(), Saturated(getPadUSAccumSema()),
6521a995a0aSBevin Hansson                               549755813888);
6531a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getSAccumSema()),
6541a995a0aSBevin Hansson                               1099511627776);
6551a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getUSAccumSema()),
6561a995a0aSBevin Hansson                               1099511627776);
6571a995a0aSBevin Hansson   CheckSaturatedConversionMax(getULAccumSema(), Saturated(getPadUSAccumSema()),
6581a995a0aSBevin Hansson                               1099511627776);
6591a995a0aSBevin Hansson 
6601a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadUAccumSema(), Saturated(getSAccumSema()),
6611a995a0aSBevin Hansson                               8388608);
6621a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadUAccumSema(), Saturated(getUSAccumSema()),
6631a995a0aSBevin Hansson                               8388608);
6641a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadUAccumSema(),
6651a995a0aSBevin Hansson                               Saturated(getPadUSAccumSema()), 8388608);
6661a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(), Saturated(getSAccumSema()),
6671a995a0aSBevin Hansson                               549755813888);
6681a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(), Saturated(getUSAccumSema()),
6691a995a0aSBevin Hansson                               549755813888);
6701a995a0aSBevin Hansson   CheckSaturatedConversionMax(getPadULAccumSema(),
6711a995a0aSBevin Hansson                               Saturated(getPadUSAccumSema()), 549755813888);
6721a995a0aSBevin Hansson 
6731a995a0aSBevin Hansson   // To SAccum min limit (-256)
6741a995a0aSBevin Hansson   CheckSaturatedConversionMin(getAccumSema(), Saturated(getSAccumSema()),
6751a995a0aSBevin Hansson                               -8388608);
6761a995a0aSBevin Hansson   CheckSaturatedConversionMin(getAccumSema(), Saturated(getUSAccumSema()),
6771a995a0aSBevin Hansson                               -8388608);
6781a995a0aSBevin Hansson   CheckSaturatedConversionMin(getAccumSema(), Saturated(getPadUSAccumSema()),
6791a995a0aSBevin Hansson                               -8388608);
6801a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getSAccumSema()),
6811a995a0aSBevin Hansson                               -549755813888);
6821a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getUSAccumSema()),
6831a995a0aSBevin Hansson                               -549755813888);
6841a995a0aSBevin Hansson   CheckSaturatedConversionMin(getLAccumSema(), Saturated(getPadUSAccumSema()),
6851a995a0aSBevin Hansson                               -549755813888);
6861a995a0aSBevin Hansson }
6871a995a0aSBevin Hansson 
6881a995a0aSBevin Hansson TEST(FixedPoint, GetValueSignAfterConversion) {
6891a995a0aSBevin Hansson   APFixedPoint Fixed(255 << 7, getSAccumSema());
6901a995a0aSBevin Hansson   ASSERT_TRUE(Fixed.getValue().isSigned());
6911a995a0aSBevin Hansson   APFixedPoint UFixed = Fixed.convert(getUSAccumSema());
6921a995a0aSBevin Hansson   ASSERT_TRUE(UFixed.getValue().isUnsigned());
6931a995a0aSBevin Hansson   ASSERT_EQ(UFixed.getValue(), APSInt::getUnsigned(255 << 8).extOrTrunc(16));
6941a995a0aSBevin Hansson }
6951a995a0aSBevin Hansson 
6961a995a0aSBevin Hansson TEST(FixedPoint, ModularWrapAround) {
6971a995a0aSBevin Hansson   // Positive to negative
6981a995a0aSBevin Hansson   APFixedPoint Val = APFixedPoint(1ULL << 7, getSAccumSema());
6991a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getLFractSema()).getValue(), -(1ULL << 31));
7001a995a0aSBevin Hansson 
7011a995a0aSBevin Hansson   Val = APFixedPoint(1ULL << 23, getAccumSema());
7021a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getSAccumSema()).getValue(), -(1ULL << 15));
7031a995a0aSBevin Hansson 
7041a995a0aSBevin Hansson   Val = APFixedPoint(1ULL << 47, getLAccumSema());
7051a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getAccumSema()).getValue(), -(1ULL << 31));
7061a995a0aSBevin Hansson 
7071a995a0aSBevin Hansson   // Negative to positive
7081a995a0aSBevin Hansson   Val = APFixedPoint(/*-1.5*/ -192, getSAccumSema());
7091a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getLFractSema()).getValue(), 1ULL << 30);
7101a995a0aSBevin Hansson 
7111a995a0aSBevin Hansson   Val = APFixedPoint(-(257 << 15), getAccumSema());
7121a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getSAccumSema()).getValue(), 255 << 7);
7131a995a0aSBevin Hansson 
7141a995a0aSBevin Hansson   Val = APFixedPoint(-(65537ULL << 31), getLAccumSema());
7151a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getAccumSema()).getValue(), 65535 << 15);
7161a995a0aSBevin Hansson 
7171a995a0aSBevin Hansson   // Signed to unsigned
7181a995a0aSBevin Hansson   Val = APFixedPoint(-(1 << 7), getSAccumSema());
7191a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getUSAccumSema()).getValue(), 255 << 8);
7201a995a0aSBevin Hansson 
7211a995a0aSBevin Hansson   Val = APFixedPoint(-(1 << 15), getAccumSema());
7221a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getUAccumSema()).getValue(), 65535ULL << 16);
7231a995a0aSBevin Hansson 
7241a995a0aSBevin Hansson   Val = APFixedPoint(-(1ULL << 31), getLAccumSema());
7251a995a0aSBevin Hansson   ASSERT_EQ(Val.convert(getULAccumSema()).getValue().getZExtValue(),
7261a995a0aSBevin Hansson             4294967295ULL << 32);
7271a995a0aSBevin Hansson }
7281a995a0aSBevin Hansson 
729dd3014f3SBevin Hansson enum OvfKind { MinSat, MaxSat };
730dd3014f3SBevin Hansson 
731dd3014f3SBevin Hansson void CheckFloatToFixedConversion(APFloat &Val, const FixedPointSemantics &Sema,
732dd3014f3SBevin Hansson                                  int64_t ExpectedNonSat) {
733dd3014f3SBevin Hansson   bool Ovf;
734dd3014f3SBevin Hansson   ASSERT_EQ(APFixedPoint::getFromFloatValue(Val, Sema, &Ovf).getValue(),
735dd3014f3SBevin Hansson             ExpectedNonSat);
736dd3014f3SBevin Hansson   ASSERT_EQ(Ovf, false);
737dd3014f3SBevin Hansson   ASSERT_EQ(
738dd3014f3SBevin Hansson       APFixedPoint::getFromFloatValue(Val, Saturated(Sema), &Ovf).getValue(),
739dd3014f3SBevin Hansson       ExpectedNonSat);
740dd3014f3SBevin Hansson   ASSERT_EQ(Ovf, false);
741dd3014f3SBevin Hansson }
742dd3014f3SBevin Hansson 
743dd3014f3SBevin Hansson void CheckFloatToFixedConversion(APFloat &Val, const FixedPointSemantics &Sema,
744dd3014f3SBevin Hansson                                  OvfKind ExpectedOvf) {
745dd3014f3SBevin Hansson   bool Ovf;
746dd3014f3SBevin Hansson   (void)APFixedPoint::getFromFloatValue(Val, Sema, &Ovf);
747dd3014f3SBevin Hansson   ASSERT_EQ(Ovf, true);
748dd3014f3SBevin Hansson   ASSERT_EQ(
749dd3014f3SBevin Hansson       APFixedPoint::getFromFloatValue(Val, Saturated(Sema), &Ovf).getValue(),
750dd3014f3SBevin Hansson       (ExpectedOvf == MinSat ? APFixedPoint::getMin(Sema)
751dd3014f3SBevin Hansson                              : APFixedPoint::getMax(Sema))
752dd3014f3SBevin Hansson           .getValue());
753dd3014f3SBevin Hansson   ASSERT_EQ(Ovf, false);
754dd3014f3SBevin Hansson }
755dd3014f3SBevin Hansson 
7561654b22aSTyker TEST(FixedPoint, toString) {
7571654b22aSTyker   ASSERT_EQ(APFixedPoint::getMax(getS16Neg18()).toString(),
7581654b22aSTyker             "0.124996185302734375");
7591654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getS16Neg18())
7601654b22aSTyker                 .add(APFixedPoint(1, getS16Neg18()))
7611654b22aSTyker                 .toString(),
7621654b22aSTyker             "-0.124996185302734375");
7631654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getS16Neg18()).toString(), "-0.125");
7641654b22aSTyker   ASSERT_EQ(APFixedPoint::getMax(getU8Neg10()).toString(), "0.2490234375");
7651654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getU8Neg10()).toString(), "0.0");
7661654b22aSTyker   ASSERT_EQ(APFixedPoint::getMax(getS32Pos2()).toString(), "8589934588.0");
7671654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getS32Pos2())
7681654b22aSTyker                 .add(APFixedPoint(1, getS32Pos2()))
7691654b22aSTyker                 .toString(),
7701654b22aSTyker             "-8589934588.0");
7711654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getS32Pos2()).toString(), "-8589934592.0");
7721654b22aSTyker   ASSERT_EQ(APFixedPoint::getMax(getU8Pos4()).toString(), "4080.0");
7731654b22aSTyker   ASSERT_EQ(APFixedPoint::getMin(getU8Pos4()).toString(), "0.0");
7741654b22aSTyker }
7751654b22aSTyker 
776dd3014f3SBevin Hansson TEST(FixedPoint, FloatToFixed) {
777dd3014f3SBevin Hansson   APFloat Val(0.0f);
778dd3014f3SBevin Hansson 
779dd3014f3SBevin Hansson   // Simple exact fraction
780dd3014f3SBevin Hansson   Val = APFloat(0.75f);
781dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), 3ULL << 5);
782dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  3ULL << 13);
783dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), 3ULL << 29);
784dd3014f3SBevin Hansson 
785dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), 3ULL << 6);
786dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  3ULL << 14);
787dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), 3ULL << 30);
788dd3014f3SBevin Hansson 
789dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), 3ULL << 5);
790dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  3ULL << 13);
791dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), 3ULL << 29);
792dd3014f3SBevin Hansson 
793dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), 3ULL << 6);
794dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  3ULL << 14);
795dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), 3ULL << 30);
796dd3014f3SBevin Hansson 
7971654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MaxSat);
7981654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(),  0);
7991654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MaxSat);
8001654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
8011654b22aSTyker 
802dd3014f3SBevin Hansson   // Simple negative exact fraction
803dd3014f3SBevin Hansson   Val = APFloat(-0.75f);
804dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), -3ULL << 5);
805dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  -3ULL << 13);
806dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), -3ULL << 29);
807dd3014f3SBevin Hansson 
808dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), MinSat);
809dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  MinSat);
810dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), MinSat);
811dd3014f3SBevin Hansson 
812dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), -3ULL << 5);
813dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  -3ULL << 13);
814dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), -3ULL << 29);
815dd3014f3SBevin Hansson 
816dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), MinSat);
817dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  MinSat);
818dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), MinSat);
819dd3014f3SBevin Hansson 
8201654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MinSat);
8211654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(),  0);
8221654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MinSat);
8231654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
8241654b22aSTyker 
825dd3014f3SBevin Hansson   // Highly precise fraction
826dd3014f3SBevin Hansson   Val = APFloat(0.999999940395355224609375f);
827dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), 0x7FULL);
828dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  0x7FFFULL);
829dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), 0xFFFFFFULL << 7);
830dd3014f3SBevin Hansson 
831dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), 0xFFULL);
832dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  0xFFFFULL);
833dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), 0xFFFFFFULL << 8);
834dd3014f3SBevin Hansson 
835dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), 0x7FULL);
836dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  0x7FFFULL);
837dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), 0xFFFFFFULL << 7);
838dd3014f3SBevin Hansson 
839dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), 0xFFULL);
840dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  0xFFFFULL);
841dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), 0xFFFFFFULL << 8);
842dd3014f3SBevin Hansson 
8431654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MaxSat);
8441654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 0);
8451654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MaxSat);
8461654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
8471654b22aSTyker 
848dd3014f3SBevin Hansson   // Integral and fraction
849dd3014f3SBevin Hansson   Val = APFloat(17.99609375f);
850dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), 0x11FFULL >> 1);
851dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  0x11FFULL << 7);
852dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), 0x11FFULL << 23);
853dd3014f3SBevin Hansson 
854dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), 0x11FFULL);
855dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  0x11FFULL << 8);
856dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), 0x11FFULL << 24);
857dd3014f3SBevin Hansson 
858dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), MaxSat);
859dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  MaxSat);
860dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), MaxSat);
861dd3014f3SBevin Hansson 
862dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), MaxSat);
863dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  MaxSat);
864dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), MaxSat);
865dd3014f3SBevin Hansson 
8661654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MaxSat);
8671654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 1);
8681654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MaxSat);
8691654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 1 << 2);
8701654b22aSTyker 
871dd3014f3SBevin Hansson   // Negative integral and fraction
872dd3014f3SBevin Hansson   Val = APFloat(-17.99609375f);
873dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), -0x11FELL >> 1);
874dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  -0x11FFULL << 7);
875dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), -0x11FFULL << 23);
876dd3014f3SBevin Hansson 
877dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), MinSat);
878dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  MinSat);
879dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), MinSat);
880dd3014f3SBevin Hansson 
881dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), MinSat);
882dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  MinSat);
883dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), MinSat);
884dd3014f3SBevin Hansson 
885dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), MinSat);
886dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  MinSat);
887dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), MinSat);
888dd3014f3SBevin Hansson 
8891654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MinSat);
8901654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), MinSat);
8911654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MinSat);
8921654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), -4);
8931654b22aSTyker 
894dd3014f3SBevin Hansson   // Very large value
895dd3014f3SBevin Hansson   Val = APFloat(1.0e38f);
896dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), MaxSat);
897dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  MaxSat);
898dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), MaxSat);
899dd3014f3SBevin Hansson 
900dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), MaxSat);
901dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  MaxSat);
902dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), MaxSat);
903dd3014f3SBevin Hansson 
904dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), MaxSat);
905dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  MaxSat);
906dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), MaxSat);
907dd3014f3SBevin Hansson 
908dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), MaxSat);
909dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  MaxSat);
910dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), MaxSat);
911dd3014f3SBevin Hansson 
9121654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MaxSat);
9131654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), MaxSat);
9141654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MaxSat);
9151654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), MaxSat);
9161654b22aSTyker 
917dd3014f3SBevin Hansson   // Very small value
918dd3014f3SBevin Hansson   Val = APFloat(1.0e-38f);
919dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), 0);
920dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  0);
921dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), 0);
922dd3014f3SBevin Hansson 
923dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), 0);
924dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  0);
925dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), 0);
926dd3014f3SBevin Hansson 
927dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), 0);
928dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  0);
929dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), 0);
930dd3014f3SBevin Hansson 
931dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), 0);
932dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  0);
933dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), 0);
934dd3014f3SBevin Hansson 
9351654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), 0);
9361654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 0);
9371654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), 0);
9381654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
9391654b22aSTyker 
940dd3014f3SBevin Hansson   // Half conversion
941dd3014f3SBevin Hansson   Val = APFloat(0.99951171875f);
942dd3014f3SBevin Hansson   bool Ignored;
943dd3014f3SBevin Hansson   Val.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
944dd3014f3SBevin Hansson 
945dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSAccumSema(), 0x7FULL);
946dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getAccumSema(),  0x7FFULL << 4);
947dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLAccumSema(), 0x7FFULL << 20);
948dd3014f3SBevin Hansson 
949dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSAccumSema(), 0xFFULL);
950dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUAccumSema(),  0xFFEULL << 4);
951dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULAccumSema(), 0xFFEULL << 20);
952dd3014f3SBevin Hansson 
953dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getSFractSema(), 0x7FULL);
954dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getFractSema(),  0x7FFULL << 4);
955dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getLFractSema(), 0x7FFULL << 20);
956dd3014f3SBevin Hansson 
957dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUSFractSema(), 0xFFULL);
958dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getUFractSema(),  0xFFEULL << 4);
959dd3014f3SBevin Hansson   CheckFloatToFixedConversion(Val, getULFractSema(), 0xFFEULL << 20);
9601654b22aSTyker 
9611654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MaxSat);
9621654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 0);
9631654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), MaxSat);
9641654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
9651654b22aSTyker 
9661654b22aSTyker   Val = APFloat(0.124996185302734375);
9671654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), 0x7f);
9681654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 0);
9691654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), 0x7fff);
9701654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
9711654b22aSTyker 
9721654b22aSTyker   Val = APFloat(-0.124996185302734375);
9731654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Neg10(), MinSat);
9741654b22aSTyker   CheckFloatToFixedConversion(Val, getU8Pos4(), 0);
9751654b22aSTyker   CheckFloatToFixedConversion(Val, getS16Neg18(), -0x7fff);
9761654b22aSTyker   CheckFloatToFixedConversion(Val, getS32Pos2(), 0);
977dd3014f3SBevin Hansson }
978dd3014f3SBevin Hansson 
979dd3014f3SBevin Hansson void CheckFixedToFloatConversion(int64_t Val, const FixedPointSemantics &Sema,
980dd3014f3SBevin Hansson                                  float Result) {
981dd3014f3SBevin Hansson   APFixedPoint FXVal(Val, Sema);
982dd3014f3SBevin Hansson   APFloat APRes(Result);
983dd3014f3SBevin Hansson   ASSERT_EQ(FXVal.convertToFloat(APFloat::IEEEsingle()), APRes);
984dd3014f3SBevin Hansson }
985dd3014f3SBevin Hansson 
986dd3014f3SBevin Hansson void CheckFixedToHalfConversion(int64_t Val, const FixedPointSemantics &Sema,
987dd3014f3SBevin Hansson                                 float Result) {
988dd3014f3SBevin Hansson   APFixedPoint FXVal(Val, Sema);
989dd3014f3SBevin Hansson   APFloat APRes(Result);
990dd3014f3SBevin Hansson   bool Ignored;
991dd3014f3SBevin Hansson   APRes.convert(APFloat::IEEEhalf(), APFloat::rmNearestTiesToEven, &Ignored);
992dd3014f3SBevin Hansson   ASSERT_EQ(FXVal.convertToFloat(APFloat::IEEEhalf()), APRes);
993dd3014f3SBevin Hansson }
994dd3014f3SBevin Hansson 
995dd3014f3SBevin Hansson TEST(FixedPoint, FixedToFloat) {
996dd3014f3SBevin Hansson   int64_t Val = 0x1ULL;
997dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getSAccumSema(), 0.0078125f);
998dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getFractSema(),  0.000030517578125f);
999dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  0.000030517578125f);
1000dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1001dd3014f3SBevin Hansson                               0.0000000004656612873077392578125f);
1002dd3014f3SBevin Hansson 
1003dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUSAccumSema(), 0.00390625f);
1004dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUFractSema(),  0.0000152587890625f);
1005dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUAccumSema(),  0.0000152587890625f);
1006dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getULFractSema(),
1007dd3014f3SBevin Hansson                               0.00000000023283064365386962890625f);
1008dd3014f3SBevin Hansson 
10091654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Neg10(), 0.0009765625f);
10101654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Pos4(), 16.0f);
10111654b22aSTyker   CheckFixedToFloatConversion(Val, getS16Neg18(), 0.000003814697265625f);
10121654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 4.0f);
10131654b22aSTyker 
1014dd3014f3SBevin Hansson   Val = 0x7FULL;
1015dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getSAccumSema(), 0.9921875f);
1016dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getFractSema(),  0.003875732421875f);
1017dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  0.003875732421875f);
1018dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1019dd3014f3SBevin Hansson                               0.0000000591389834880828857421875f);
1020dd3014f3SBevin Hansson 
1021dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUSAccumSema(), 0.49609375f);
1022dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUFractSema(),  0.0019378662109375f);
1023dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUAccumSema(),  0.0019378662109375f);
1024dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getULFractSema(),
1025dd3014f3SBevin Hansson                               0.00000002956949174404144287109375f);
1026dd3014f3SBevin Hansson 
10271654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Neg10(), 0.1240234375f);
10281654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Pos4(), 2032.0f);
10291654b22aSTyker   CheckFixedToFloatConversion(Val, getS16Neg18(), 0.000484466552734375f);
10301654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 508.0f);
10311654b22aSTyker 
1032dd3014f3SBevin Hansson   Val = -0x1ULL;
1033dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getSAccumSema(), -0.0078125f);
1034dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getFractSema(),  -0.000030517578125f);
1035dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  -0.000030517578125f);
1036dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1037dd3014f3SBevin Hansson                               -0.0000000004656612873077392578125f);
1038dd3014f3SBevin Hansson 
10391654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Neg10(), 0.249023437f);
10401654b22aSTyker   CheckFixedToFloatConversion(Val, getU8Pos4(), 4080.0f);
10411654b22aSTyker   CheckFixedToFloatConversion(Val, getS16Neg18(), -0.000003814697265625f);
10421654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), -4.0f);
1043dd3014f3SBevin Hansson 
1044dd3014f3SBevin Hansson   CheckFixedToFloatConversion(-0x80ULL,       getSAccumSema(), -1.0f);
1045dd3014f3SBevin Hansson   CheckFixedToFloatConversion(-0x8000ULL,     getFractSema(),  -1.0f);
1046dd3014f3SBevin Hansson   CheckFixedToFloatConversion(-0x8000ULL,     getAccumSema(),  -1.0f);
1047dd3014f3SBevin Hansson   CheckFixedToFloatConversion(-0x80000000ULL, getLFractSema(), -1.0f);
1048dd3014f3SBevin Hansson 
1049dd3014f3SBevin Hansson   Val = 0xAFAULL;
1050dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getSAccumSema(), 21.953125f);
1051dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getFractSema(),  0.08575439453125f);
1052dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  0.08575439453125f);
1053dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1054dd3014f3SBevin Hansson                               0.000001308508217334747314453125f);
1055dd3014f3SBevin Hansson 
1056dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUSAccumSema(), 10.9765625f);
1057dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUFractSema(),  0.042877197265625f);
1058dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUAccumSema(),  0.042877197265625f);
1059dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getULFractSema(),
1060dd3014f3SBevin Hansson                               0.0000006542541086673736572265625f);
1061dd3014f3SBevin Hansson 
10621654b22aSTyker   CheckFixedToFloatConversion(Val, getS16Neg18(), 0.01071929931640625f);
10631654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 11240.0f);
10641654b22aSTyker 
1065dd3014f3SBevin Hansson   Val = -0xAFAULL;
1066dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getSAccumSema(), -21.953125f);
1067dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getFractSema(),  -0.08575439453125f);
1068dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  -0.08575439453125f);
1069dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1070dd3014f3SBevin Hansson                               -0.000001308508217334747314453125f);
1071dd3014f3SBevin Hansson 
10721654b22aSTyker   CheckFixedToFloatConversion(Val, getS16Neg18(), -0.01071929931640625f);
10731654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), -11240.0f);
10741654b22aSTyker 
1075dd3014f3SBevin Hansson   Val = 0x40000080ULL;
1076dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  32768.00390625f);
1077dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(),
1078dd3014f3SBevin Hansson                               0.500000059604644775390625f);
1079dd3014f3SBevin Hansson 
1080dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUAccumSema(),  16384.001953125f);
1081dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getULFractSema(),
1082dd3014f3SBevin Hansson                               0.2500000298023223876953125f);
1083dd3014f3SBevin Hansson 
10841654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 4294967808.0f);
10851654b22aSTyker 
1086dd3014f3SBevin Hansson   Val = 0x40000040ULL;
1087dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getAccumSema(),  32768.0f);
1088dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getLFractSema(), 0.5f);
1089dd3014f3SBevin Hansson 
1090dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getUAccumSema(),  16384.0f);
1091dd3014f3SBevin Hansson   CheckFixedToFloatConversion(Val, getULFractSema(), 0.25f);
1092dd3014f3SBevin Hansson 
10931654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 4294967552.0f);
10941654b22aSTyker 
1095dd3014f3SBevin Hansson   Val = 0x7FF0ULL;
1096dd3014f3SBevin Hansson   CheckFixedToHalfConversion(Val, getAccumSema(), 0.99951171875f);
1097dd3014f3SBevin Hansson   CheckFixedToHalfConversion(Val, getLFractSema(), 0.000015251338481903076171875f);
1098dd3014f3SBevin Hansson 
1099dd3014f3SBevin Hansson   CheckFixedToHalfConversion(Val, getUAccumSema(), 0.499755859375f);
1100dd3014f3SBevin Hansson   CheckFixedToHalfConversion(Val, getULFractSema(), 0.0000076256692409515380859375f);
11011654b22aSTyker 
11021654b22aSTyker   CheckFixedToFloatConversion(Val, getS32Pos2(), 131008.0f);
11031654b22aSTyker }
11041654b22aSTyker 
11051654b22aSTyker void CheckAdd(const APFixedPoint &Lhs, const APFixedPoint &Rhs,
11061654b22aSTyker               const APFixedPoint &Res) {
11071654b22aSTyker   bool Overflow = false;
11081654b22aSTyker   APFixedPoint Result = Lhs.add(Rhs, &Overflow);
11091654b22aSTyker   ASSERT_FALSE(Overflow);
11101654b22aSTyker   ASSERT_EQ(Result.getSemantics(), Res.getSemantics());
11111654b22aSTyker   ASSERT_EQ(Result, Res);
11121654b22aSTyker }
11131654b22aSTyker 
11141654b22aSTyker void CheckAddOverflow(const APFixedPoint &Lhs, const APFixedPoint &Rhs) {
11151654b22aSTyker   bool Overflow = false;
11161654b22aSTyker   APFixedPoint Result = Lhs.add(Rhs, &Overflow);
11171654b22aSTyker   ASSERT_TRUE(Overflow);
11181654b22aSTyker }
11191654b22aSTyker 
11201654b22aSTyker TEST(FixedPoint, add) {
11211654b22aSTyker   CheckAdd(APFixedPoint(1, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
11221654b22aSTyker            APFixedPoint(2, getS32Pos2()));
11231654b22aSTyker   CheckAdd(APFixedPoint(1, getS16Neg18()), APFixedPoint(1, getS16Neg18()),
11241654b22aSTyker            APFixedPoint(2, getS16Neg18()));
11251654b22aSTyker   CheckAdd(APFixedPoint(1, getU8Neg10()), APFixedPoint(1, getU8Neg10()),
11261654b22aSTyker            APFixedPoint(2, getU8Neg10()));
11271654b22aSTyker   CheckAdd(APFixedPoint(1, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
11281654b22aSTyker            APFixedPoint(2, getU8Pos4()));
11291654b22aSTyker 
11301654b22aSTyker   CheckAdd(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
11311654b22aSTyker            APFixedPoint(12, getS32Pos2()));
11321654b22aSTyker   CheckAdd(APFixedPoint(11, getS16Neg18()), APFixedPoint(1, getS16Neg18()),
11331654b22aSTyker            APFixedPoint(12, getS16Neg18()));
11341654b22aSTyker   CheckAdd(APFixedPoint(11, getU8Neg10()), APFixedPoint(1, getU8Neg10()),
11351654b22aSTyker            APFixedPoint(12, getU8Neg10()));
11361654b22aSTyker   CheckAdd(APFixedPoint(11, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
11371654b22aSTyker            APFixedPoint(12, getU8Pos4()));
11381654b22aSTyker 
11391654b22aSTyker   CheckAdd(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS16Neg18()),
11401654b22aSTyker            APFixedPoint(11534337,
11411654b22aSTyker                         FixedPointSemantics(52, FixedPointSemantics::Lsb{-18},
11421654b22aSTyker                                             true, false, false)));
11431654b22aSTyker   CheckAdd(
11441654b22aSTyker       APFixedPoint(11, getU8Neg10()), APFixedPoint(-9472, getS16Neg18()),
11451654b22aSTyker       APFixedPoint(-6656, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
11461654b22aSTyker                                               true, false, false)));
11471654b22aSTyker   CheckAddOverflow(
11481654b22aSTyker       APFixedPoint::getMax(getU8Neg10()), APFixedPoint::getMax(getS16Neg18()));
11491654b22aSTyker   CheckAdd(APFixedPoint::getMin(getU8Neg10()),
11501654b22aSTyker            APFixedPoint::getMin(getS16Neg18()),
11511654b22aSTyker            APFixedPoint::getMin(getS16Neg18())
11521654b22aSTyker                .convert(FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
11531654b22aSTyker                                             true, false, false)));
11541654b22aSTyker   CheckAddOverflow(APFixedPoint::getMin(getS32Pos2()),
11551654b22aSTyker                    APFixedPoint::getMin(getS16Neg18()));
11561654b22aSTyker }
11571654b22aSTyker 
11581654b22aSTyker void CheckMul(const APFixedPoint &Lhs, const APFixedPoint &Rhs,
11591654b22aSTyker               const APFixedPoint &Res) {
11601654b22aSTyker   bool Overflow = false;
11611654b22aSTyker   APFixedPoint Result = Lhs.mul(Rhs, &Overflow);
11621654b22aSTyker   ASSERT_FALSE(Overflow);
11631654b22aSTyker   ASSERT_EQ(Result.getSemantics(), Res.getSemantics());
11641654b22aSTyker   ASSERT_EQ(Result, Res);
11651654b22aSTyker }
11661654b22aSTyker 
11671654b22aSTyker void CheckMulOverflow(const APFixedPoint &Lhs, const APFixedPoint &Rhs) {
11681654b22aSTyker   bool Overflow = false;
11691654b22aSTyker   APFixedPoint Result = Lhs.mul(Rhs, &Overflow);
11701654b22aSTyker   ASSERT_TRUE(Overflow);
11711654b22aSTyker }
11721654b22aSTyker 
11731654b22aSTyker TEST(FixedPoint, mul) {
11741654b22aSTyker   CheckMul(APFixedPoint(1, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
11751654b22aSTyker            APFixedPoint(4, getS32Pos2()));
11761654b22aSTyker   CheckMul(APFixedPoint(1, getS16Neg18()), APFixedPoint(1, getS16Neg18()),
11771654b22aSTyker            APFixedPoint(0, getS16Neg18()));
11781654b22aSTyker   CheckMul(APFixedPoint(1, getU8Neg10()), APFixedPoint(1, getU8Neg10()),
11791654b22aSTyker            APFixedPoint(0, getU8Neg10()));
11801654b22aSTyker   CheckMul(APFixedPoint(1, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
11811654b22aSTyker            APFixedPoint(16, getU8Pos4()));
11821654b22aSTyker 
11831654b22aSTyker   CheckMul(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
11841654b22aSTyker            APFixedPoint(44, getS32Pos2()));
11851654b22aSTyker   CheckMul(APFixedPoint(11, getS16Neg18()), APFixedPoint(1, getS16Neg18()),
11861654b22aSTyker            APFixedPoint(0, getS16Neg18()));
11871654b22aSTyker   CheckMul(APFixedPoint(11, getU8Neg10()), APFixedPoint(1, getU8Neg10()),
11881654b22aSTyker            APFixedPoint(0, getU8Neg10()));
11891654b22aSTyker   CheckMul(APFixedPoint(11, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
11901654b22aSTyker            APFixedPoint(176, getU8Pos4()));
11911654b22aSTyker 
11921654b22aSTyker   CheckMul(APFixedPoint(512, getS16Neg18()), APFixedPoint(512, getS16Neg18()),
11931654b22aSTyker            APFixedPoint(1, getS16Neg18()));
11941654b22aSTyker   CheckMul(APFixedPoint(32, getU8Neg10()), APFixedPoint(32, getU8Neg10()),
11951654b22aSTyker            APFixedPoint(1, getU8Neg10()));
11961654b22aSTyker 
11971654b22aSTyker   CheckMul(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS16Neg18()),
11981654b22aSTyker            APFixedPoint(44,
11991654b22aSTyker                         FixedPointSemantics(52, FixedPointSemantics::Lsb{-18},
12001654b22aSTyker                                             true, false, false)));
12011654b22aSTyker   CheckMul(
12021654b22aSTyker       APFixedPoint(11, getU8Neg10()), APFixedPoint(-9472, getS16Neg18()),
12031654b22aSTyker       APFixedPoint(-102, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12041654b22aSTyker                                              true, false, false)));
12051654b22aSTyker   CheckMul(
12061654b22aSTyker       APFixedPoint::getMax(getU8Neg10()), APFixedPoint::getMax(getS16Neg18()),
12071654b22aSTyker       APFixedPoint(8159, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12081654b22aSTyker                                              true, false, false)));
12091654b22aSTyker   CheckMul(
12101654b22aSTyker       APFixedPoint::getMin(getU8Neg10()), APFixedPoint::getMin(getS16Neg18()),
12111654b22aSTyker       APFixedPoint(0, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12121654b22aSTyker                                           true, false, false)));
12131654b22aSTyker   CheckMul(APFixedPoint::getMin(getS32Pos2()),
12141654b22aSTyker            APFixedPoint::getMin(getS16Neg18()),
12151654b22aSTyker            APFixedPoint(281474976710656,
12161654b22aSTyker                         FixedPointSemantics(52, FixedPointSemantics::Lsb{-18},
12171654b22aSTyker                                             true, false, false)));
12181654b22aSTyker   CheckMulOverflow(APFixedPoint::getMax(getS32Pos2()), APFixedPoint::getMax(getU8Pos4()));
12191654b22aSTyker   CheckMulOverflow(APFixedPoint::getMin(getS32Pos2()), APFixedPoint::getMax(getU8Pos4()));
12201654b22aSTyker }
12211654b22aSTyker 
12221654b22aSTyker void CheckDiv(const APFixedPoint &Lhs, const APFixedPoint &Rhs,
12231654b22aSTyker               const APFixedPoint &Expected) {
12241654b22aSTyker   bool Overflow = false;
12251654b22aSTyker   APFixedPoint Result = Lhs.div(Rhs, &Overflow);
12261654b22aSTyker   ASSERT_FALSE(Overflow);
12271654b22aSTyker   ASSERT_EQ(Result.getSemantics(), Expected.getSemantics());
12281654b22aSTyker   ASSERT_EQ(Result, Expected);
12291654b22aSTyker }
12301654b22aSTyker 
12311654b22aSTyker void CheckDivOverflow(const APFixedPoint &Lhs, const APFixedPoint &Rhs) {
12321654b22aSTyker   bool Overflow = false;
12331654b22aSTyker   APFixedPoint Result = Lhs.div(Rhs, &Overflow);
12341654b22aSTyker   ASSERT_TRUE(Overflow);
12351654b22aSTyker }
12361654b22aSTyker 
12371654b22aSTyker TEST(FixedPoint, div) {
12381654b22aSTyker   CheckDiv(APFixedPoint(1, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
12391654b22aSTyker            APFixedPoint(0, getS32Pos2()));
12401654b22aSTyker   CheckDivOverflow(APFixedPoint(1, getS16Neg18()), APFixedPoint(1, getS16Neg18()));
12411654b22aSTyker   CheckDivOverflow(APFixedPoint(1, getU8Neg10()), APFixedPoint(1, getU8Neg10()));
12421654b22aSTyker   CheckDiv(APFixedPoint(1, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
12431654b22aSTyker            APFixedPoint(0, getU8Pos4()));
12441654b22aSTyker 
12451654b22aSTyker   CheckDiv(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS32Pos2()),
12461654b22aSTyker            APFixedPoint(2, getS32Pos2()));
12471654b22aSTyker   CheckDiv(APFixedPoint(11, getU8Pos4()), APFixedPoint(1, getU8Pos4()),
12481654b22aSTyker            APFixedPoint(0, getU8Pos4()));
12491654b22aSTyker 
12501654b22aSTyker   CheckDiv(APFixedPoint(11, getS32Pos2()), APFixedPoint(1, getS16Neg18()),
12511654b22aSTyker            APFixedPoint(3023656976384,
12521654b22aSTyker                         FixedPointSemantics(52, FixedPointSemantics::Lsb{-18},
12531654b22aSTyker                                             true, false, false)));
12541654b22aSTyker   CheckDiv(APFixedPoint(11, getU8Neg10()), APFixedPoint(-11264, getS16Neg18()),
12551654b22aSTyker            APFixedPoint::getMin(FixedPointSemantics(
12561654b22aSTyker                17, FixedPointSemantics::Lsb{-18}, true, false, false)));
12571654b22aSTyker   CheckDiv(APFixedPoint(11, getU8Neg10()), APFixedPoint(11265, getS16Neg18()),
12581654b22aSTyker            APFixedPoint(0xfffa,
12591654b22aSTyker                         FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12601654b22aSTyker                                             true, false, false)));
12611654b22aSTyker   CheckDivOverflow(APFixedPoint(11, getU8Neg10()),
12621654b22aSTyker                    APFixedPoint(11264, getS16Neg18()));
12631654b22aSTyker 
12641654b22aSTyker   CheckDivOverflow(APFixedPoint(11, getU8Neg10()),
12651654b22aSTyker                    APFixedPoint(-9472, getS16Neg18()));
12661654b22aSTyker   CheckDivOverflow(APFixedPoint::getMax(getU8Neg10()),
12671654b22aSTyker                    APFixedPoint::getMax(getS16Neg18()));
12681654b22aSTyker   CheckDiv(
12691654b22aSTyker       APFixedPoint::getMin(getU8Neg10()), APFixedPoint::getMin(getS16Neg18()),
12701654b22aSTyker       APFixedPoint(0, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12711654b22aSTyker                                           true, false, false)));
12721654b22aSTyker   CheckDiv(
12731654b22aSTyker       APFixedPoint(1, getU8Neg10()), APFixedPoint::getMin(getS16Neg18()),
12741654b22aSTyker       APFixedPoint(-2048, FixedPointSemantics(17, FixedPointSemantics::Lsb{-18},
12751654b22aSTyker                                               true, false, false)));
1276dd3014f3SBevin Hansson }
1277dd3014f3SBevin Hansson 
1278a579782aSTimm Baeder TEST(FixedPoint, semanticsSerialization) {
1279a579782aSTimm Baeder   auto roundTrip = [](FixedPointSemantics FPS) -> bool {
1280a579782aSTimm Baeder     uint32_t I = FPS.toOpaqueInt();
1281a579782aSTimm Baeder     FixedPointSemantics FPS2 = FixedPointSemantics::getFromOpaqueInt(I);
1282a579782aSTimm Baeder     return FPS == FPS2;
1283a579782aSTimm Baeder   };
1284a579782aSTimm Baeder 
1285a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getS32Pos2()));
1286a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getU8Pos4()));
1287a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getS16Neg18()));
1288a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getU8Neg10()));
1289a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadULFractSema()));
1290a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadUFractSema()));
1291a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadUSFractSema()));
1292a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadULAccumSema()));
1293a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadUAccumSema()));
1294a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getPadUSAccumSema()));
1295a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getULFractSema()));
1296a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getUFractSema()));
1297a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getUSFractSema()));
1298a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getULAccumSema()));
1299a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getUAccumSema()));
1300a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getUSAccumSema()));
1301a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getLFractSema()));
1302a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getFractSema()));
1303a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getSFractSema()));
1304a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getLAccumSema()));
1305a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getAccumSema()));
1306a579782aSTimm Baeder   ASSERT_TRUE(roundTrip(getSAccumSema()));
1307a579782aSTimm Baeder }
1308a579782aSTimm Baeder 
13091a995a0aSBevin Hansson } // namespace
1310