Add Arm SVE Vector and Predicate lengths (#146)
Bumps deps and CI as well.
diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml
index 884e864..364b1fe 100644
--- a/.github/workflows/go.yml
+++ b/.github/workflows/go.yml
@@ -10,7 +10,7 @@
build:
strategy:
matrix:
- go-version: [1.19.x, 1.20.x, 1.21.x]
+ go-version: [1.20.x, 1.21.x, 1.22.x]
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ubuntu-latest
steps:
@@ -38,7 +38,7 @@
- name: Set up Go
uses: actions/setup-go@v4
with:
- go-version: 1.21.x
+ go-version: 1.22.x
- name: Checkout code
uses: actions/checkout@v4
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 7a3b3bb..ff880af 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -18,7 +18,7 @@
name: Set up Go
uses: actions/setup-go@v4
with:
- go-version: 1.21.x
+ go-version: 1.22.x
-
name: Run GoReleaser
uses: goreleaser/goreleaser-action@v5
diff --git a/cpuid.go b/cpuid.go
index 53bc18c..cbfdb15 100644
--- a/cpuid.go
+++ b/cpuid.go
@@ -503,7 +503,7 @@
// Uses the RDTSCP instruction. The value 0 is returned
// if the CPU does not support the instruction.
func (c CPUInfo) RTCounter() uint64 {
- if !c.Supports(RDTSCP) {
+ if !c.Has(RDTSCP) {
return 0
}
a, _, _, d := rdtscpAsm()
@@ -515,13 +515,22 @@
// about the current cpu/core the code is running on.
// If the RDTSCP instruction isn't supported on the CPU, the value 0 is returned.
func (c CPUInfo) Ia32TscAux() uint32 {
- if !c.Supports(RDTSCP) {
+ if !c.Has(RDTSCP) {
return 0
}
_, _, ecx, _ := rdtscpAsm()
return ecx
}
+// SveLengths returns arm SVE vector and predicate lengths.
+// Will return 0, 0 if SVE is not enabled or otherwise unable to detect.
+func (c CPUInfo) SveLengths() (vl, pl uint64) {
+ if !c.Has(SVE) {
+ return 0, 0
+ }
+ return getVectorLength()
+}
+
// LogicalCPU will return the Logical CPU the code is currently executing on.
// This is likely to change when the OS re-schedules the running thread
// to another CPU.
diff --git a/cpuid_arm64.s b/cpuid_arm64.s
index b31d6ae..b196f78 100644
--- a/cpuid_arm64.s
+++ b/cpuid_arm64.s
@@ -24,3 +24,13 @@
MOVD R1, instAttrReg1+8(FP)
RET
+TEXT ·getVectorLength(SB), 7, $0
+ WORD $0xd2800002 // mov x2, #0
+ WORD $0x04225022 // addvl x2, x2, #1
+ WORD $0xd37df042 // lsl x2, x2, #3
+ WORD $0xd2800003 // mov x3, #0
+ WORD $0x04635023 // addpl x3, x3, #1
+ WORD $0xd37df063 // lsl x3, x3, #3
+ MOVD R2, vl+0(FP)
+ MOVD R3, pl+8(FP)
+ RET
diff --git a/detect_arm64.go b/detect_arm64.go
index 9a53504..566743d 100644
--- a/detect_arm64.go
+++ b/detect_arm64.go
@@ -10,6 +10,7 @@
func getMidr() (midr uint64)
func getProcFeatures() (procFeatures uint64)
func getInstAttributes() (instAttrReg0, instAttrReg1 uint64)
+func getVectorLength() (vl, pl uint64)
func initCPU() {
cpuid = func(uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 }
@@ -24,7 +25,7 @@
detectOS(c)
// ARM64 disabled since it may crash if interrupt is not intercepted by OS.
- if safe && !c.Supports(ARMCPUID) && runtime.GOOS != "freebsd" {
+ if safe && !c.Has(ARMCPUID) && runtime.GOOS != "freebsd" {
return
}
midr := getMidr()
diff --git a/detect_ref.go b/detect_ref.go
index 9636c2b..574f938 100644
--- a/detect_ref.go
+++ b/detect_ref.go
@@ -10,6 +10,8 @@
cpuidex = func(x, y uint32) (a, b, c, d uint32) { return 0, 0, 0, 0 }
xgetbv = func(uint32) (a, b uint32) { return 0, 0 }
rdtscpAsm = func() (a, b, c, d uint32) { return 0, 0, 0, 0 }
+
}
func addInfo(info *CPUInfo, safe bool) {}
+func getVectorLength() (vl, pl uint64) { return 0, 0 }
diff --git a/detect_x86.go b/detect_x86.go
index 799b400..e14dd9a 100644
--- a/detect_x86.go
+++ b/detect_x86.go
@@ -36,3 +36,5 @@
c.cacheSize()
c.frequencies()
}
+
+func getVectorLength() (vl, pl uint64) { return 0, 0 }
diff --git a/go.mod b/go.mod
index 43788bb..1dc8c67 100644
--- a/go.mod
+++ b/go.mod
@@ -1,5 +1,5 @@
module github.com/klauspost/cpuid/v2
-go 1.15
+go 1.20
-require golang.org/x/sys v0.5.0
+require golang.org/x/sys v0.22.0
diff --git a/go.sum b/go.sum
index 996b794..96f003d 100644
--- a/go.sum
+++ b/go.sum
@@ -1,4 +1,2 @@
-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e h1:CsOuNlbOuf0mzxJIefr6Q4uAUetRUwZE4qt7VfzP+xo=
-golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
-golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
+golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
diff --git a/testdata/cpuid_data.zip b/testdata/cpuid_data.zip
index 95e84dd..47ff03d 100644
--- a/testdata/cpuid_data.zip
+++ b/testdata/cpuid_data.zip
Binary files differ