From 77b7d87549dbc53eb682b0f1a3992140388cc93d Mon Sep 17 00:00:00 2001 From: Evgeniy Kulikov Date: Thu, 16 Jan 2020 10:54:54 +0300 Subject: [PATCH] Use golang.org/x/sys instead of self-implemented detector --- go.mod | 5 ++- go.sum | 2 + internal/cpuid/cpuid_x86.go | 77 ------------------------------------- internal/cpuid/cpuid_x86.s | 48 ----------------------- tz/hash.go | 6 +-- 5 files changed, 9 insertions(+), 129 deletions(-) delete mode 100644 internal/cpuid/cpuid_x86.go delete mode 100644 internal/cpuid/cpuid_x86.s diff --git a/go.mod b/go.mod index 0249af4..35b9370 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,7 @@ module github.com/nspcc-dev/tzhash go 1.12 -require github.com/stretchr/testify v1.3.0 +require ( + github.com/stretchr/testify v1.3.0 + golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 +) diff --git a/go.sum b/go.sum index 380091e..e24edc8 100644 --- a/go.sum +++ b/go.sum @@ -6,3 +6,5 @@ github.com/stretchr/objx v0.1.0 h1:4G4v2dO3VZwixGIRoQ5Lfboy6nUhCyYzaqnIAPPhYs4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1 h1:gZpLHxUX5BdYLA08Lj4YCJNN/jk7KtquiArPoeX0WvA= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= diff --git a/internal/cpuid/cpuid_x86.go b/internal/cpuid/cpuid_x86.go deleted file mode 100644 index bf19137..0000000 --- a/internal/cpuid/cpuid_x86.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// 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 Inc. 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. - -// +build 386 amd64 amd64p32 - -package cpuid - -const ( - bitOSXSAVE = 1 << 27 - bitAVX = 1 << 28 - bitAVX2 = 1 << 5 -) - -var ( - hasAVX bool - hasAVX2 bool -) - -func init() { - maxID, _, _, _ := cpuid(0, 0) - if maxID < 1 { - return - } - - _, _, ecx1, _ := cpuid(1, 0) - hasOSXSAVE := isSet(ecx1, bitOSXSAVE) - - osSupportsAVX := false - if hasOSXSAVE { - eax, _ := xgetbv() - osSupportsAVX = isSet(eax, 1<<1) && isSet(eax, 1<<2) - } - - hasAVX = isSet(ecx1, bitAVX) && osSupportsAVX - - if maxID < 7 { - return - } - - _, ebx7, _, _ := cpuid(7, 0) - hasAVX2 = isSet(ebx7, bitAVX2) && osSupportsAVX -} - -func HasAVX() bool { return hasAVX } -func HasAVX2() bool { return hasAVX2 } - -func isSet(hwc uint32, value uint32) bool { - return hwc&value != 0 -} - -func cpuid(eaxArg, ecxArg uint32) (eax, ebx, ecx, edx uint32) -func xgetbv() (eax, edx uint32) diff --git a/internal/cpuid/cpuid_x86.s b/internal/cpuid/cpuid_x86.s deleted file mode 100644 index 655744c..0000000 --- a/internal/cpuid/cpuid_x86.s +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2009 The Go Authors. All rights reserved. -// -// 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 Inc. 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. - -#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 diff --git a/tz/hash.go b/tz/hash.go index fd43709..13e09c7 100644 --- a/tz/hash.go +++ b/tz/hash.go @@ -7,7 +7,7 @@ import ( "errors" "hash" - "github.com/nspcc-dev/tzhash/internal/cpuid" + "golang.org/x/sys/cpu" ) type Implementation int @@ -25,10 +25,10 @@ const ( ) var ( - hasAVX = cpuid.HasAVX() + hasAVX = cpu.X86.HasAVX // Having AVX2 does not guarantee // that AVX is also present. - hasAVX2 = cpuid.HasAVX2() && hasAVX + hasAVX2 = cpu.X86.HasAVX2 && hasAVX ) func (impl Implementation) String() string {