ref: a75e16740e1a185d523153d86badf9b2c2bcc12e
parent: 4a796e64ac576d6a3e3f2fe6174c4aa476ea0c5c
author: Runxi Yu <runxiyu@umich.edu>
date: Mon Mar 23 01:10:40 EDT 2026
Vendor a minimal internal/cpu for AMD64 only
--- a/go.mod
+++ b/go.mod
@@ -1,5 +1,3 @@
module codeberg.org/lindenii/furgit
go 1.26.0
-
-require golang.org/x/sys v0.41.0
--- a/go.sum
+++ /dev/null
@@ -1,2 +1,0 @@
-golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k=
-golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
--- a/internal/adler32/adler32_amd64.go
+++ b/internal/adler32/adler32_amd64.go
@@ -8,7 +8,7 @@
"hash"
"hash/adler32"
- "golang.org/x/sys/cpu"
+ "codeberg.org/lindenii/furgit/internal/cpu"
)
// Size of an Adler-32 checksum in bytes.
--- /dev/null
+++ b/internal/cpu/LICENSE
@@ -1,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.
--- /dev/null
+++ b/internal/cpu/cpu.go
@@ -1,0 +1,6 @@
+package cpu
+
+// X86 contains x86 CPU feature flags detected at runtime.
+var X86 struct {+ HasAVX2 bool
+}
--- /dev/null
+++ b/internal/cpu/cpu_amd64.go
@@ -1,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
+}
--- /dev/null
+++ b/internal/cpu/cpu_amd64.s
@@ -1,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
--- /dev/null
+++ b/internal/cpu/cpu_other.go
@@ -1,0 +1,3 @@
+//go:build !amd64 || purego
+
+package cpu
--
⑨