[v2,05/13] ipa: libipa: fixedpoint: Fix unsigned usage
diff mbox series

Message ID 20251029172439.1513907-6-kieran.bingham@ideasonboard.com
State New
Headers show
Series
  • libipa: Introduce a Quantized type
Related show

Commit Message

Kieran Bingham Oct. 29, 2025, 5:24 p.m. UTC
The fixedToFloatingPoint does not support unsigned Q types, and
incorrectly sign-extends all values which have the top most bit set in
the quantized values.

Fix this by ensuring that only signed types perform sign extension, and
simplify the calcuation for unsigned types.

Convert the storage of the test cases to signed types to correctly
represent their intended purpose, to prevent test failures.

Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
---
 src/ipa/libipa/fixedpoint.h    | 3 +++
 test/ipa/libipa/fixedpoint.cpp | 6 +++---
 2 files changed, 6 insertions(+), 3 deletions(-)

Patch
diff mbox series

diff --git a/src/ipa/libipa/fixedpoint.h b/src/ipa/libipa/fixedpoint.h
index 9a7674e528d9..557f7f5b3382 100644
--- a/src/ipa/libipa/fixedpoint.h
+++ b/src/ipa/libipa/fixedpoint.h
@@ -51,6 +51,9 @@  constexpr R fixedToFloatingPoint(T number)
 	static_assert(sizeof(int) >= sizeof(T));
 	static_assert(I + F <= sizeof(T) * 8);
 
+	if constexpr (std::is_unsigned_v<T>)
+		return static_cast<R>(number) / static_cast<R>(1 << F);
+
 	/*
 	 * Recreate the upper bits in case of a negative number by shifting the sign
 	 * bit from the fixed point to the first bit of the unsigned and then right shifting
diff --git a/test/ipa/libipa/fixedpoint.cpp b/test/ipa/libipa/fixedpoint.cpp
index c88b53a31f28..6f6ef4ce258e 100644
--- a/test/ipa/libipa/fixedpoint.cpp
+++ b/test/ipa/libipa/fixedpoint.cpp
@@ -70,7 +70,7 @@  protected:
 		 * The second 7.992 test is to test that unused bits don't
 		 * affect the result.
 		 */
-		std::map<double, uint16_t> testCases = {
+		std::map<double, int16_t> testCases = {
 			{ 7.992, 0x3ff },
 			{   0.2, 0x01a },
 			{  -0.2, 0x7e6 },
@@ -83,14 +83,14 @@  protected:
 
 		int ret;
 		for (const auto &testCase : testCases) {
-			ret = testSingleFixedPoint<4, 7, uint16_t>(testCase.first,
+			ret = testSingleFixedPoint<4, 7, int16_t>(testCase.first,
 								   testCase.second);
 			if (ret != TestPass)
 				return ret;
 		}
 
 		/* Special case with a superfluous one in the unused bits */
-		ret = testFixedToFloat<4, 7, uint16_t, double>(0xbff, 7.992);
+		ret = testFixedToFloat<4, 7, int16_t, double>(0xbff, 7.992);
 		if (ret != TestPass)
 			return ret;