shithub: furgit

Download patch

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
--