diff --git a/Gopkg.lock b/Gopkg.lock index 09d0c722..4b33ea56 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -23,7 +23,7 @@ branch = "master" name = "github.com/aead/chacha20" packages = ["chacha"] - revision = "8457f65383c5be6183d33e992fbf1786d6ab3e76" + revision = "52db354a4a380462fc762185d72dffb206e50a42" [[projects]] branch = "master" @@ -92,7 +92,7 @@ branch = "master" name = "github.com/jedisct1/dlog" packages = ["."] - revision = "d3f1bf94f2a248f6d000c48612836796f333f2dd" + revision = "e9403225aeeae12daf0c67ef68f2052e185a8b50" [[projects]] branch = "master" @@ -154,7 +154,7 @@ "poly1305", "salsa20/salsa" ] - revision = "b49d69b5da943f7ef3c9cf91c8777c1f78a0cc3c" + revision = "76a954637dfa3223c13edb4529f981f0d62cfa26" [[projects]] branch = "master" @@ -171,19 +171,20 @@ "ipv6", "lex/httplex" ] - revision = "5f9ae10d9af5b1c89ae6904293b14b064d4ada23" + revision = "640f4622ab692b87c2f3a94265e6f579fe38263d" [[projects]] branch = "master" name = "golang.org/x/sys" packages = [ + "cpu", "windows", "windows/registry", "windows/svc", "windows/svc/eventlog", "windows/svc/mgr" ] - revision = "bb9c189858d91f42db229b04d45a4c3d23a7662a" + revision = "78d5f264b493f125018180c204871ecf58a2dce1" [[projects]] name = "golang.org/x/text" diff --git a/vendor/github.com/aead/chacha20/chacha/chacha_386.go b/vendor/github.com/aead/chacha20/chacha/chacha_386.go index d09b5640..005183ec 100644 --- a/vendor/github.com/aead/chacha20/chacha/chacha_386.go +++ b/vendor/github.com/aead/chacha20/chacha/chacha_386.go @@ -6,11 +6,15 @@ package chacha -import "encoding/binary" +import ( + "encoding/binary" + + "golang.org/x/sys/cpu" +) func init() { - useSSE2 = supportsSSE2() - useSSSE3 = supportsSSSE3() + useSSE2 = cpu.X86.HasSSE2 + useSSSE3 = cpu.X86.HasSSSE3 useAVX = false useAVX2 = false } @@ -24,14 +28,6 @@ func initialize(state *[64]byte, key []byte, nonce *[16]byte) { copy(state[48:], nonce[:]) } -// This function is implemented in chacha_386.s -//go:noescape -func supportsSSE2() bool - -// This function is implemented in chacha_386.s -//go:noescape -func supportsSSSE3() bool - // This function is implemented in chacha_386.s //go:noescape func hChaCha20SSE2(out *[32]byte, nonce *[16]byte, key *[32]byte) @@ -44,25 +40,21 @@ func hChaCha20SSSE3(out *[32]byte, nonce *[16]byte, key *[32]byte) //go:noescape func xorKeyStreamSSE2(dst, src []byte, block, state *[64]byte, rounds int) int -// This function is implemented in chacha_386.s -//go:noescape -func xorKeyStreamSSSE3(dst, src []byte, block, state *[64]byte, rounds int) int - func hChaCha20(out *[32]byte, nonce *[16]byte, key *[32]byte) { - if useSSSE3 { + switch { + case useSSSE3: hChaCha20SSSE3(out, nonce, key) - } else if useSSE2 { + case useSSE2: hChaCha20SSE2(out, nonce, key) - } else { + default: hChaCha20Generic(out, nonce, key) } } func xorKeyStream(dst, src []byte, block, state *[64]byte, rounds int) int { - if useSSSE3 { - return xorKeyStreamSSSE3(dst, src, block, state, rounds) - } else if useSSE2 { + if useSSE2 { return xorKeyStreamSSE2(dst, src, block, state, rounds) + default: + return xorKeyStreamGeneric(dst, src, block, state, rounds) } - return xorKeyStreamGeneric(dst, src, block, state, rounds) } diff --git a/vendor/github.com/aead/chacha20/chacha/chacha_386.s b/vendor/github.com/aead/chacha20/chacha/chacha_386.s index c0fb4ae2..262fc869 100644 --- a/vendor/github.com/aead/chacha20/chacha/chacha_386.s +++ b/vendor/github.com/aead/chacha20/chacha/chacha_386.s @@ -24,27 +24,6 @@ DECL len; \ JG FINALIZE_LOOP \ -// func supportsSSE2() bool -TEXT ·supportsSSE2(SB), NOSPLIT, $0-1 - XORL AX, AX - INCL AX - CPUID - SHRL $26, DX - ANDL $1, DX - MOVB DX, ret+0(FP) - RET - -// func supportsSSSE3() bool -TEXT ·supportsSSSE3(SB), NOSPLIT, $0-1 - XORL AX, AX - INCL AX - CPUID - SHRL $9, CX - ANDL $1, CX - MOVB CX, DX - MOVB DX, ret+0(FP) - RET - #define Dst DI #define Nonce AX #define Key BX @@ -109,8 +88,7 @@ chacha_loop: #define State AX #define Dst DI #define Src SI -#define Len CX -#define Rounds DX +#define Len DX #define Tmp0 BX #define Tmp1 BP @@ -119,8 +97,8 @@ TEXT ·xorKeyStreamSSE2(SB), 4, $0-40 MOVL dst_base+0(FP), Dst MOVL src_base+12(FP), Src MOVL state+28(FP), State - MOVL rounds+32(FP), Rounds MOVL src_len+16(FP), Len + MOVL $0, ret+36(FP) // Number of bytes written to the keystream buffer - 0 iff len mod 64 == 0 MOVOU 0*16(State), X0 MOVOU 1*16(State), X1 @@ -134,7 +112,7 @@ GENERATE_KEYSTREAM: MOVO X1, X5 MOVO X2, X6 MOVO X3, X7 - MOVL Rounds, Tmp0 + MOVL rounds+32(FP), Tmp0 CHACHA_LOOP: CHACHA_QROUND_SSE2(X4, X5, X6, X7, X0) @@ -164,17 +142,15 @@ CHACHA_LOOP: JMP GENERATE_KEYSTREAM // There is at least one more plaintext byte BUFFER_KEYSTREAM: - MOVL Len, Rounds // Use Rounds as tmp. register for Len - we don't need Rounds anymore MOVL block+24(FP), State MOVOU X4, 0(State) MOVOU X5, 16(State) MOVOU X6, 32(State) MOVOU X7, 48(State) - FINALIZE(Dst, Src, State, Rounds, Tmp0, Tmp1) + MOVL Len, ret+36(FP) // Number of bytes written to the keystream buffer - 0 < Len < 64 + FINALIZE(Dst, Src, State, Len, Tmp0, Tmp1) DONE: - MOVL Len, Tmp0 // Number of bytes written to the keystream buffer - 0 iff Len mod 64 == 0 - MOVL Tmp0, ret+36(FP) MOVL state+28(FP), State MOVOU X3, 3*16(State) RET @@ -183,105 +159,5 @@ DONE: #undef Dst #undef Src #undef Len -#undef Rounds #undef Tmp0 #undef Tmp1 - -#define Dst DI -#define Src SI -#define Len CX -#define Rounds DX -#define State SP -#define Stack State -#define Tmp0 AX -#define Tmp1 BX -#define Tmp2 BP - -// func xorKeyStreamSSSE3(dst, src []byte, block, state *[64]byte, rounds int) int -TEXT ·xorKeyStreamSSSE3(SB), 4, $80-40 - MOVL dst_base+0(FP), Dst - MOVL src_base+12(FP), Src - MOVL state+28(FP), Tmp0 - MOVL rounds+32(FP), Rounds - MOVL src_len+16(FP), Len - - MOVL Stack, Tmp2 // save stack pointer - ADDL $16, Stack // ensure 16 byte stack alignment - ANDL $-16, Stack - - MOVOU 0*16(Tmp0), X0 - MOVOU 1*16(Tmp0), X1 - MOVOU 2*16(Tmp0), X2 - MOVOU 3*16(Tmp0), X3 - - TESTL Len, Len - JZ DONE - - MOVOU ·one<>(SB), X4 - MOVO X0, 0*16(State) - MOVO X1, 1*16(State) - MOVO X2, 2*16(State) - MOVO X4, 3*16(Stack) // store constant on stack - - MOVOU ·rol16<>(SB), X1 - MOVOU ·rol8<>(SB), X2 - -GENERATE_KEYSTREAM: - MOVO 0*16(State), X4 - MOVO 1*16(State), X5 - MOVO 2*16(State), X6 - MOVO X3, X7 - MOVL Rounds, Tmp0 - -CHACHA_LOOP: - CHACHA_QROUND_SSSE3(X4, X5, X6, X7, X0, X1, X2) - CHACHA_SHUFFLE_SSE(X5, X6, X7) - CHACHA_QROUND_SSSE3(X4, X5, X6, X7, X0, X1, X2) - CHACHA_SHUFFLE_SSE(X7, X6, X5) - SUBL $2, Tmp0 - JA CHACHA_LOOP - - PADDL 0*16(State), X4 - PADDL 1*16(State), X5 - PADDL 2*16(State), X6 - PADDL X3, X7 - PADDQ 3*16(Stack), X3 - - CMPL Len, $64 - JL BUFFER_KEYSTREAM - - XOR_SSE(Dst, Src, 0, X4, X5, X6, X7, X0) - ADDL $64, Src - ADDL $64, Dst - SUBL $64, Len - JZ DONE - JMP GENERATE_KEYSTREAM - -BUFFER_KEYSTREAM: - MOVL Tmp2, Stack // restore stack pointer - MOVL Len, Tmp2 - MOVL block+24(FP), Tmp1 - MOVOU X4, 0*16(Tmp1) - MOVOU X5, 1*16(Tmp1) - MOVOU X6, 2*16(Tmp1) - MOVOU X7, 3*16(Tmp1) - FINALIZE(DI, SI, Tmp1, Tmp2, Tmp0, Rounds)// we don't need the number of rounds anymore - MOVL Stack, Tmp2 // set BP to SP so that DONE resets SP correctly - -DONE: - MOVL Len, Tmp0 - MOVL Tmp0, ret+36(FP) - MOVL Tmp2, Stack // restore stack pointer - MOVL state+28(FP), Tmp0 - MOVOU X3, 3*16(Tmp0) - RET - -#undef Dst -#undef Src -#undef Len -#undef Rounds -#undef State -#undef Stack -#undef Tmp0 -#undef Tmp1 -#undef Tmp2 diff --git a/vendor/github.com/aead/chacha20/chacha/chacha_amd64.go b/vendor/github.com/aead/chacha20/chacha/chacha_amd64.go index 492a0639..5fd94654 100644 --- a/vendor/github.com/aead/chacha20/chacha/chacha_amd64.go +++ b/vendor/github.com/aead/chacha20/chacha/chacha_amd64.go @@ -6,29 +6,19 @@ package chacha +import "golang.org/x/sys/cpu" + func init() { - useSSE2 = true - useSSSE3 = supportsSSSE3() - useAVX = supportsAVX() - useAVX2 = supportsAVX2() && false // disable until #16 is fixed + useSSE2 = cpu.X86.HasSSE2 + useSSSE3 = cpu.X86.HasSSSE3 + useAVX = cpu.X86.HasAVX + useAVX2 = cpu.X86.HasAVX2 && false // disable until #16 is fixed } // This function is implemented in chacha_amd64.s //go:noescape func initialize(state *[64]byte, key []byte, nonce *[16]byte) -// This function is implemented in chacha_amd64.s -//go:noescape -func supportsSSSE3() bool - -// This function is implemented in chacha_amd64.s -//go:noescape -func supportsAVX() bool - -// This function is implemented in chacha_amd64.s -//go:noescape -func supportsAVX2() bool - // This function is implemented in chacha_amd64.s //go:noescape func hChaCha20SSE2(out *[32]byte, nonce *[16]byte, key *[32]byte) @@ -58,26 +48,29 @@ func xorKeyStreamAVX(dst, src []byte, block, state *[64]byte, rounds int) int func xorKeyStreamAVX2(dst, src []byte, block, state *[64]byte, rounds int) int func hChaCha20(out *[32]byte, nonce *[16]byte, key *[32]byte) { - if useAVX { + switch { + case useAVX: hChaCha20AVX(out, nonce, key) - } else if useSSSE3 { + case useSSSE3: hChaCha20SSSE3(out, nonce, key) - } else if useSSE2 { // on amd64 this is always true - necessary for testing generic on amd64 + case useSSE2: hChaCha20SSE2(out, nonce, key) - } else { + default: hChaCha20Generic(out, nonce, key) } } func xorKeyStream(dst, src []byte, block, state *[64]byte, rounds int) int { - if useAVX2 { + switch { + case useAVX2: return xorKeyStreamAVX2(dst, src, block, state, rounds) - } else if useAVX { + case useAVX: return xorKeyStreamAVX(dst, src, block, state, rounds) - } else if useSSSE3 { + case useSSSE3: return xorKeyStreamSSSE3(dst, src, block, state, rounds) - } else if useSSE2 { // on amd64 this is always true - necessary for testing generic on amd64 + case useSSE2: return xorKeyStreamSSE2(dst, src, block, state, rounds) + default: + return xorKeyStreamGeneric(dst, src, block, state, rounds) } - return xorKeyStreamGeneric(dst, src, block, state, rounds) } diff --git a/vendor/github.com/aead/chacha20/chacha/chacha_amd64.s b/vendor/github.com/aead/chacha20/chacha/chacha_amd64.s index 262f9ade..26a23835 100644 --- a/vendor/github.com/aead/chacha20/chacha/chacha_amd64.s +++ b/vendor/github.com/aead/chacha20/chacha/chacha_amd64.s @@ -24,28 +24,6 @@ DECQ len; \ JG FINALIZE_LOOP \ -// func supportsSSSE3() bool -TEXT ·supportsSSSE3(SB), NOSPLIT, $0-1 - XORQ AX, AX - INCQ AX - CPUID - SHRQ $9, CX - ANDQ $1, CX - MOVB CX, ret+0(FP) - RET - -// func supportsAVX() bool -TEXT ·supportsAVX(SB), 4, $0-1 - MOVQ runtime·support_avx(SB), AX - MOVB AX, ret+0(FP) - RET - -// func supportsAVX2() bool -TEXT ·supportsAVX2(SB), 4, $0-1 - MOVQ runtime·support_avx2(SB), AX - MOVB AX, ret+0(FP) - RET - #define Dst DI #define Nonce AX #define Key BX @@ -152,7 +130,7 @@ chacha_loop: #define Dst DI #define Src SI -#define Len CX +#define Len R12 #define Rounds DX #define Buffer BX #define State AX diff --git a/vendor/github.com/jedisct1/dlog/Gopkg.lock b/vendor/github.com/jedisct1/dlog/Gopkg.lock index b2d1e84c..78a959c3 100644 --- a/vendor/github.com/jedisct1/dlog/Gopkg.lock +++ b/vendor/github.com/jedisct1/dlog/Gopkg.lock @@ -15,7 +15,7 @@ "windows/registry", "windows/svc/eventlog" ] - revision = "378d26f46672a356c46195c28f61bdb4c0a781dd" + revision = "78d5f264b493f125018180c204871ecf58a2dce1" [solve-meta] analyzer-name = "dep" diff --git a/vendor/github.com/kardianos/service/service_systemd_linux.go b/vendor/github.com/kardianos/service/service_systemd_linux.go index 1d121b3a..26c0eda8 100644 --- a/vendor/github.com/kardianos/service/service_systemd_linux.go +++ b/vendor/github.com/kardianos/service/service_systemd_linux.go @@ -156,9 +156,6 @@ func (s *systemd) Restart() error { const systemdScript = `[Unit] Description={{.Description}} ConditionFileIsExecutable={{.Path|cmdEscape}} -{{range .UnitAdd}} -{{.Key}}={{.Value}} -{{end}} [Service] StartLimitInterval=5 @@ -172,13 +169,7 @@ ExecStart={{.Path|cmdEscape}}{{range .Arguments}} {{.|cmd}}{{end}} Restart=always RestartSec=120 EnvironmentFile=-/etc/sysconfig/{{.Name}} -{{range .ServiceAdd}} -{{.Key}}={{.Value}} -{{end}} [Install] WantedBy=multi-user.target -{{range .InstallAdd}} -{{.Key}}={{.Value}} -{{end}} ` diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go new file mode 100644 index 00000000..2d1fc12f --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -0,0 +1,35 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cpu implements processor feature detection for +// various CPU architectures. +package cpu + +// X86 contains the supported CPU features of the +// current X86/AMD64 platform. If the current platform +// is not X86/AMD64 then all feature flags are false. +// +// X86 is padded to avoid false sharing. Further the HasAVX +// and HasAVX2 are only set if the OS supports XMM and YMM +// registers in addition to the CPUID feature bit being set. +var X86 struct { + _ [cacheLineSize]byte + HasAES bool // AES hardware implementation (AES NI) + HasADX bool // Multi-precision add-carry instruction extensions + HasAVX bool // Advanced vector extension + HasAVX2 bool // Advanced vector extension 2 + HasBMI1 bool // Bit manipulation instruction set 1 + HasBMI2 bool // Bit manipulation instruction set 2 + HasERMS bool // Enhanced REP for MOVSB and STOSB + HasFMA bool // Fused-multiply-add instructions + HasOSXSAVE bool // OS supports XSAVE/XRESTOR for saving/restoring XMM registers. + HasPCLMULQDQ bool // PCLMULQDQ instruction - most often used for AES-GCM + HasPOPCNT bool // Hamming weight instruction POPCNT. + HasSSE2 bool // Streaming SIMD extension 2 (always available on amd64) + HasSSE3 bool // Streaming SIMD extension 3 + HasSSSE3 bool // Supplemental streaming SIMD extension 3 + HasSSE41 bool // Streaming SIMD extension 4 and 4.1 + HasSSE42 bool // Streaming SIMD extension 4 and 4.2 + _ [cacheLineSize]byte +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm.go b/vendor/golang.org/x/sys/cpu/cpu_arm.go new file mode 100644 index 00000000..d93036f7 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm.go @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 32 diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go new file mode 100644 index 00000000..1d2ab290 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 64 diff --git a/vendor/golang.org/x/sys/cpu/cpu_mips64x.go b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go new file mode 100644 index 00000000..6165f121 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mips64x.go @@ -0,0 +1,9 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build mips64 mips64le + +package cpu + +const cacheLineSize = 32 diff --git a/vendor/golang.org/x/sys/cpu/cpu_mipsx.go b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go new file mode 100644 index 00000000..1269eee8 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_mipsx.go @@ -0,0 +1,9 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build mips mipsle + +package cpu + +const cacheLineSize = 32 diff --git a/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go new file mode 100644 index 00000000..d10759a5 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_ppc64x.go @@ -0,0 +1,9 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build ppc64 ppc64le + +package cpu + +const cacheLineSize = 128 diff --git a/vendor/golang.org/x/sys/cpu/cpu_s390x.go b/vendor/golang.org/x/sys/cpu/cpu_s390x.go new file mode 100644 index 00000000..684c4f00 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_s390x.go @@ -0,0 +1,7 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +const cacheLineSize = 256 diff --git a/vendor/golang.org/x/sys/cpu/cpu_test.go b/vendor/golang.org/x/sys/cpu/cpu_test.go new file mode 100644 index 00000000..ad29cef9 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_test.go @@ -0,0 +1,28 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu_test + +import ( + "runtime" + "testing" + + "golang.org/x/sys/cpu" +) + +func TestAMD64minimalFeatures(t *testing.T) { + if runtime.GOARCH == "amd64" { + if !cpu.X86.HasSSE2 { + t.Fatalf("HasSSE2 expected true, got false") + } + } +} + +func TestAVX2hasAVX(t *testing.T) { + if runtime.GOARCH == "amd64" { + if cpu.X86.HasAVX2 && !cpu.X86.HasAVX { + t.Fatalf("HasAVX expected true, got false") + } + } +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go new file mode 100644 index 00000000..8842b7cf --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -0,0 +1,61 @@ +// Copyright 2018 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// +build 386 amd64 amd64p32 + +package cpu + +const cacheLineSize = 64 + +// cpuid is implemented in cpu_x86.s. +func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) + +// xgetbv with ecx = 0 is implemented in cpu_x86.s. +func xgetbv() (eax, edx uint32) + +func init() { + maxID, _, _, _ := cpuid(0, 0) + + if maxID < 1 { + return + } + + _, _, ecx1, edx1 := cpuid(1, 0) + X86.HasSSE2 = isSet(26, edx1) + + X86.HasSSE3 = isSet(0, ecx1) + X86.HasPCLMULQDQ = isSet(1, ecx1) + X86.HasSSSE3 = isSet(9, ecx1) + X86.HasFMA = isSet(12, ecx1) + X86.HasSSE41 = isSet(19, ecx1) + X86.HasSSE42 = isSet(20, ecx1) + X86.HasPOPCNT = isSet(23, ecx1) + X86.HasAES = isSet(25, ecx1) + X86.HasOSXSAVE = isSet(27, ecx1) + + osSupportsAVX := false + // For XGETBV, OSXSAVE bit is required and sufficient. + if X86.HasOSXSAVE { + eax, _ := xgetbv() + // Check if XMM and YMM registers have OS support. + osSupportsAVX = isSet(1, eax) && isSet(2, eax) + } + + X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + + if maxID < 7 { + return + } + + _, ebx7, _, _ := cpuid(7, 0) + X86.HasBMI1 = isSet(3, ebx7) + X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX + X86.HasBMI2 = isSet(8, ebx7) + X86.HasERMS = isSet(9, ebx7) + X86.HasADX = isSet(19, ebx7) +} + +func isSet(bitpos uint, value uint32) bool { + return value&(1<