diff options
Diffstat (limited to 'vendor/github.com/cloudwego/base64x/internal/native/dispatch.go')
| -rw-r--r-- | vendor/github.com/cloudwego/base64x/internal/native/dispatch.go | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/vendor/github.com/cloudwego/base64x/internal/native/dispatch.go b/vendor/github.com/cloudwego/base64x/internal/native/dispatch.go new file mode 100644 index 000000000..c4f489b10 --- /dev/null +++ b/vendor/github.com/cloudwego/base64x/internal/native/dispatch.go @@ -0,0 +1,63 @@ +package native + +import ( + "unsafe" + + `github.com/klauspost/cpuid/v2` + "github.com/cloudwego/base64x/internal/rt" + "github.com/cloudwego/base64x/internal/native/avx2" + "github.com/cloudwego/base64x/internal/native/sse" +) + +var ( + hasAVX2 = cpuid.CPU.Has(cpuid.AVX2) + hasSSE = cpuid.CPU.Has(cpuid.SSE) +) + +var ( + S_b64decode uintptr + S_b64encode uintptr +) + +var ( + F_b64decode func(out unsafe.Pointer, src unsafe.Pointer, len int, mod int) (ret int) + F_b64encode func(out unsafe.Pointer, src unsafe.Pointer, mod int) +) + +func useAVX2() { + avx2.Use() + S_b64decode = avx2.S_b64decode + S_b64encode = avx2.S_b64encode + + F_b64decode = avx2.F_b64decode + F_b64encode = avx2.F_b64encode +} + +func useSSE() { + sse.Use() + S_b64decode = sse.S_b64decode + S_b64encode = sse.S_b64encode + + F_b64decode = sse.F_b64decode + F_b64encode = sse.F_b64encode +} + +//go:nosplit +func B64Decode(out *[]byte, src unsafe.Pointer, len int, mod int) (ret int) { + return F_b64decode(rt.NoEscape(unsafe.Pointer(out)), rt.NoEscape(unsafe.Pointer(src)), len, mod) +} + +//go:nosplit +func B64Encode(out *[]byte, src *[]byte, mod int) { + F_b64encode(rt.NoEscape(unsafe.Pointer(out)), rt.NoEscape(unsafe.Pointer(src)), mod) +} + +func init() { + if hasAVX2 { + useAVX2() + } else if hasSSE { + useSSE() + } else { + panic("Unsupported CPU, lacks of AVX2 or SSE CPUID Flag. maybe it's too old to run Sonic.") + } +} |
