]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.simd] simd: add AES feature check
authorTom Thorogood <me+google@tomthorogood.co.uk>
Sun, 19 Oct 2025 01:21:16 +0000 (11:51 +1030)
committerCherry Mui <cherryyz@google.com>
Mon, 20 Oct 2025 17:32:54 +0000 (10:32 -0700)
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>
src/simd/_gen/simdgen/gen_simdTypes.go
src/simd/cpu.go

index 03bb4989d9d820daa35cb8a467c09421c449fd17..2d81231cdae506b91ca964443aa4285532ba100e 100644 (file)
@@ -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 {
index 2837c76d32109ddc813337afce4884284c56517f..7d4fe2500330c2718431220ce5d40e75135ebbe2 100644 (file)
@@ -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