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_j2i.c | 45 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 43 insertions(+), 2 deletions(-) (limited to 'libj2_j2i_sub_j2i.c') diff --git a/libj2_j2i_sub_j2i.c b/libj2_j2i_sub_j2i.c index 0492bea..78dea79 100644 --- a/libj2_j2i_sub_j2i.c +++ b/libj2_j2i_sub_j2i.c @@ -100,20 +100,41 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t b_high, uintmax_t b_low) r = a; EXPECT(libj2_j2i_sub_j2i_to_j2i_overflow(CONST_ARG &r, CONST_ARG &b, &r) == expected_overflow); - EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); r = b; EXPECT(libj2_j2i_sub_j2i_to_j2i_overflow(CONST_ARG &a, CONST_ARG &r, &r) == expected_overflow); EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); - EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); EXPECT(libj2_j2i_eq_j2i(&r, &expected)); r = a; EXPECT(libj2_j2i_sub_j2i_to_j2i_overflow(CONST_ARG &r, CONST_ARG &r, &r) == 0); EXPECT(libj2_j2i_is_zero(&r)); + r = (struct libj2_j2i){111, 222}; + libj2_j2i_sat_sub_j2i_to_j2i(CONST_ARG &a, CONST_ARG &b, &r); + EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); + EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); + 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_sat_sub_j2i_to_j2i(CONST_ARG &r, CONST_ARG &b, &r); + EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); + EXPECT(expected_overflow > 0 ? libj2_j2i_is_max(&r) : + expected_overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, &expected)); + + r = b; + libj2_j2i_sat_sub_j2i_to_j2i(CONST_ARG &a, CONST_ARG &r, &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 = a; + libj2_j2i_sat_sub_j2i_to_j2i(CONST_ARG &r, CONST_ARG &r, &r); + EXPECT(libj2_j2i_is_zero(&r)); + r = (struct libj2_j2i){111, 222}; libj2_j2i_sub_j2i_to_j2i(CONST_ARG &a, CONST_ARG &b, &r); EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); @@ -151,6 +172,16 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t b_high, uintmax_t b_low) EXPECT(libj2_j2i_sub_j2i_overflow(&r, CONST_ARG &r) == 0); EXPECT(libj2_j2i_is_zero(&r)); + r = a; + libj2_j2i_sat_sub_j2i(&r, CONST_ARG &b); + EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); + 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_sat_sub_j2i(&r, CONST_ARG &r); + EXPECT(libj2_j2i_is_zero(&r)); + r = a; libj2_j2i_sub_j2i(&r, CONST_ARG &b); EXPECT(libj2_j2i_eq_j2i(&b, &b_saved)); @@ -177,6 +208,16 @@ check(uintmax_t a_high, uintmax_t a_low, uintmax_t b_high, uintmax_t b_low) EXPECT(libj2_j2i_rsub_j2i_overflow(&r, CONST_ARG &r) == 0); EXPECT(libj2_j2i_is_zero(&r)); + r = b; + libj2_j2i_sat_rsub_j2i(&r, CONST_ARG &a); + 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 = a; + libj2_j2i_sat_rsub_j2i(&r, CONST_ARG &r); + EXPECT(libj2_j2i_is_zero(&r)); + r = b; libj2_j2i_rsub_j2i(&r, CONST_ARG &a); EXPECT(libj2_j2i_eq_j2i(&a, &a_saved)); -- cgit v1.2.3-70-g09d2