aboutsummaryrefslogtreecommitdiffstats
path: root/libj2_j2i_lsh.c
diff options
context:
space:
mode:
authorMattias Andrée <m@maandree.se>2026-02-11 11:20:10 +0100
committerMattias Andrée <m@maandree.se>2026-02-11 11:20:10 +0100
commit0d4c3e8f6be098e953502589b17cb28197322442 (patch)
treedf3a13e786769e78d3d6201150f4018dc0c22cb5 /libj2_j2i_lsh.c
parentTest sat_add (diff)
downloadlibj2-0d4c3e8f6be098e953502589b17cb28197322442.tar.gz
libj2-0d4c3e8f6be098e953502589b17cb28197322442.tar.bz2
libj2-0d4c3e8f6be098e953502589b17cb28197322442.tar.xz
Finish signed saturated math
Signed-off-by: Mattias Andrée <m@maandree.se>
Diffstat (limited to '')
-rw-r--r--libj2_j2i_lsh.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/libj2_j2i_lsh.c b/libj2_j2i_lsh.c
index 053ece7..aff86bb 100644
--- a/libj2_j2i_lsh.c
+++ b/libj2_j2i_lsh.c
@@ -25,6 +25,11 @@ check(const struct libj2_j2i *a, unsigned shift, const struct libj2_j2i *expecte
EXPECT(libj2_j2i_lsh_overflow(&r, shift) == overflow);
EXPECT(libj2_j2i_eq_j2i(&r, expected));
+ r = *a;
+ libj2_j2i_sat_lsh(&r, shift);
+ EXPECT(overflow > 0 ? libj2_j2i_is_max(&r) :
+ overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, expected));
+
r = (struct libj2_j2i){111, 222};
libj2_j2i_lsh_to_j2i((const struct libj2_j2i *)a, shift, &r);
EXPECT(libj2_j2i_eq_j2i(a, &a_saved));
@@ -43,6 +48,17 @@ check(const struct libj2_j2i *a, unsigned shift, const struct libj2_j2i *expecte
EXPECT(libj2_j2i_lsh_to_j2i_overflow(&r, shift, &r) == overflow);
EXPECT(libj2_j2i_eq_j2i(&r, expected));
+ r = (struct libj2_j2i){111, 222};
+ libj2_j2i_sat_lsh_to_j2i((const struct libj2_j2i *)a, shift, &r);
+ EXPECT(libj2_j2i_eq_j2i(a, &a_saved));
+ EXPECT(overflow > 0 ? libj2_j2i_is_max(&r) :
+ overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, expected));
+
+ r = *a;
+ libj2_j2i_sat_lsh_to_j2i(&r, shift, &r);
+ EXPECT(overflow > 0 ? libj2_j2i_is_max(&r) :
+ overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, expected));
+
if (libj2_j2i_is_negative(a)) {
if (a->high != UINTMAX_MAX || ~a->low > UINTMAX_MAX >> 1)
return;
@@ -62,6 +78,11 @@ check(const struct libj2_j2i *a, unsigned shift, const struct libj2_j2i *expecte
r = (struct libj2_j2i){111, 222};
EXPECT(libj2_ji_lsh_to_j2i_overflow(v, shift, &r) == overflow);
EXPECT(libj2_j2i_eq_j2i(&r, expected));
+
+ r = (struct libj2_j2i){111, 222};
+ libj2_ji_sat_lsh_to_j2i(v, shift, &r);
+ EXPECT(overflow > 0 ? libj2_j2i_is_max(&r) :
+ overflow ? libj2_j2i_is_min(&r) : libj2_j2i_eq_j2i(&r, expected));
}