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;
- );
- }
|