aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-05-18 07:01:55 +0000
committerGravatar Runxi Yu2026-05-18 07:01:55 +0000
commit8be6aa5463232423661ffbb5ad191c323548936a (patch)
treebcfc36866ac32280b3cb491e8b50438f41a2dcce /internal
parentobject/{id,signature}: Rewrap documentation (diff)
signatureNo signature
internal/cpu: Import back
Diffstat (limited to 'internal')
-rw-r--r--internal/cpu/LICENSE27
-rw-r--r--internal/cpu/cpu.go8
-rw-r--r--internal/cpu/cpu_amd64.go34
-rw-r--r--internal/cpu/cpu_amd64.s22
-rw-r--r--internal/cpu/cpu_other.go3
-rw-r--r--internal/cpu/doc.go2
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