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