1
1
#![ cfg_attr( f128_enabled, feature( f128) ) ]
2
2
3
3
use builtins_test:: float_bench;
4
- use compiler_builtins:: float:: cmp;
4
+ use compiler_builtins:: float:: cmp:: { self , CmpResult } ;
5
5
use criterion:: { Criterion , criterion_main} ;
6
6
7
7
/// `gt` symbols are allowed to return differing results, they just get compared
8
8
/// 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 `u32`, but GCC/LLVM expect `usize`. 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 > ( ) == 64 {
17
+ let mask = u32:: MAX as CmpResult ;
18
+ a |= mask;
19
+ b |= mask;
20
+ }
21
+
10
22
let a_lt_0 = a <= 0 ;
11
23
let b_lt_0 = b <= 0 ;
12
24
( a_lt_0 && b_lt_0) || ( !a_lt_0 && !b_lt_0)
13
25
}
14
26
15
27
float_bench ! {
16
28
name: cmp_f32_gt,
17
- sig: ( a: f32 , b: f32 ) -> i32 ,
29
+ sig: ( a: f32 , b: f32 ) -> CmpResult ,
18
30
crate_fn: cmp:: __gtsf2,
19
31
sys_fn: __gtsf2,
20
32
sys_available: all( ) ,
21
33
output_eq: gt_res_eq,
22
34
asm: [
23
35
#[ cfg( target_arch = "x86_64" ) ] {
24
- let ret: i32 ;
36
+ let ret: CmpResult ;
25
37
asm!(
26
38
"xor {ret:e}, {ret:e}" ,
27
39
"ucomiss {a}, {b}" ,
@@ -36,7 +48,7 @@ float_bench! {
36
48
} ;
37
49
38
50
#[ cfg( target_arch = "aarch64" ) ] {
39
- let ret: i32 ;
51
+ let ret: CmpResult ;
40
52
asm!(
41
53
"fcmp {a:s}, {b:s}" ,
42
54
"cset {ret:w}, gt" ,
@@ -53,13 +65,13 @@ float_bench! {
53
65
54
66
float_bench ! {
55
67
name: cmp_f32_unord,
56
- sig: ( a: f32 , b: f32 ) -> i32 ,
68
+ sig: ( a: f32 , b: f32 ) -> CmpResult ,
57
69
crate_fn: cmp:: __unordsf2,
58
70
sys_fn: __unordsf2,
59
71
sys_available: all( ) ,
60
72
asm: [
61
73
#[ cfg( target_arch = "x86_64" ) ] {
62
- let ret: i32 ;
74
+ let ret: CmpResult ;
63
75
asm!(
64
76
"xor {ret:e}, {ret:e}" ,
65
77
"ucomiss {a}, {b}" ,
@@ -74,7 +86,7 @@ float_bench! {
74
86
} ;
75
87
76
88
#[ cfg( target_arch = "aarch64" ) ] {
77
- let ret: i32 ;
89
+ let ret: CmpResult ;
78
90
asm!(
79
91
"fcmp {a:s}, {b:s}" ,
80
92
"cset {ret:w}, vs" ,
@@ -91,14 +103,14 @@ float_bench! {
91
103
92
104
float_bench ! {
93
105
name: cmp_f64_gt,
94
- sig: ( a: f64 , b: f64 ) -> i32 ,
106
+ sig: ( a: f64 , b: f64 ) -> CmpResult ,
95
107
crate_fn: cmp:: __gtdf2,
96
108
sys_fn: __gtdf2,
97
109
sys_available: all( ) ,
98
110
output_eq: gt_res_eq,
99
111
asm: [
100
112
#[ cfg( target_arch = "x86_64" ) ] {
101
- let ret: i32 ;
113
+ let ret: CmpResult ;
102
114
asm!(
103
115
"xor {ret:e}, {ret:e}" ,
104
116
"ucomisd {a}, {b}" ,
@@ -113,7 +125,7 @@ float_bench! {
113
125
} ;
114
126
115
127
#[ cfg( target_arch = "aarch64" ) ] {
116
- let ret: i32 ;
128
+ let ret: CmpResult ;
117
129
asm!(
118
130
"fcmp {a:d}, {b:d}" ,
119
131
"cset {ret:w}, gt" ,
@@ -130,13 +142,13 @@ float_bench! {
130
142
131
143
float_bench ! {
132
144
name: cmp_f64_unord,
133
- sig: ( a: f64 , b: f64 ) -> i32 ,
145
+ sig: ( a: f64 , b: f64 ) -> CmpResult ,
134
146
crate_fn: cmp:: __unorddf2,
135
147
sys_fn: __unorddf2,
136
148
sys_available: all( ) ,
137
149
asm: [
138
150
#[ cfg( target_arch = "x86_64" ) ] {
139
- let ret: i32 ;
151
+ let ret: CmpResult ;
140
152
asm!(
141
153
"xor {ret:e}, {ret:e}" ,
142
154
"ucomisd {a}, {b}" ,
@@ -151,7 +163,7 @@ float_bench! {
151
163
} ;
152
164
153
165
#[ cfg( target_arch = "aarch64" ) ] {
154
- let ret: i32 ;
166
+ let ret: CmpResult ;
155
167
asm!(
156
168
"fcmp {a:d}, {b:d}" ,
157
169
"cset {ret:w}, vs" ,
@@ -168,7 +180,7 @@ float_bench! {
168
180
169
181
float_bench ! {
170
182
name: cmp_f128_gt,
171
- sig: ( a: f128, b: f128) -> i32 ,
183
+ sig: ( a: f128, b: f128) -> CmpResult ,
172
184
crate_fn: cmp:: __gttf2,
173
185
crate_fn_ppc: cmp:: __gtkf2,
174
186
sys_fn: __gttf2,
@@ -180,7 +192,7 @@ float_bench! {
180
192
181
193
float_bench ! {
182
194
name: cmp_f128_unord,
183
- sig: ( a: f128, b: f128) -> i32 ,
195
+ sig: ( a: f128, b: f128) -> CmpResult ,
184
196
crate_fn: cmp:: __unordtf2,
185
197
crate_fn_ppc: cmp:: __unordkf2,
186
198
sys_fn: __unordtf2,
0 commit comments