test_binary_op!(
test_add_sat,
"primitive.math.add_sat",
[
(0x00000000, 0x00000000, 0x00000000, "zero vs zero"),
(0x00000001, 0x00000000, 0x00000001, "one vs zero"),
(0xFFFFFFFF, 0x00000001, 0xFFFFFFFF, "saturation at max"),
(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, "double max saturation"),
(0x80000000, 0x80000000, 0xFFFFFFFF, "sign-bit overflow saturates"),
(0x00000007, 0x00000003, 0x0000000A, "prime vs prime"),
]
);
test_binary_op!(
test_sub_sat,
"primitive.math.sub_sat",
[
(0x00000000, 0x00000000, 0x00000000, "zero vs zero"),
(0x00000001, 0x00000000, 0x00000001, "one vs zero"),
(0x00000000, 0x00000001, 0x00000000, "underflow saturates at zero"),
(0x00000005, 0x0000000A, 0x00000000, "underflow saturates"),
(0xFFFFFFFF, 0x00000001, 0xFFFFFFFE, "max minus one"),
(0x0000000C, 0x00000005, 0x00000007, "composite vs prime"),
]
);
test_binary_op!(
test_abs_diff,
"primitive.math.abs_diff",
[
(0x00000000, 0x00000000, 0x00000000, "zero vs zero"),
(0x0000000A, 0x00000005, 0x00000005, "a > b"),
(0x00000005, 0x0000000A, 0x00000005, "b > a"),
(0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, "max vs zero"),
(0x00000000, 0xFFFFFFFF, 0xFFFFFFFF, "zero vs max"),
(0x80000000, 0x80000000, 0x00000000, "same sign-bit"),
]
);
test_binary_op!(
test_gcd,
"primitive.math.gcd",
[
(0x00000000, 0x00000000, 0x00000000, "zero vs zero"),
(0x0000000C, 0x00000008, 0x00000004, "gcd(12, 8) = 4"),
(0x00000007, 0x00000003, 0x00000001, "coprime"),
(0x00000064, 0x0000001E, 0x00000002, "gcd(100, 30) = 2"),
(0x00000000, 0x00000005, 0x00000005, "gcd(0, 5) = 5"),
(0x00000005, 0x00000000, 0x00000005, "gcd(5, 0) = 5"),
]
);
test_binary_op!(
test_lcm,
"primitive.math.lcm",
[
(0x00000000, 0x00000000, 0x00000000, "zero vs zero"),
(0x00000004, 0x00000006, 0x0000000C, "lcm(4, 6) = 12"),
(0x00000007, 0x00000003, 0x00000015, "lcm(7, 3) = 21"),
(0x00000000, 0x00000005, 0x00000000, "lcm(0, 5) = 0"),
(0x00000005, 0x00000000, 0x00000000, "lcm(5, 0) = 0"),
(0x00000001, 0xFFFFFFFF, 0xFFFFFFFF, "lcm(1, max) = max"),
]
);