123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- use testcrate::*
- macro_rules! sum {
- ($($i:ty, $fn_add:ident, $fn_sub:ident)
- $(
- fuzz_2(N, |x: $i, y: $i| {
- let add0 = x.wrapping_add(y)
- let sub0 = x.wrapping_sub(y)
- let add1: $i = $fn_add(x, y)
- let sub1: $i = $fn_sub(x, y)
- if add0 != add1 {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn_add), x, y, add0, add1
- )
- }
- if sub0 != sub1 {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn_sub), x, y, sub0, sub1
- )
- }
- })
- )*
- }
- }
- macro_rules! overflowing_sum {
- ($($i:ty, $fn_add:ident, $fn_sub:ident)
- $(
- fuzz_2(N, |x: $i, y: $i| {
- let add0 = x.overflowing_add(y)
- let sub0 = x.overflowing_sub(y)
- let add1: ($i, bool) = $fn_add(x, y)
- let sub1: ($i, bool) = $fn_sub(x, y)
- if add0.0 != add1.0 || add0.1 != add1.1 {
- panic!(
- "{}({}, {}): std: {:?}, builtins: {:?}",
- stringify!($fn_add), x, y, add0, add1
- )
- }
- if sub0.0 != sub1.0 || sub0.1 != sub1.1 {
- panic!(
- "{}({}, {}): std: {:?}, builtins: {:?}",
- stringify!($fn_sub), x, y, sub0, sub1
- )
- }
- })
- )*
- }
- }
- #[test]
- fn addsub() {
- use compiler_builtins::int::addsub::{
- __rust_i128_add, __rust_i128_addo, __rust_i128_sub, __rust_i128_subo, __rust_u128_add,
- __rust_u128_addo, __rust_u128_sub, __rust_u128_subo,
- }
- // Integer addition and subtraction is very simple, so 100 fuzzing passes should be plenty.
- sum!(
- u128, __rust_u128_add, __rust_u128_sub
- i128, __rust_i128_add, __rust_i128_sub
- )
- overflowing_sum!(
- u128, __rust_u128_addo, __rust_u128_subo
- i128, __rust_i128_addo, __rust_i128_subo
- )
- }
- macro_rules! float_sum {
- ($($f:ty, $fn_add:ident, $fn_sub:ident)
- $(
- fuzz_float_2(N, |x: $f, y: $f| {
- let add0 = x + y
- let sub0 = x - y
- let add1: $f = $fn_add(x, y)
- let sub1: $f = $fn_sub(x, y)
- if !Float::eq_repr(add0, add1) {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn_add), x, y, add0, add1
- )
- }
- if !Float::eq_repr(sub0, sub1) {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn_sub), x, y, sub0, sub1
- )
- }
- })
- )*
- }
- }
- #[cfg(not(all(target_arch = "x86", not(target_feature = "sse"))))]
- #[test]
- fn float_addsub() {
- use compiler_builtins::float::{
- add::{__adddf3, __addsf3},
- sub::{__subdf3, __subsf3},
- Float,
- }
- float_sum!(
- f32, __addsf3, __subsf3
- f64, __adddf3, __subdf3
- )
- }
|