diff options
| author | 2026-05-18 07:01:55 +0000 | |
|---|---|---|
| committer | 2026-05-18 07:01:55 +0000 | |
| commit | 8be6aa5463232423661ffbb5ad191c323548936a (patch) | |
| tree | bcfc36866ac32280b3cb491e8b50438f41a2dcce | |
| parent | object/{id,signature}: Rewrap documentation (diff) | |
| signature | No signature | |
internal/cpu: Import back
| -rw-r--r-- | internal/cpu/LICENSE | 27 | ||||
| -rw-r--r-- | internal/cpu/cpu.go | 8 | ||||
| -rw-r--r-- | internal/cpu/cpu_amd64.go | 34 | ||||
| -rw-r--r-- | internal/cpu/cpu_amd64.s | 22 | ||||
| -rw-r--r-- | internal/cpu/cpu_other.go | 3 | ||||
| -rw-r--r-- | internal/cpu/doc.go | 2 |
6 files changed, 96 insertions, 0 deletions
diff --git a/internal/cpu/LICENSE b/internal/cpu/LICENSE new file mode 100644 index 00000000..2a7cf70d --- /dev/null +++ b/internal/cpu/LICENSE @@ -0,0 +1,27 @@ +Copyright 2009 The Go Authors. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google LLC nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/internal/cpu/cpu.go b/internal/cpu/cpu.go new file mode 100644 index 00000000..41a0c1f9 --- /dev/null +++ b/internal/cpu/cpu.go @@ -0,0 +1,8 @@ +package cpu + +// X86 contains x86 CPU feature flags detected at runtime. +// +//nolint:gochecknoglobals +var X86 struct { + HasAVX2 bool +} diff --git a/internal/cpu/cpu_amd64.go b/internal/cpu/cpu_amd64.go new file mode 100644 index 00000000..7fe59633 --- /dev/null +++ b/internal/cpu/cpu_amd64.go @@ -0,0 +1,34 @@ +//go:build amd64 && !purego + +package cpu + +const ( + cpuidOSXSAVE = 1 << 27 + cpuidAVX = 1 << 28 + cpuidAVX2 = 1 << 5 +) + +// cpuid is implemented in cpu_amd64.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_amd64.s. +func xgetbv() (eax, edx uint32) + +func init() { //nolint:gochecknoinits + maxID, _, _, _ := cpuid(0, 0) + if maxID < 7 { + return + } + + _, _, ecx1, _ := cpuid(1, 0) + + osSupportsAVX := false + + if ecx1&cpuidOSXSAVE != 0 { + eax, _ := xgetbv() + osSupportsAVX = eax&(1<<1) != 0 && eax&(1<<2) != 0 + } + + _, ebx7, _, _ := cpuid(7, 0) + X86.HasAVX2 = osSupportsAVX && ecx1&cpuidAVX != 0 && ebx7&cpuidAVX2 != 0 +} diff --git a/internal/cpu/cpu_amd64.s b/internal/cpu/cpu_amd64.s new file mode 100644 index 00000000..250a34e2 --- /dev/null +++ b/internal/cpu/cpu_amd64.s @@ -0,0 +1,22 @@ +//go:build amd64 && !purego + +#include "textflag.h" + +// func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) +TEXT ·cpuid(SB), NOSPLIT, $0-24 + MOVL eaxArg+0(FP), AX + MOVL ecxArg+4(FP), CX + CPUID + MOVL AX, eax+8(FP) + MOVL BX, ebx+12(FP) + MOVL CX, ecx+16(FP) + MOVL DX, edx+20(FP) + RET + +// func xgetbv() (eax, edx uint32) +TEXT ·xgetbv(SB), NOSPLIT, $0-8 + MOVL $0, CX + XGETBV + MOVL AX, eax+0(FP) + MOVL DX, edx+4(FP) + RET diff --git a/internal/cpu/cpu_other.go b/internal/cpu/cpu_other.go new file mode 100644 index 00000000..969c68ef --- /dev/null +++ b/internal/cpu/cpu_other.go @@ -0,0 +1,3 @@ +//go:build !amd64 || purego + +package cpu diff --git a/internal/cpu/doc.go b/internal/cpu/doc.go new file mode 100644 index 00000000..cb594062 --- /dev/null +++ b/internal/cpu/doc.go @@ -0,0 +1,2 @@ +// Package cpu provides routines for CPU feature detection. +package cpu |
