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