Open hkratz opened 3 years ago
This is somewhat intentional. It turns out that x86 has several instructions which all do the same thing (masked vmovd
does the same as vpblend
) and the actual instruction selected can vary depending on which CPU is optimized for. There's no real good solution here, so we just picked the instruction that our CI happens to generate.
on x86_64-pc-windows-msvc using
$Env:TARGET="x86_64-pc-windows-msvc"
$Env:RUSTFLAGS="-Ctarget-feature=+avx2"
cargo test --release
the following tests fail with a wrong instruction assertion:
Using RUSTFLAGS="-Ctarget-feature=+sse4.2" cargo test --release
the list is much smaller:
Almost all of the ones follow a format something like:
---- core_arch::x86::ssse3::assert__mm_hsubs_epi16_phsubsw stdout ----
disassembly for stdarch_test_shim__mm_hsubs_epi16_phsubsw:
0: lea rax,[14025F654h]
1: mov rcx,qword ptr [__imp__ZN12stdarch_test11_DONT_DEDUP17h32f1f622202c133cE]
2: mov qword ptr [rcx],rax
3: vphsubsw xmm0,xmm0,xmm1
4: ret
5: IIIIIIIII
thread 'core_arch::x86::ssse3::assert__mm_hsubs_epi16_phsubsw' panicked at 'failed to find instruction `phsubsw` in the disassembly', crates\stdarch-test\src\lib.rs:165:9
For the first set, LLVM is clearly exploiting the fact that a given set of instructions was enabled for the compilation and is emitting the VEX prefixed version of instructions. The assertions weren't prepared for it and I think it broke something else, but honestly, I want to pat it on its head and say "good dragon!" I am less confident about what to make of the other set.
Without optimizations or features on, most everything passes except for this, and I don't know if this is related:
thread 'core_arch::x86::xsave::tests::xsavec' panicked at 'assertion failed:
(left == right)
Many intrinsics have wrong instruction assertions, e.g. all the AVX512
mm512_mask_blend_epi16*
check forvmovdqu16
instead ofvpblend*
, on aarch64vget_high_p64
tests forldr
instead ofext
, etc.Not sure how to systematically find the ones which are broken, but I can submit fixes for the ones I find.