123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- use testcrate::*
- macro_rules! mul {
- ($($i:ty, $fn:ident)
- $(
- fuzz_2(N, |x: $i, y: $i| {
- let mul0 = x.wrapping_mul(y)
- let mul1: $i = $fn(x, y)
- if mul0 != mul1 {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn), x, y, mul0, mul1
- )
- }
- })
- )*
- }
- }
- #[test]
- fn mul() {
- use compiler_builtins::int::mul::{__muldi3, __multi3}
- mul!(
- u64, __muldi3
- i128, __multi3
- )
- }
- macro_rules! overflowing_mul {
- ($($i:ty, $fn:ident)
- $(
- fuzz_2(N, |x: $i, y: $i| {
- let (mul0, o0) = x.overflowing_mul(y)
- let mut o1 = 0i32
- let mul1: $i = $fn(x, y, &mut o1)
- let o1 = o1 != 0
- if mul0 != mul1 || o0 != o1 {
- panic!(
- "{}({}, {}): std: ({}, {}), builtins: ({}, {})",
- stringify!($fn), x, y, mul0, o0, mul1, o1
- )
- }
- })
- )*
- }
- }
- #[test]
- fn overflowing_mul() {
- use compiler_builtins::int::mul::{
- __mulodi4, __mulosi4, __muloti4, __rust_i128_mulo, __rust_u128_mulo,
- }
- overflowing_mul!(
- i32, __mulosi4
- i64, __mulodi4
- i128, __muloti4
- )
- fuzz_2(N, |x: u128, y: u128| {
- let (mul0, o0) = x.overflowing_mul(y)
- let (mul1, o1) = __rust_u128_mulo(x, y)
- if mul0 != mul1 || o0 != o1 {
- panic!(
- "__rust_u128_mulo({}, {}): std: ({}, {}), builtins: ({}, {})",
- x, y, mul0, o0, mul1, o1
- )
- }
- let x = x as i128
- let y = y as i128
- let (mul0, o0) = x.overflowing_mul(y)
- let (mul1, o1) = __rust_i128_mulo(x, y)
- if mul0 != mul1 || o0 != o1 {
- panic!(
- "__rust_i128_mulo({}, {}): std: ({}, {}), builtins: ({}, {})",
- x, y, mul0, o0, mul1, o1
- )
- }
- })
- }
- macro_rules! float_mul {
- ($($f:ty, $fn:ident)
- $(
- fuzz_float_2(N, |x: $f, y: $f| {
- let mul0 = x * y
- let mul1: $f = $fn(x, y)
- // multiplication of subnormals is not currently handled
- if !(Float::is_subnormal(&mul0) || Float::is_subnormal(&mul1)) {
- if !Float::eq_repr(mul0, mul1) {
- panic!(
- "{}({}, {}): std: {}, builtins: {}",
- stringify!($fn), x, y, mul0, mul1
- )
- }
- }
- })
- )*
- }
- }
- #[cfg(not(all(target_arch = "x86", not(target_feature = "sse"))))]
- #[test]
- fn float_mul() {
- use compiler_builtins::float::{
- mul::{__muldf3, __mulsf3},
- Float,
- }
- float_mul!(
- f32, __mulsf3
- f64, __muldf3
- )
- }
|