Skip to content

Commit 0f643c4

Browse files
committed
Ensure tests don't fail on i586 in CI
1 parent 0e1c832 commit 0f643c4

File tree

2 files changed

+52
-43
lines changed

2 files changed

+52
-43
lines changed

tests/assembly/x86-return-float.rs

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
//@ assembly-output: emit-asm
22
//@ only-x86
3+
// FIXME(#114479): LLVM miscompiles loading and storing `f32` and `f64` when SSE is disabled.
4+
// There's no compiletest directive to ignore a test on i586 only, so just always explicitly enable
5+
// SSE2.
6+
// Use the same target CPU as `i686` so that LLVM orders the instructions in the same order.
7+
//@ compile-flags: -Ctarget-feature=+sse2 -Ctarget-cpu=pentium4
38
// Force frame pointers to make ASM more consistent between targets
49
//@ compile-flags: -O -C force-frame-pointers
510
//@ filecheck-flags: --implicit-check-not fld --implicit-check-not fst

tests/ui/abi/numbers-arithmetic/return-float.rs

+47-43
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,54 @@
44
// Test that floats (in particular signalling NaNs) are losslessly returned from functions.
55

66
fn main() {
7-
let bits_f32 = std::hint::black_box([
8-
4.2_f32.to_bits(),
9-
f32::INFINITY.to_bits(),
10-
f32::NEG_INFINITY.to_bits(),
11-
f32::NAN.to_bits(),
12-
// These two masks cover all the mantissa bits. One of them is a signalling NaN, the other
13-
// is quiet.
14-
// Similar to the masks in `test_float_bits_conv` in library/std/src/f32/tests.rs
15-
f32::NAN.to_bits() ^ 0x002A_AAAA,
16-
f32::NAN.to_bits() ^ 0x0055_5555,
17-
// Same as above but with the sign bit flipped.
18-
f32::NAN.to_bits() ^ 0x802A_AAAA,
19-
f32::NAN.to_bits() ^ 0x8055_5555,
20-
]);
21-
for bits in bits_f32 {
22-
assert_eq!(identity(f32::from_bits(bits)).to_bits(), bits);
23-
// Test types that are returned as scalar pairs.
24-
assert_eq!(identity((f32::from_bits(bits), 42)).0.to_bits(), bits);
25-
assert_eq!(identity((42, f32::from_bits(bits))).1.to_bits(), bits);
26-
let (a, b) = identity((f32::from_bits(bits), f32::from_bits(bits)));
27-
assert_eq!((a.to_bits(), b.to_bits()), (bits, bits));
28-
}
7+
// FIXME(#114479): LLVM miscompiles loading and storing `f32` and `f64` when SSE is disabled on
8+
// x86.
9+
if cfg!(not(all(target_arch = "x86", not(target_feature = "sse2")))) {
10+
let bits_f32 = std::hint::black_box([
11+
4.2_f32.to_bits(),
12+
f32::INFINITY.to_bits(),
13+
f32::NEG_INFINITY.to_bits(),
14+
f32::NAN.to_bits(),
15+
// These two masks cover all the mantissa bits. One of them is a signalling NaN, the
16+
// other is quiet.
17+
// Similar to the masks in `test_float_bits_conv` in library/std/src/f32/tests.rs
18+
f32::NAN.to_bits() ^ 0x002A_AAAA,
19+
f32::NAN.to_bits() ^ 0x0055_5555,
20+
// Same as above but with the sign bit flipped.
21+
f32::NAN.to_bits() ^ 0x802A_AAAA,
22+
f32::NAN.to_bits() ^ 0x8055_5555,
23+
]);
24+
for bits in bits_f32 {
25+
assert_eq!(identity(f32::from_bits(bits)).to_bits(), bits);
26+
// Test types that are returned as scalar pairs.
27+
assert_eq!(identity((f32::from_bits(bits), 42)).0.to_bits(), bits);
28+
assert_eq!(identity((42, f32::from_bits(bits))).1.to_bits(), bits);
29+
let (a, b) = identity((f32::from_bits(bits), f32::from_bits(bits)));
30+
assert_eq!((a.to_bits(), b.to_bits()), (bits, bits));
31+
}
2932

30-
let bits_f64 = std::hint::black_box([
31-
4.2_f64.to_bits(),
32-
f64::INFINITY.to_bits(),
33-
f64::NEG_INFINITY.to_bits(),
34-
f64::NAN.to_bits(),
35-
// These two masks cover all the mantissa bits. One of them is a signalling NaN, the other
36-
// is quiet.
37-
// Similar to the masks in `test_float_bits_conv` in library/std/src/f64/tests.rs
38-
f64::NAN.to_bits() ^ 0x000A_AAAA_AAAA_AAAA,
39-
f64::NAN.to_bits() ^ 0x0005_5555_5555_5555,
40-
// Same as above but with the sign bit flipped.
41-
f64::NAN.to_bits() ^ 0x800A_AAAA_AAAA_AAAA,
42-
f64::NAN.to_bits() ^ 0x8005_5555_5555_5555,
43-
]);
44-
for bits in bits_f64 {
45-
assert_eq!(identity(f64::from_bits(bits)).to_bits(), bits);
46-
// Test types that are returned as scalar pairs.
47-
assert_eq!(identity((f64::from_bits(bits), 42)).0.to_bits(), bits);
48-
assert_eq!(identity((42, f64::from_bits(bits))).1.to_bits(), bits);
49-
let (a, b) = identity((f64::from_bits(bits), f64::from_bits(bits)));
50-
assert_eq!((a.to_bits(), b.to_bits()), (bits, bits));
33+
let bits_f64 = std::hint::black_box([
34+
4.2_f64.to_bits(),
35+
f64::INFINITY.to_bits(),
36+
f64::NEG_INFINITY.to_bits(),
37+
f64::NAN.to_bits(),
38+
// These two masks cover all the mantissa bits. One of them is a signalling NaN, the
39+
// other is quiet.
40+
// Similar to the masks in `test_float_bits_conv` in library/std/src/f64/tests.rs
41+
f64::NAN.to_bits() ^ 0x000A_AAAA_AAAA_AAAA,
42+
f64::NAN.to_bits() ^ 0x0005_5555_5555_5555,
43+
// Same as above but with the sign bit flipped.
44+
f64::NAN.to_bits() ^ 0x800A_AAAA_AAAA_AAAA,
45+
f64::NAN.to_bits() ^ 0x8005_5555_5555_5555,
46+
]);
47+
for bits in bits_f64 {
48+
assert_eq!(identity(f64::from_bits(bits)).to_bits(), bits);
49+
// Test types that are returned as scalar pairs.
50+
assert_eq!(identity((f64::from_bits(bits), 42)).0.to_bits(), bits);
51+
assert_eq!(identity((42, f64::from_bits(bits))).1.to_bits(), bits);
52+
let (a, b) = identity((f64::from_bits(bits), f64::from_bits(bits)));
53+
assert_eq!((a.to_bits(), b.to_bits()), (bits, bits));
54+
}
5155
}
5256
}
5357

0 commit comments

Comments
 (0)