mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[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:
parent
fc3bc49337
commit
20b3339542
2 changed files with 13 additions and 3 deletions
|
|
@ -547,10 +547,12 @@ func writeSIMDFeatures(ops []Operation) *bytes.Buffer {
|
|||
}
|
||||
featureSet := make(map[featureKey]struct{})
|
||||
for _, op := range ops {
|
||||
if !strings.Contains(op.CPUFeature, ",") {
|
||||
featureSet[featureKey{op.GoArch, op.CPUFeature}] = struct{}{}
|
||||
// Generate a feature check for each independant feature in a
|
||||
// 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 {
|
||||
if c := cmp.Compare(a.GoArch, b.GoArch); c != 0 {
|
||||
|
|
|
|||
|
|
@ -6,6 +6,14 @@ package simd
|
|||
|
||||
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 is defined on all GOARCHes, but will only return true on
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue