Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion compiler/rustc_target/src/target_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -392,7 +392,11 @@ static X86_FEATURES: &[(&str, Stability, ImpliedFeatures)] = &[
"avx512vpopcntdq",
],
),
("avx10.2", Unstable(sym::avx10_target_feature), &["avx10.1"]),
(
"avx10.2",
Unstable(sym::avx10_target_feature),
&["avx10.1", "avxvnni", "avxvnniint8", "avxvnniint16"],
),
("avx512bf16", Stable, &["avx512bw"]),
("avx512bitalg", Stable, &["avx512bw"]),
("avx512bw", Stable, &["avx512f"]),
Expand Down
70 changes: 37 additions & 33 deletions library/std_detect/src/detect/os/x86.rs
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,28 @@ pub(crate) fn detect_features() -> cache::Initializer {
// Test `XCR0.APX[19]` with the mask `0b1000_0000_0000_0000_0000 == 0x80000`
let os_apx_support = xcr0 & 0x80000 == 0x80000;

if os_amx_support {
enable(extended_features_edx, 24, Feature::amx_tile);
enable(extended_features_edx, 25, Feature::amx_int8);
enable(extended_features_edx, 22, Feature::amx_bf16);
enable(extended_features_eax_leaf_1, 21, Feature::amx_fp16);
enable(extended_features_edx_leaf_1, 8, Feature::amx_complex);

if max_basic_leaf >= 0x1e {
let CpuidResult { eax: amx_feature_flags_eax, .. } =
__cpuid_count(0x1e_u32, 1);

enable(amx_feature_flags_eax, 4, Feature::amx_fp8);
enable(amx_feature_flags_eax, 6, Feature::amx_tf32);
enable(amx_feature_flags_eax, 7, Feature::amx_avx512);
enable(amx_feature_flags_eax, 8, Feature::amx_movrs);
}
}

if os_apx_support {
enable(extended_features_edx_leaf_1, 21, Feature::apxf);
}

// Only if the OS and the CPU support saving/restoring the AVX
// registers we enable `xsave` support:
if os_avx_support {
Expand Down Expand Up @@ -236,9 +258,10 @@ pub(crate) fn detect_features() -> cache::Initializer {
enable(extended_features_ebx, 5, Feature::avx2);

// "Short" versions of AVX512 instructions
enable(extended_features_eax_leaf_1, 4, Feature::avxvnni);
enable(extended_features_eax_leaf_1, 23, Feature::avxifma);
enable(extended_features_edx_leaf_1, 4, Feature::avxvnniint8);
let avxvnni = enable(extended_features_eax_leaf_1, 4, Feature::avxvnni);
let avxvnniint8 = enable(extended_features_eax_leaf_1, 23, Feature::avxifma);
let avxvnniint16 =
enable(extended_features_edx_leaf_1, 4, Feature::avxvnniint8);
enable(extended_features_edx_leaf_1, 5, Feature::avxneconvert);
enable(extended_features_edx_leaf_1, 10, Feature::avxvnniint16);

Expand Down Expand Up @@ -269,37 +292,18 @@ pub(crate) fn detect_features() -> cache::Initializer {
enable(extended_features_edx, 8, Feature::avx512vp2intersect);
enable(extended_features_edx, 23, Feature::avx512fp16);
enable(extended_features_eax_leaf_1, 5, Feature::avx512bf16);
}
}

if os_amx_support {
enable(extended_features_edx, 24, Feature::amx_tile);
enable(extended_features_edx, 25, Feature::amx_int8);
enable(extended_features_edx, 22, Feature::amx_bf16);
enable(extended_features_eax_leaf_1, 21, Feature::amx_fp16);
enable(extended_features_edx_leaf_1, 8, Feature::amx_complex);

if max_basic_leaf >= 0x1e {
let CpuidResult { eax: amx_feature_flags_eax, .. } =
__cpuid_count(0x1e_u32, 1);

enable(amx_feature_flags_eax, 4, Feature::amx_fp8);
enable(amx_feature_flags_eax, 6, Feature::amx_tf32);
enable(amx_feature_flags_eax, 7, Feature::amx_avx512);
enable(amx_feature_flags_eax, 8, Feature::amx_movrs);
}
}

if os_apx_support {
enable(extended_features_edx_leaf_1, 21, Feature::apxf);
}

let avx10_1 = enable(extended_features_edx_leaf_1, 19, Feature::avx10_1);
if avx10_1 {
let CpuidResult { ebx, .. } = __cpuid(0x24);
let avx10_version = ebx & 0xff;
if avx10_version >= 2 {
value.set(Feature::avx10_2 as u32);
let avx10_1 = enable(extended_features_edx_leaf_1, 19, Feature::avx10_1);
if avx10_1 {
let CpuidResult { ebx, .. } = __cpuid(0x24);
let avx10_version = ebx & 0xff;

// AVX10.2 supports masked versions of dot-product instructions available in avxvnni etc,
// so it doesn't make sense to have it without the unmasked versions
if avx10_version >= 2 && avxvnni && avxvnniint8 && avxvnniint16 {
value.set(Feature::avx10_2 as u32);
}
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//! regression test for <https://github.com/rust-lang/rust/issues/17734>
//@ run-pass
// Test that generating drop glue for Box<str> doesn't ICE

Expand Down
22 changes: 22 additions & 0 deletions tests/ui/coherence/generalize-associated-type-alias.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
// Regression test for https://github.com/rust-lang/rust/issues/154189.
#![feature(unboxed_closures)]

trait ToUnit<'a> {
type Unit;
}

impl ToUnit<'_> for *const u32 {
type Unit = ();
}

trait Overlap<T> {}

type Assoc<'a, T> = <*const T as ToUnit<'a>>::Unit;

impl<T> Overlap<T> for T {}

impl<'a, T> Overlap<(&'a (), Assoc<'a, T>)> for T {}
//~^ ERROR the trait bound `*const T: ToUnit<'a>` is not satisfied
//~| ERROR the trait bound `T: Overlap<(&'a (), _)>` is not satisfied

fn main() {}
28 changes: 28 additions & 0 deletions tests/ui/coherence/generalize-associated-type-alias.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
error[E0277]: the trait bound `*const T: ToUnit<'a>` is not satisfied
--> $DIR/generalize-associated-type-alias.rs:18:13
|
LL | impl<'a, T> Overlap<(&'a (), Assoc<'a, T>)> for T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `ToUnit<'a>` is not implemented for `*const T`
|
help: consider introducing a `where` clause, but there might be an alternative better way to express this requirement
|
LL | impl<'a, T> Overlap<(&'a (), Assoc<'a, T>)> for T where *const T: ToUnit<'a> {}
| ++++++++++++++++++++++++++

error[E0277]: the trait bound `T: Overlap<(&'a (), _)>` is not satisfied
--> $DIR/generalize-associated-type-alias.rs:18:49
|
LL | impl<'a, T> Overlap<(&'a (), Assoc<'a, T>)> for T {}
| ^ the trait `Overlap<(&'a (), _)>` is not implemented for `T`
|
help: the trait `Overlap<(&'a (), _)>` is not implemented for `T`
but trait `Overlap<(&(), ())>` is implemented for `u32`
--> $DIR/generalize-associated-type-alias.rs:18:1
|
LL | impl<'a, T> Overlap<(&'a (), Assoc<'a, T>)> for T {}
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
= help: for that trait implementation, expected `u32`, found `T`

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0277`.
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
//! regression test for <https://github.com/rust-lang/rust/issues/4735>
//@ run-pass

use std::mem::transmute;
Expand Down
Loading