diff options
| author | 2026-03-23 05:10:40 +0000 | |
|---|---|---|
| committer | 2026-03-23 05:10:40 +0000 | |
| commit | a75e16740e1a185d523153d86badf9b2c2bcc12e (patch) | |
| tree | 2e6324ed0823c25f9b9a2135b4872c6a3624a921 /internal | |
| parent | refstore: Improve interfaces, errors, and make batch work (diff) | |
| signature | No signature | |
Vendor a minimal internal/cpu for AMD64 only v0.1.93
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/adler32/adler32_amd64.go | 2 | ||||
| -rw-r--r-- | internal/cpu/LICENSE | 27 | ||||
| -rw-r--r-- | internal/cpu/cpu.go | 6 | ||||
| -rw-r--r-- | internal/cpu/cpu_amd64.go | 33 | ||||
| -rw-r--r-- | internal/cpu/cpu_amd64.s | 22 | ||||
| -rw-r--r-- | internal/cpu/cpu_other.go | 3 |
6 files changed, 92 insertions, 1 deletions
diff --git a/internal/adler32/adler32_amd64.go b/internal/adler32/adler32_amd64.go index 7c3d4746..49ed8b6e 100644 --- a/internal/adler32/adler32_amd64.go +++ b/internal/adler32/adler32_amd64.go @@ -8,7 +8,7 @@ import ( "hash" "hash/adler32" - "golang.org/x/sys/cpu" + "codeberg.org/lindenii/furgit/internal/cpu" ) // Size of an Adler-32 checksum in bytes. 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..dd7680cb --- /dev/null +++ b/internal/cpu/cpu.go @@ -0,0 +1,6 @@ +package cpu + +// X86 contains x86 CPU feature flags detected at runtime. +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..f20c810a --- /dev/null +++ b/internal/cpu/cpu_amd64.go @@ -0,0 +1,33 @@ +//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() { + 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 |
