cmp.rs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. use testcrate::*;
  2. macro_rules! cmp {
  3. ($x:ident, $y:ident, $($unordered_val:expr, $fn:ident);*;) => {
  4. $(
  5. let cmp0 = if $x.is_nan() || $y.is_nan() {
  6. $unordered_val
  7. } else if $x < $y {
  8. -1
  9. } else if $x == $y {
  10. 0
  11. } else {
  12. 1
  13. };
  14. let cmp1 = $fn($x, $y);
  15. if cmp0 != cmp1 {
  16. panic!("{}({}, {}): std: {}, builtins: {}", stringify!($fn_builtins), $x, $y, cmp0, cmp1);
  17. }
  18. )*
  19. };
  20. }
  21. #[test]
  22. fn float_comparisons() {
  23. use compiler_builtins::float::cmp::{
  24. __eqdf2, __eqsf2, __gedf2, __gesf2, __gtdf2, __gtsf2, __ledf2, __lesf2, __ltdf2, __ltsf2,
  25. __nedf2, __nesf2, __unorddf2, __unordsf2,
  26. };
  27. fuzz_float_2(N, |x: f32, y: f32| {
  28. assert_eq!(__unordsf2(x, y) != 0, x.is_nan() || y.is_nan());
  29. cmp!(x, y,
  30. 1, __ltsf2;
  31. 1, __lesf2;
  32. 1, __eqsf2;
  33. -1, __gesf2;
  34. -1, __gtsf2;
  35. 1, __nesf2;
  36. );
  37. });
  38. fuzz_float_2(N, |x: f64, y: f64| {
  39. assert_eq!(__unorddf2(x, y) != 0, x.is_nan() || y.is_nan());
  40. cmp!(x, y,
  41. 1, __ltdf2;
  42. 1, __ledf2;
  43. 1, __eqdf2;
  44. -1, __gedf2;
  45. -1, __gtdf2;
  46. 1, __nedf2;
  47. );
  48. });
  49. }