Skip to content

Commit

Permalink
chore: get rid of the golang.org/x/sys/cpu
Browse files Browse the repository at this point in the history
  • Loading branch information
rinor committed May 13, 2024
1 parent 69db49d commit 4341c0e
Show file tree
Hide file tree
Showing 5 changed files with 98 additions and 4 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ For the full interface see the Godoc: <https://pkg.go.dev/github.com/philippgill
- Operators (`$and`, `$or` etc.)
- Storage:
- JSON as second encoding format
- Write-ahead log (WAL) as second file format)
- Write-ahead log (WAL) as second file format
- Optional remote storage (S3, PostgreSQL, ...)
- Data types:
- Images
Expand Down
34 changes: 34 additions & 0 deletions simd/cpu_amd64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package simd

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

// useSIMD reports the availability of FMA and AVX2 cpu features
func useSIMD() bool {
var (
hasAVX2 bool
hasFMA bool

isSet = func(bitpos uint, value uint32) bool {
return value&(1<<bitpos) != 0
}
)

if maxID, _, _, _ := cpuid(0, 0); maxID < 7 {
return false
}
_, _, ecx1, _ := cpuid(1, 0)

hasFMA = isSet(12, ecx1)

if hasOSXSAVE := isSet(27, ecx1); hasOSXSAVE {
eax, _ := xgetbv() // For XGETBV, OSXSAVE bit is required and sufficient.
_, ebx7, _, _ := cpuid(7, 0)
hasAVX2 = isSet(1, eax) && isSet(2, eax) && isSet(5, ebx7)
}

return hasAVX2 && hasFMA
}
55 changes: 55 additions & 0 deletions simd/cpu_amd64.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/* This file is a copy of https://cs.opensource.google/go/x/sys/+/master:cpu/cpu_x86.s.
Here is its license, which only applies to the copied parts and not to the rest of chromem-go,
which is licensed under the GNU Affero General Public License.
BSD 3-clause license
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
7 changes: 7 additions & 0 deletions simd/cpu_other.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
//go:build !amd64

package simd

func useSIMD() bool {
return false
}
4 changes: 1 addition & 3 deletions simd/simd_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@ package simd

import (
"runtime"

"golang.org/x/sys/cpu" // TODO: Can we get rid of this dependency?
)

var UseAVX2 bool = cpu.X86.HasAVX2 && cpu.X86.HasFMA && runtime.GOOS != "darwin"
var UseAVX2 bool = useSIMD() && runtime.GOOS != "darwin"

0 comments on commit 4341c0e

Please sign in to comment.