diff options
Diffstat (limited to 'vendor/github.com/templexxx/xorsimd/xor_amd64.go')
-rw-r--r-- | vendor/github.com/templexxx/xorsimd/xor_amd64.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/vendor/github.com/templexxx/xorsimd/xor_amd64.go b/vendor/github.com/templexxx/xorsimd/xor_amd64.go new file mode 100644 index 0000000..5d46df3 --- /dev/null +++ b/vendor/github.com/templexxx/xorsimd/xor_amd64.go @@ -0,0 +1,95 @@ +// Copyright (c) 2019. Temple3x (temple3x@gmail.com) +// +// Use of this source code is governed by the MIT License +// that can be found in the LICENSE file. + +package xorsimd + +func encode(dst []byte, src [][]byte) { + + switch cpuFeature { + case avx512: + encodeAVX512(dst, src) + case avx2: + encodeAVX2(dst, src) + default: + encodeSSE2(dst, src) + } + return +} + +// Bytes8 XORs of 8 Bytes. +// The slice arguments a, b, dst's lengths are assumed to be at least 8, +// if not, Bytes8 will panic. +func Bytes8(dst, a, b []byte) { + + bytes8(&dst[0], &a[0], &b[0]) +} + +// Bytes16 XORs of packed 16 Bytes. +// The slice arguments a, b, dst's lengths are assumed to be at least 16, +// if not, Bytes16 will panic. +func Bytes16(dst, a, b []byte) { + + bytes16(&dst[0], &a[0], &b[0]) +} + +// Bytes8Align XORs of 8 Bytes. +// The slice arguments a, b, dst's lengths are assumed to be at least 8, +// if not, Bytes8 will panic. +func Bytes8Align(dst, a, b []byte) { + + bytes8(&dst[0], &a[0], &b[0]) +} + +// Bytes16Align XORs of packed 16 Bytes. +// The slice arguments a, b, dst's lengths are assumed to be at least 16, +// if not, Bytes16 will panic. +func Bytes16Align(dst, a, b []byte) { + + bytes16(&dst[0], &a[0], &b[0]) +} + +// BytesA XORs the len(a) bytes in a and b into a +// destination slice. +// The destination should have enough space. +// +// It's used for encoding small bytes slices (< dozens bytes), +// and the slices may not be aligned to 8 bytes or 16 bytes. +// If the length is big, it's better to use 'func Bytes(dst, a, b []byte)' instead +// for gain better performance. +func BytesA(dst, a, b []byte) { + + bytesN(&dst[0], &a[0], &b[0], len(a)) +} + +// BytesB XORs the len(b) bytes in a and b into a +// destination slice. +// The destination should have enough space. +// +// It's used for encoding small bytes slices (< dozens bytes), +// and the slices may not be aligned to 8 bytes or 16 bytes. +// If the length is big, it's better to use 'func Bytes(dst, a, b []byte)' instead +// for gain better performance. +func BytesB(dst, a, b []byte) { + + bytesN(&dst[0], &a[0], &b[0], len(b)) +} + +//go:noescape +func encodeAVX512(dst []byte, src [][]byte) + +//go:noescape +func encodeAVX2(dst []byte, src [][]byte) + +//go:noescape +func encodeSSE2(dst []byte, src [][]byte) + +//go:noescape +func bytesN(dst, a, b *byte, n int) + +//go:noescape +func bytes8(dst, a, b *byte) + +//go:noescape +func bytes16(dst, a, b *byte) |