[dev.simd] simd: add AES feature check

CL 706055 added AES support but chose to not generate feature checks for
composite features. Intel lists AES as AVXAES which gets manually mapped
to the composite feature AVX, AES. With the previous writeSIMDFeatures
code ignoring composite features, and there being no other references to
AES, we neglected to generate a feature check at all.

To resolve this, we instead split composite features into their
constituent parts and ensure that each feature has a check generated.

Currently AVXAES is the only composite feature.

Updates #73787

Change-Id: Ic8e9d8a3c9c0854fc717512c2ce092d81cb6b66c
Reviewed-on: https://go-review.googlesource.com/c/go/+/712880
Reviewed-by: Junyang Shao <shaojunyang@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Tom Thorogood 2025-10-19 11:51:16 +10:30 committed by Cherry Mui
parent fc3bc49337
commit 20b3339542
2 changed files with 13 additions and 3 deletions

View file

@ -547,10 +547,12 @@ func writeSIMDFeatures(ops []Operation) *bytes.Buffer {
} }
featureSet := make(map[featureKey]struct{}) featureSet := make(map[featureKey]struct{})
for _, op := range ops { for _, op := range ops {
if !strings.Contains(op.CPUFeature, ",") { // Generate a feature check for each independant feature in a
featureSet[featureKey{op.GoArch, op.CPUFeature}] = struct{}{} // composite feature.
for feature := range strings.SplitSeq(op.CPUFeature, ",") {
feature = strings.TrimSpace(feature)
featureSet[featureKey{op.GoArch, feature}] = struct{}{}
} }
// Don't generate feature checks for composite features.
} }
features := slices.SortedFunc(maps.Keys(featureSet), func(a, b featureKey) int { features := slices.SortedFunc(maps.Keys(featureSet), func(a, b featureKey) int {
if c := cmp.Compare(a.GoArch, b.GoArch); c != 0 { if c := cmp.Compare(a.GoArch, b.GoArch); c != 0 {

View file

@ -6,6 +6,14 @@ package simd
import "internal/cpu" import "internal/cpu"
// HasAES returns whether the CPU supports the AES feature.
//
// HasAES is defined on all GOARCHes, but will only return true on
// GOARCH amd64.
func HasAES() bool {
return cpu.X86.HasAES
}
// HasAVX returns whether the CPU supports the AVX feature. // HasAVX returns whether the CPU supports the AVX feature.
// //
// HasAVX is defined on all GOARCHes, but will only return true on // HasAVX is defined on all GOARCHes, but will only return true on