use rustc_apfloat::ieee::{Double, Single, X87DoubleExtended};
use rustc_apfloat::Float;
pub const FUZZ_IEEE32_ROUNDTRIP_THROUGH_I128_CASES: &[u32] = &[
0xff000000, 0xff00e203, 0xff00e900, 0xff7fffff, 0xff800000, ];
pub const FUZZ_IEEE64_ROUNDTRIP_THROUGH_I128_CASES: &[u64] = &[
0xc7e5d58020ffedff, 0xc7e7fffefefeff00, 0xc7e8030000653636, 0xea3501e2e8950007, 0xf3ff0620ca000600, 0xffc909842600d4ff, 0xfff0000000000000, ];
#[test]
fn fuzz_roundtrip_through_i128() {
for &bits in FUZZ_IEEE32_ROUNDTRIP_THROUGH_I128_CASES {
assert_eq!(
Single::from_i128(Single::from_bits(bits.into()).to_i128(128).value)
.value
.to_bits(),
(f32::from_bits(bits) as i128 as f32).to_bits().into()
);
}
for &bits in FUZZ_IEEE64_ROUNDTRIP_THROUGH_I128_CASES {
assert_eq!(
Double::from_i128(Double::from_bits(bits.into()).to_i128(128).value)
.value
.to_bits(),
(f64::from_bits(bits) as i128 as f64).to_bits().into()
);
}
}
pub const FUZZ_IEEE32_FMA_CASES_WITH_EXPECTED_OUTPUTS: &[((u32, u32, u32), u32)] = &[
((0x00001000 , 0x0000001a , 0xffff1a00 ), 0xffff1a00 ),
((0x000080aa , 0xaaff0000 , 0xff9e007f ), 0xffde007f ),
((0x0000843f , 0x0084ff80 , 0xffff8000 ), 0xffff8000 ),
((0x00009eaa , 0x201d7f1e , 0xffff0001 ), 0xffff0001 ),
((0x020400ff , 0x7f7f2200 , 0xffffffff ), 0xffffffff ),
((0x02060320 , 0x20002521 , 0x7f800000 ), 0x7f800000 ),
(
(0x04000080 , 0xff7fff00 , 0xff800000 ),
0xff800000,
),
(
(0x04007faa , 0xff200000 , 0xffff0000 ),
0xffff0000,
),
((0x1e0603ff , 0x00100000 , 0xffffff4f ), 0xffffff4f ),
((0x200004aa , 0x00202020 , 0x7fff00ff ), 0x7fff00ff ),
(
(0x20005eaa , 0x9e9e9e3a , 0xff9e009e ),
0xffde009e,
),
((0x20007faa , 0x9e00611e , 0x7faa0600 ), 0x7fea0600 ),
(
(0x20007faa , 0xaa069e1e , 0xffffecff ),
0xffffecff,
),
((0x20025eaa , 0x9e01033a , 0xff9e009e ), 0xffde009e ),
((0x3314f400 , 0x00ff7903 , 0xffffffdb ), 0xffffffdb ),
((0x3314f400 , 0x00ff7903 , 0xfffffff6 ), 0xfffffff6 ),
((0x3a218275 , 0x3a3a3a3a , 0x7f8a063a ), 0x7fca063a ),
((0x40000001 , 0xfefffffe , 0xfffe40ff ), 0xfffe40ff ),
((0x50007faa , 0x000011fb , 0xff800000 ), 0xff800000 ),
((0x64007f8b , 0xfa9a8702 , 0xff820000 ), 0xffc20000 ),
((0x6a017faa , 0x00000070 , 0xff80db03 ), 0xffc0db03 ),
((0x6a017faa , 0x00000070 , 0xff80db23 ), 0xffc0db23 ),
(
(0x6e000000 , 0xdf008000 , 0x7f800000 ),
0x7f800000,
),
((0x7f7fff00 , 0x02000080 , 0x7fc00000 ), 0x7fc00000 ),
(
(0xb3eb00ff , 0x00ffefe2 , 0xfffffee9 ),
0xfffffee9,
),
(
(0xdf0603ff , 0x808000ff , 0xff9b0000 ),
0xffdb0000,
),
(
(
0xf1001101,
0x7f400000,
0x7f800000,
),
0x7f800000,
),
((0xf5000080 , 0xc9ffff00 , 0xffff7fff ), 0xffff7fff ),
(
(0xf5ffffff , 0xff000b09 , 0xff800000 ),
0xff800000,
),
(
(0xf70029e8 , 0xf7ffff7f , 0xffff7fff ),
0xffff7fff,
),
(
(0xff007faa , 0xd3fface5 , 0xffff7f00 ),
0xffff7f00,
),
(
(0xff200000 , 0xe380ffff , 0xff800000 ),
0xff800000,
),
((0xff6d0000 , 0xc12005ff , 0xff800000 ), 0xff800000 ),
];
pub const FUZZ_IEEE64_FMA_CASES_WITH_EXPECTED_OUTPUTS: &[((u64, u64, u64), u64)] = &[
(
(
0x000000000000001e,
0x00000000ffdf0000,
0xffffff8000000000,
),
0xffffff8000000000,
),
(
(
0x000000007fffffff,
0xff00000000200000,
0xfffd0000000000e9,
),
0xfffd0000000000e9,
),
(
(
0x0000020000e30000,
0xff00000011000000,
0xfffd00000000e0e9,
),
0xfffd00000000e0e9,
),
(
(
0x0000040000006400,
0x000000e5ff000000,
0xffffffe300000000,
),
0xffffffe300000000,
),
(
(
0x00006a0000000000,
0x005015000018f9f1,
0x7fffffde00000000,
),
0x7fffffde00000000,
),
(
(
0x00007ffa01000373,
0x0005000000ff107f,
0xffffffff00000005,
),
0xffffffff00000005,
),
(
(
0x0000ff8000000000,
0x0000000001000000,
0xfff0000000000000,
),
0xfff0000000000000,
),
(
(
0x0002a000f6290000,
0x400013fffd000000,
0xfffdfe0000ff9aff,
),
0xfffdfe0000ff9aff,
),
(
(
0x0006000000001700,
0xd9000000da080000,
0xfffffee5000000fd,
),
0xfffffee5000000fd,
),
(
(
0x0006000040000013,
0xfafe036500061100,
0xffff7fff00001011,
),
0xffff7fff00001011,
),
(
(
0x00f1000000640000,
0xffe6005e00000000,
0xfffd007000000000,
),
0xfffd007000000000,
),
(
(
0x05203a0080ff0513,
0xf90000000000f7ff,
0xfff0000000000000,
),
0xfff0000000000000,
),
(
(
0x0540400001000513,
0xee05130640000100,
0x7fff00001004fa01,
),
0x7fff00001004fa01,
),
(
(
0x0540400001000513,
0xffd8000000000000,
0xfff0001000000000,
),
0xfff8001000000000,
),
(
(
0x054040000100e213,
0xfbd8000000000000,
0xfff0ff1000000000,
),
0xfff8ff1000000000,
),
(
(
0x060000000000ff04,
0x00000020ffff0606,
0xffffffde00001300,
),
0xffffffde00001300,
),
(
(
0x1306400001000513,
0x00001004fa03ee05,
0xfffc80f7ffff7fff,
),
0xfffc80f7ffff7fff,
),
(
(
0x1306400001000513,
0xa5001004fa01ee05,
0xfffa80f7ff1b7fff,
),
0xfffa80f7ff1b7fff,
),
(
(
0x4006400005130100,
0x0000ff4000000000,
0x7fffffec4200044b,
),
0x7fffffec4200044b,
),
(
(
0x4100000001000000,
0x0000fffffff00000,
0xfffffe00000040ff,
),
0xfffffe00000040ff,
),
(
(
0x7a7a7a7a7a7a0000,
0xff7a7a7a7a7a7a7a,
0xfffd007000ef0000,
),
0xfffd007000ef0000,
),
(
(
0x7f000012007ff010,
0x7f0000120091f010,
0xfff0000000000000,
),
0xfff0000000000000,
),
(
(
0x7f0022000a8000f6,
0xff00ebfef0800300,
0x7ff0000000000000,
),
0x7ff0000000000000,
),
(
(
0x7f06400001000513,
0xff001004fb88f7ff,
0xfffa01ee0513ffff,
),
0xfffa01ee0513ffff,
),
(
(
0xbbbbbb7f01000513,
0x0100bbbbbbbbbbbb,
0xffffff4000004000,
),
0xffffff4000004000,
),
(
(
0xbc00000000400000,
0x00bc000000004000,
0xfff0000000e20000,
),
0xfff8000000e20000,
),
(
(
0xddff000004000000,
0xff00000000000000,
0xffffff0000000000,
),
0xffffff0000000000,
),
(
(
0xe100051b060c0513,
0xfbfeee0513064110,
0xffff7fdf00001004,
),
0xffff7fdf00001004,
),
(
(
0xf0000000007ff010,
0x7f06010800180000,
0x7ff0000000000000,
),
0x7ff0000000000000,
),
(
(
0xf4ffff05021d7d12,
0xfd100000e8030000,
0xfff0000000000000,
),
0xfff0000000000000,
),
(
(
0xff0000fff05f0001,
0xff0000fff0800000,
0xfff0000000000000,
),
0xfff0000000000000,
),
];
#[test]
fn fuzz_fma_with_expected_outputs() {
for &((a_bits, b_bits, c_bits), expected_bits) in FUZZ_IEEE32_FMA_CASES_WITH_EXPECTED_OUTPUTS {
let (a, b, c) =
(Single::from_bits(a_bits.into()), Single::from_bits(b_bits.into()), Single::from_bits(c_bits.into()));
assert_eq!(a.mul_add(b, c).value.to_bits(), expected_bits.into());
}
for &((a_bits, b_bits, c_bits), expected_bits) in FUZZ_IEEE64_FMA_CASES_WITH_EXPECTED_OUTPUTS {
let (a, b, c) =
(Double::from_bits(a_bits.into()), Double::from_bits(b_bits.into()), Double::from_bits(c_bits.into()));
assert_eq!(a.mul_add(b, c).value.to_bits(), expected_bits.into());
}
}
pub const FUZZ_X87_F80_NEG_CASES_WITH_EXPECTED_OUTPUTS: &[(u128, u128)] = &[
(0x01010101010100000000 , 0xffff0101010100000000 ),
(
0x0000ff7f2300ff000000,
0x8001ff7f2300ff000000,
),
(
0x00008000000000000000,
0x80018000000000000000,
),
];
#[test]
fn fuzz_x87_f80_neg_with_expected_outputs() {
for &(bits, expected_bits) in FUZZ_X87_F80_NEG_CASES_WITH_EXPECTED_OUTPUTS {
assert_eq!((-X87DoubleExtended::from_bits(bits)).to_bits(), expected_bits);
}
}