11#![ cfg_attr( f128_enabled, feature( f128) ) ]
22
33use builtins_test:: float_bench;
4- use compiler_builtins:: float:: cmp;
4+ use compiler_builtins:: float:: cmp:: { self , CmpResult } ;
55use criterion:: { Criterion , criterion_main} ;
66
77/// `gt` symbols are allowed to return differing results, they just get compared
88/// to 0.
9- fn gt_res_eq ( a : i32 , b : i32 ) -> bool {
9+ fn gt_res_eq ( mut a : CmpResult , mut b : CmpResult ) -> bool {
10+ // FIXME: Our CmpResult used to be `i32`, but GCC/LLVM expect `isize`. on 64-bit platforms,
11+ // this means the top half of the word may be garbage if built with an old version of
12+ // `compiler-builtins`, so add a hack around this.
13+ //
14+ // This can be removed once a version of `compiler-builtins` with the return type fix makes
15+ // it upstream.
16+ if size_of :: < CmpResult > ( ) == 8 {
17+ a = a as i32 as CmpResult ;
18+ b = b as i32 as CmpResult ;
19+ }
20+
1021 let a_lt_0 = a <= 0 ;
1122 let b_lt_0 = b <= 0 ;
1223 ( a_lt_0 && b_lt_0) || ( !a_lt_0 && !b_lt_0)
1324}
1425
1526float_bench ! {
1627 name: cmp_f32_gt,
17- sig: ( a: f32 , b: f32 ) -> i32 ,
28+ sig: ( a: f32 , b: f32 ) -> CmpResult ,
1829 crate_fn: cmp:: __gtsf2,
1930 sys_fn: __gtsf2,
2031 sys_available: all( ) ,
2132 output_eq: gt_res_eq,
2233 asm: [
2334 #[ cfg( target_arch = "x86_64" ) ] {
24- let ret: i32 ;
35+ let ret: CmpResult ;
2536 asm!(
2637 "xor {ret:e}, {ret:e}" ,
2738 "ucomiss {a}, {b}" ,
@@ -36,7 +47,7 @@ float_bench! {
3647 } ;
3748
3849 #[ cfg( target_arch = "aarch64" ) ] {
39- let ret: i32 ;
50+ let ret: CmpResult ;
4051 asm!(
4152 "fcmp {a:s}, {b:s}" ,
4253 "cset {ret:w}, gt" ,
@@ -53,13 +64,13 @@ float_bench! {
5364
5465float_bench ! {
5566 name: cmp_f32_unord,
56- sig: ( a: f32 , b: f32 ) -> i32 ,
67+ sig: ( a: f32 , b: f32 ) -> CmpResult ,
5768 crate_fn: cmp:: __unordsf2,
5869 sys_fn: __unordsf2,
5970 sys_available: all( ) ,
6071 asm: [
6172 #[ cfg( target_arch = "x86_64" ) ] {
62- let ret: i32 ;
73+ let ret: CmpResult ;
6374 asm!(
6475 "xor {ret:e}, {ret:e}" ,
6576 "ucomiss {a}, {b}" ,
@@ -74,7 +85,7 @@ float_bench! {
7485 } ;
7586
7687 #[ cfg( target_arch = "aarch64" ) ] {
77- let ret: i32 ;
88+ let ret: CmpResult ;
7889 asm!(
7990 "fcmp {a:s}, {b:s}" ,
8091 "cset {ret:w}, vs" ,
@@ -91,14 +102,14 @@ float_bench! {
91102
92103float_bench ! {
93104 name: cmp_f64_gt,
94- sig: ( a: f64 , b: f64 ) -> i32 ,
105+ sig: ( a: f64 , b: f64 ) -> CmpResult ,
95106 crate_fn: cmp:: __gtdf2,
96107 sys_fn: __gtdf2,
97108 sys_available: all( ) ,
98109 output_eq: gt_res_eq,
99110 asm: [
100111 #[ cfg( target_arch = "x86_64" ) ] {
101- let ret: i32 ;
112+ let ret: CmpResult ;
102113 asm!(
103114 "xor {ret:e}, {ret:e}" ,
104115 "ucomisd {a}, {b}" ,
@@ -113,7 +124,7 @@ float_bench! {
113124 } ;
114125
115126 #[ cfg( target_arch = "aarch64" ) ] {
116- let ret: i32 ;
127+ let ret: CmpResult ;
117128 asm!(
118129 "fcmp {a:d}, {b:d}" ,
119130 "cset {ret:w}, gt" ,
@@ -130,13 +141,13 @@ float_bench! {
130141
131142float_bench ! {
132143 name: cmp_f64_unord,
133- sig: ( a: f64 , b: f64 ) -> i32 ,
144+ sig: ( a: f64 , b: f64 ) -> CmpResult ,
134145 crate_fn: cmp:: __unorddf2,
135146 sys_fn: __unorddf2,
136147 sys_available: all( ) ,
137148 asm: [
138149 #[ cfg( target_arch = "x86_64" ) ] {
139- let ret: i32 ;
150+ let ret: CmpResult ;
140151 asm!(
141152 "xor {ret:e}, {ret:e}" ,
142153 "ucomisd {a}, {b}" ,
@@ -151,7 +162,7 @@ float_bench! {
151162 } ;
152163
153164 #[ cfg( target_arch = "aarch64" ) ] {
154- let ret: i32 ;
165+ let ret: CmpResult ;
155166 asm!(
156167 "fcmp {a:d}, {b:d}" ,
157168 "cset {ret:w}, vs" ,
@@ -168,7 +179,7 @@ float_bench! {
168179
169180float_bench ! {
170181 name: cmp_f128_gt,
171- sig: ( a: f128, b: f128) -> i32 ,
182+ sig: ( a: f128, b: f128) -> CmpResult ,
172183 crate_fn: cmp:: __gttf2,
173184 crate_fn_ppc: cmp:: __gtkf2,
174185 sys_fn: __gttf2,
@@ -180,7 +191,7 @@ float_bench! {
180191
181192float_bench ! {
182193 name: cmp_f128_unord,
183- sig: ( a: f128, b: f128) -> i32 ,
194+ sig: ( a: f128, b: f128) -> CmpResult ,
184195 crate_fn: cmp:: __unordtf2,
185196 crate_fn_ppc: cmp:: __unordkf2,
186197 sys_fn: __unordtf2,
0 commit comments