Skip to content

Commit 47ff2e0

Browse files
committed
Implement float simd comparisons
1 parent 22c9623 commit 47ff2e0

File tree

2 files changed

+14
-9
lines changed

2 files changed

+14
-9
lines changed

src/intrinsics/mod.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ fn bool_to_zero_or_max_uint<'tcx>(
287287
}
288288

289289
macro simd_cmp {
290-
($fx:expr, $cc:ident($x:ident, $y:ident) -> $ret:ident) => {
290+
($fx:expr, $cc:ident|$cc_f:ident($x:ident, $y:ident) -> $ret:ident) => {
291291
let vector_ty = clif_vector_type($fx.tcx, $x.layout());
292292

293293
if let Some(vector_ty) = vector_ty {
@@ -308,14 +308,15 @@ macro simd_cmp {
308308
|fx, lane_layout, res_lane_layout, x_lane, y_lane| {
309309
let res_lane = match lane_layout.ty.kind() {
310310
ty::Uint(_) | ty::Int(_) => fx.bcx.ins().icmp(IntCC::$cc, x_lane, y_lane),
311+
ty::Float(_) => fx.bcx.ins().fcmp(FloatCC::$cc_f, x_lane, y_lane),
311312
_ => unreachable!("{:?}", lane_layout.ty),
312313
};
313314
bool_to_zero_or_max_uint(fx, res_lane_layout, res_lane)
314315
},
315316
);
316317
}
317318
},
318-
($fx:expr, $cc_u:ident|$cc_s:ident($x:ident, $y:ident) -> $ret:ident) => {
319+
($fx:expr, $cc_u:ident|$cc_s:ident|$cc_f:ident($x:ident, $y:ident) -> $ret:ident) => {
319320
// FIXME use vector icmp when possible
320321
simd_pair_for_each_lane(
321322
$fx,
@@ -326,6 +327,7 @@ macro simd_cmp {
326327
let res_lane = match lane_layout.ty.kind() {
327328
ty::Uint(_) => fx.bcx.ins().icmp(IntCC::$cc_u, x_lane, y_lane),
328329
ty::Int(_) => fx.bcx.ins().icmp(IntCC::$cc_s, x_lane, y_lane),
330+
ty::Float(_) => fx.bcx.ins().fcmp(FloatCC::$cc_f, x_lane, y_lane),
329331
_ => unreachable!("{:?}", lane_layout.ty),
330332
};
331333
bool_to_zero_or_max_uint(fx, res_lane_layout, res_lane)

src/intrinsics/simd.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,30 +35,33 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>(
3535
});
3636
};
3737

38-
// FIXME support float comparisons
3938
simd_eq, (c x, c y) {
4039
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
41-
simd_cmp!(fx, Equal(x, y) -> ret);
40+
simd_cmp!(fx, Equal|Equal(x, y) -> ret);
4241
};
4342
simd_ne, (c x, c y) {
4443
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
45-
simd_cmp!(fx, NotEqual(x, y) -> ret);
44+
simd_cmp!(fx, NotEqual|NotEqual(x, y) -> ret);
4645
};
4746
simd_lt, (c x, c y) {
4847
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
49-
simd_cmp!(fx, UnsignedLessThan|SignedLessThan(x, y) -> ret);
48+
simd_cmp!(fx, UnsignedLessThan|SignedLessThan|LessThan(x, y) -> ret);
5049
};
5150
simd_le, (c x, c y) {
5251
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
53-
simd_cmp!(fx, UnsignedLessThanOrEqual|SignedLessThanOrEqual(x, y) -> ret);
52+
simd_cmp!(fx, UnsignedLessThanOrEqual|SignedLessThanOrEqual|LessThanOrEqual(x, y) -> ret);
5453
};
5554
simd_gt, (c x, c y) {
5655
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
57-
simd_cmp!(fx, UnsignedGreaterThan|SignedGreaterThan(x, y) -> ret);
56+
simd_cmp!(fx, UnsignedGreaterThan|SignedGreaterThan|GreaterThan(x, y) -> ret);
5857
};
5958
simd_ge, (c x, c y) {
6059
validate_simd_type!(fx, intrinsic, span, x.layout().ty);
61-
simd_cmp!(fx, UnsignedGreaterThanOrEqual|SignedGreaterThanOrEqual(x, y) -> ret);
60+
simd_cmp!(
61+
fx,
62+
UnsignedGreaterThanOrEqual|SignedGreaterThanOrEqual|GreaterThanOrEqual
63+
(x, y) -> ret
64+
);
6265
};
6366

6467
// simd_shuffle32<T, U>(x: T, y: T, idx: [u32; 32]) -> U

0 commit comments

Comments
 (0)