internal/cpu: detect GFNI independently of AVX-512F#79438
Conversation
GFNI is exposed in VEX-encoded form (`VGF2P8AFFINEQB` on XMM/YMM) on every x86 CPU that reports the GFNI bit (CPUID leaf 7 ECX bit 8) and supports YMM (`HasAVX`). Only the EVEX-encoded form requires AVX-512.
Since CL 655280 imported the Green Tea scan kernel, `X86.HasGFNI` was populated inside the `if X86.HasAVX512F { ... }` block, leaving it false on hosts that have VEX-256 GFNI but no AVX-512:
- Intel 12th–14th generation consumer CPUs (Alder/Raptor Lake) where AVX-512 is fuse-locked off to maintain ISA homogeneity with the E-cores.
- Intel Atom-derived SKUs (Jasper/Elkhart Lake, N100/N200/N300-series) which have shipped GFNI since Tremont but have never had AVX-512.
These platforms can execute `VGF2P8AFFINEQB` on YMM natively but the cpu package incorrectly reported `HasGFNI=false`.
Move the standalone GFNI detection out of the AVX-512 block and gate it on `HasAVX` (which requires OSXSAVE + YMM OS support), matching the existing pattern for `HasVAES`. The EVEX form continues to be reported separately via `HasAVX512GFNI`.
Add `HasGFNI` to the `GODEBUG=cpu.*` options table so users have a kill switch on hosts the previous (over-restrictive) gating implicitly hid. Without this, the only way to disable `HasGFNI` on a non-AVX-512 host would be the sledgehammer `GODEBUG=cpu.avx=off`.
Add a regression test that reads CPUID leaf 7 ECX bit 8 directly and asserts `HasGFNI` is set when the hardware bit is set and AVX is available; verified to fail on the buggy code on an i9-14900K. Add a paired `TestDisableGFNI` that exercises the new GODEBUG kill switch, and `TestX86ifGFNIhasAVX` / `TestX86ifAVX512GFNIhasGFNI` invariant tests following the established pattern in `cpu_x86_test.go`.
Fixes golang#79437.
dca1b2e to
af1e060
Compare
|
This PR (HEAD: af1e060) has been imported to Gerrit for code review. Please visit Gerrit at https://go-review.googlesource.com/c/go/+/778680. Important tips:
|
|
Message from Gopher Robot: Patch Set 1: (1 comment) Please don’t reply on this GitHub thread. Visit golang.org/cl/778680. |
|
Message from Gopher Robot: Patch Set 1: Congratulations on opening your first change. Thank you for your contribution! Next steps: Most changes in the Go project go through a few rounds of revision. This can be During May-July and Nov-Jan the Go project is in a code freeze, during which Please don’t reply on this GitHub thread. Visit golang.org/cl/778680. |
GFNI is exposed in VEX-encoded form (VGF2P8AFFINEQB on XMM/YMM) on every
x86 CPU that reports the GFNI bit (CPUID leaf 7 ECX bit 8) and supports
YMM (HasAVX). Only the EVEX-encoded form requires AVX-512.
Since CL 655280 imported the Green Tea scan kernel, X86.HasGFNI was
populated inside the "if X86.HasAVX512F { ... }" block, leaving it false
on hosts that have VEX-256 GFNI but no AVX-512:
AVX-512 is fuse-locked off to maintain ISA homogeneity with the
E-cores.
which have shipped GFNI since Tremont but have never had AVX-512.
These platforms can execute VGF2P8AFFINEQB on YMM natively but the cpu
package incorrectly reported HasGFNI=false.
Move the standalone GFNI detection out of the AVX-512 block and gate it
on HasAVX (which requires OSXSAVE + YMM OS support), matching the
existing pattern for HasVAES. The EVEX form continues to be reported
separately via HasAVX512GFNI.
Add HasGFNI to the GODEBUG=cpu.* options table so users have a kill
switch on hosts the previous (over-restrictive) gating implicitly hid.
Without this, the only way to disable HasGFNI on a non-AVX-512 host
would be the sledgehammer GODEBUG=cpu.avx=off.
Add a regression test that reads CPUID leaf 7 ECX bit 8 directly and
asserts HasGFNI is set when the hardware bit is set and AVX is
available; verified to fail on the buggy code on an i9-14900K. Add a
paired TestDisableGFNI that exercises the new GODEBUG kill switch, and
TestX86ifGFNIhasAVX / TestX86ifAVX512GFNIhasGFNI invariant tests
following the established pattern in cpu_x86_test.go.
Fixes #79437