x64: fix AVX512 flag checks
Previously, the multiple flags for certain AVX512 instructions were checked using `OR`: e.g., if the CPU has AVX512VL `OR` AVX512DQ, emit `VPMULLQ`. This is incorrect--the logic should be `AND`. The Intel Software Developer Manual, vol. 1, sec. 15.4, has more information on this (notable there is the suggestion to check with `XGETBV` that the OS is allowing the use of the XMM registers--but that is a separate issue). This change switches to `AND` logic in the new backend.
This commit is contained in:
@@ -137,7 +137,7 @@ pub(crate) fn emit(
|
||||
// Certain instructions may be present in more than one ISA feature set; we must at least match
|
||||
// one of them in the target CPU.
|
||||
let isa_requirements = inst.available_in_any_isa();
|
||||
if !isa_requirements.is_empty() && !isa_requirements.iter().any(matches_isa_flags) {
|
||||
if !isa_requirements.is_empty() && !isa_requirements.iter().all(matches_isa_flags) {
|
||||
panic!(
|
||||
"Cannot emit inst '{:?}' for target; failed to match ISA requirements: {:?}",
|
||||
inst, isa_requirements
|
||||
|
||||
@@ -4324,10 +4324,11 @@ fn test_x64_emit() {
|
||||
let mut isa_flag_builder = x64::settings::builder();
|
||||
isa_flag_builder.enable("has_ssse3").unwrap();
|
||||
isa_flag_builder.enable("has_sse41").unwrap();
|
||||
isa_flag_builder.enable("has_avx512f").unwrap();
|
||||
isa_flag_builder.enable("has_avx512bitalg").unwrap();
|
||||
isa_flag_builder.enable("has_avx512dq").unwrap();
|
||||
isa_flag_builder.enable("has_avx512vl").unwrap();
|
||||
isa_flag_builder.enable("has_avx512f").unwrap();
|
||||
isa_flag_builder.enable("has_avx512vbmi").unwrap();
|
||||
isa_flag_builder.enable("has_avx512vl").unwrap();
|
||||
let isa_flags = x64::settings::Flags::new(&flags, isa_flag_builder);
|
||||
|
||||
let rru = regs::create_reg_universe_systemv(&flags);
|
||||
|
||||
Reference in New Issue
Block a user