From 0d4c3e8f6be098e953502589b17cb28197322442 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Wed, 11 Feb 2026 11:20:10 +0100 Subject: Finish signed saturated math MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libj2_j2i_sub_ji.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) (limited to 'libj2_j2i_sub_ji.c') diff --git a/libj2_j2i_sub_ji.c b/libj2_j2i_sub_ji.c index 4fc8e0e..34222f6 100644 --- a/libj2_j2i_sub_ji.c +++ b/libj2_j2i_sub_ji.c @@ -97,6 +97,13 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t ub) validate(a.high, a.low, b < 0 ? UINTMAX_MAX : 0U, ub, expected.high, expected.low, expected_overflow); + a = a_saved; + r = (struct libj2_j2i){111, 222}; + libj2_j2i_sat_sub_ji_to_j2i((const struct libj2_j2i *)&a, b, &r); + EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + r = (struct libj2_j2i){111, 222}; libj2_j2i_sub_ji_to_j2i((const struct libj2_j2i *)&a, b, &r); EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); @@ -114,6 +121,11 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t ub) EXPECT(libj2_j2i_sub_ji_overflow(&r, b) == expected_overflow); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); + r = a; + libj2_j2i_sat_sub_ji(&r, b); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + r = a; libj2_j2i_sub_ji(&r, b); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); @@ -126,6 +138,13 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t ub) EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); + a = a_saved; + r = (struct libj2_j2i){111, 222}; + libj2_ji_sat_sub_j2i_to_j2i(b, (const struct libj2_j2i *)&a, &r); + EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + validate(b < 0 ? UINTMAX_MAX : 0U, ub, a.high, a.low, expected.high, expected.low, expected_overflow); EXPECT(libj2_ji_sub_j2i_overflow_p(b, (const struct libj2_j2i *)&a) == expected_overflow); @@ -144,10 +163,20 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t ub) EXPECT(libj2_ji_sub_j2i_to_j2i_overflow(b, (const struct libj2_j2i *)&r, &r) == expected_overflow); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); + r = a; + libj2_ji_sat_sub_j2i_to_j2i(b, (const struct libj2_j2i *)&r, &r); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + r = a; EXPECT(libj2_j2i_rsub_ji_overflow(&r, b) == expected_overflow); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); + r = a; + libj2_j2i_sat_rsub_ji(&r, b); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + EXPECT(libj2_j2i_rsub_ji_overflow_p((const struct libj2_j2i *)&a, b) == expected_overflow); EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); -- cgit v1.2.3-70-g09d2