mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			185 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![allow(unused_macros)]
 | |
| #![allow(unreachable_code)]
 | |
| #![cfg_attr(f128_enabled, feature(f128))]
 | |
| 
 | |
| use builtins_test::*;
 | |
| 
 | |
| mod float_comparisons {
 | |
|     use super::*;
 | |
| 
 | |
|     macro_rules! cmp {
 | |
|         (
 | |
|             $f:ty, $x:ident, $y:ident, $apfloat_ty:ident, $sys_available:meta,
 | |
|             $($unordered_val:expr, $fn:ident);*;
 | |
|         ) => {
 | |
|             $(
 | |
|                 let cmp0 = if apfloat_fallback!(
 | |
|                         $f, $apfloat_ty, $sys_available,
 | |
|                         |x: FloatTy| x.is_nan() => no_convert,
 | |
|                         $x
 | |
|                     ) || apfloat_fallback!(
 | |
|                         $f, $apfloat_ty, $sys_available,
 | |
|                         |y: FloatTy| y.is_nan() => no_convert,
 | |
|                         $y
 | |
|                     )
 | |
|                 {
 | |
|                     $unordered_val
 | |
|                 } else if apfloat_fallback!(
 | |
|                     $f, $apfloat_ty, $sys_available,
 | |
|                     |x, y| x < y => no_convert,
 | |
|                     $x, $y
 | |
|                 ) {
 | |
|                     -1
 | |
|                 } else if apfloat_fallback!(
 | |
|                     $f, $apfloat_ty, $sys_available,
 | |
|                     |x, y| x == y => no_convert,
 | |
|                     $x, $y
 | |
|                 ) {
 | |
|                     0
 | |
|                 } else {
 | |
|                     1
 | |
|                 };
 | |
| 
 | |
|                 let cmp1 = $fn($x, $y);
 | |
|                 if cmp0 != cmp1 {
 | |
|                     panic!(
 | |
|                         "{}({:?}, {:?}): std: {:?}, builtins: {:?}",
 | |
|                         stringify!($fn), $x, $y, cmp0, cmp1
 | |
|                     );
 | |
|                 }
 | |
|             )*
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn cmp_f32() {
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __eqsf2, __gesf2, __gtsf2, __lesf2, __ltsf2, __nesf2, __unordsf2,
 | |
|         };
 | |
| 
 | |
|         fuzz_float_2(N, |x: f32, y: f32| {
 | |
|             assert_eq!(__unordsf2(x, y) != 0, x.is_nan() || y.is_nan());
 | |
|             cmp!(f32, x, y, Single, all(),
 | |
|                 1, __ltsf2;
 | |
|                 1, __lesf2;
 | |
|                 1, __eqsf2;
 | |
|                 -1, __gesf2;
 | |
|                 -1, __gtsf2;
 | |
|                 1, __nesf2;
 | |
|             );
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn cmp_f64() {
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __eqdf2, __gedf2, __gtdf2, __ledf2, __ltdf2, __nedf2, __unorddf2,
 | |
|         };
 | |
| 
 | |
|         fuzz_float_2(N, |x: f64, y: f64| {
 | |
|             assert_eq!(__unorddf2(x, y) != 0, x.is_nan() || y.is_nan());
 | |
|             cmp!(f64, x, y, Double, all(),
 | |
|                 1, __ltdf2;
 | |
|                 1, __ledf2;
 | |
|                 1, __eqdf2;
 | |
|                 -1, __gedf2;
 | |
|                 -1, __gtdf2;
 | |
|                 1, __nedf2;
 | |
|             );
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     #[cfg(f128_enabled)]
 | |
|     fn cmp_f128() {
 | |
|         #[cfg(any(target_arch = "powerpc", target_arch = "powerpc64"))]
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __eqkf2 as __eqtf2, __gekf2 as __getf2, __gtkf2 as __gttf2, __lekf2 as __letf2,
 | |
|             __ltkf2 as __lttf2, __nekf2 as __netf2, __unordkf2 as __unordtf2,
 | |
|         };
 | |
|         #[cfg(not(any(target_arch = "powerpc", target_arch = "powerpc64")))]
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __eqtf2, __getf2, __gttf2, __letf2, __lttf2, __netf2, __unordtf2,
 | |
|         };
 | |
| 
 | |
|         fuzz_float_2(N, |x: f128, y: f128| {
 | |
|             let x_is_nan = apfloat_fallback!(
 | |
|                 f128, Quad, not(feature = "no-sys-f128"),
 | |
|                 |x: FloatTy| x.is_nan() => no_convert,
 | |
|                 x
 | |
|             );
 | |
|             let y_is_nan = apfloat_fallback!(
 | |
|                 f128, Quad, not(feature = "no-sys-f128"),
 | |
|                 |x: FloatTy| x.is_nan() => no_convert,
 | |
|                 y
 | |
|             );
 | |
| 
 | |
|             assert_eq!(__unordtf2(x, y) != 0, x_is_nan || y_is_nan);
 | |
| 
 | |
|             cmp!(f128, x, y, Quad, not(feature = "no-sys-f128"),
 | |
|                 1, __lttf2;
 | |
|                 1, __letf2;
 | |
|                 1, __eqtf2;
 | |
|                 -1, __getf2;
 | |
|                 -1, __gttf2;
 | |
|                 1, __netf2;
 | |
|             );
 | |
|         });
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[cfg(target_arch = "arm")]
 | |
| mod float_comparisons_arm {
 | |
|     use super::*;
 | |
| 
 | |
|     macro_rules! cmp2 {
 | |
|         ($x:ident, $y:ident, $($unordered_val:expr, $fn_std:expr, $fn_builtins:ident);*;) => {
 | |
|             $(
 | |
|                 let cmp0: i32 = if $x.is_nan() || $y.is_nan() {
 | |
|                     $unordered_val
 | |
|                 } else {
 | |
|                     $fn_std as i32
 | |
|                 };
 | |
|                 let cmp1: i32 = $fn_builtins($x, $y);
 | |
|                 if cmp0 != cmp1 {
 | |
|                     panic!("{}({}, {}): std: {}, builtins: {}", stringify!($fn_builtins), $x, $y, cmp0, cmp1);
 | |
|                 }
 | |
|             )*
 | |
|         };
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn cmp_f32() {
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __aeabi_fcmpeq, __aeabi_fcmpge, __aeabi_fcmpgt, __aeabi_fcmple, __aeabi_fcmplt,
 | |
|         };
 | |
| 
 | |
|         fuzz_float_2(N, |x: f32, y: f32| {
 | |
|             cmp2!(x, y,
 | |
|                 0, x < y, __aeabi_fcmplt;
 | |
|                 0, x <= y, __aeabi_fcmple;
 | |
|                 0, x == y, __aeabi_fcmpeq;
 | |
|                 0, x >= y, __aeabi_fcmpge;
 | |
|                 0, x > y, __aeabi_fcmpgt;
 | |
|             );
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     #[test]
 | |
|     fn cmp_f64() {
 | |
|         use compiler_builtins::float::cmp::{
 | |
|             __aeabi_dcmpeq, __aeabi_dcmpge, __aeabi_dcmpgt, __aeabi_dcmple, __aeabi_dcmplt,
 | |
|         };
 | |
| 
 | |
|         fuzz_float_2(N, |x: f64, y: f64| {
 | |
|             cmp2!(x, y,
 | |
|                 0, x < y, __aeabi_dcmplt;
 | |
|                 0, x <= y, __aeabi_dcmple;
 | |
|                 0, x == y, __aeabi_dcmpeq;
 | |
|                 0, x >= y, __aeabi_dcmpge;
 | |
|                 0, x > y, __aeabi_dcmpgt;
 | |
|             );
 | |
|         });
 | |
|     }
 | |
| }
 | 
