mirror of
https://github.com/octoleo/syncthing.git
synced 2024-11-19 03:25:16 +00:00
cbcc3ea132
This updates kcp and uses our own fork which: 1. Keys sessions not just by remote address, but by remote address + conversation id 2. Allows not to close connections that were passed directly to the library. 3. Resets cache key if the session gets terminated. GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4339 LGTM: calmh
119 lines
2.1 KiB
Go
119 lines
2.1 KiB
Go
package xor
|
|
|
|
func init() {
|
|
getEXT()
|
|
}
|
|
|
|
func getEXT() {
|
|
if hasAVX2() {
|
|
extension = avx2
|
|
} else {
|
|
extension = sse2
|
|
}
|
|
return
|
|
}
|
|
|
|
func xorBytes(dst, src0, src1 []byte, size int) {
|
|
switch extension {
|
|
case avx2:
|
|
bytesAVX2(dst, src0, src1, size)
|
|
default:
|
|
bytesSSE2(dst, src0, src1, size)
|
|
}
|
|
}
|
|
|
|
// non-temporal hint store
|
|
const nontmp = 8 * 1024
|
|
const avx2loopsize = 128
|
|
|
|
func bytesAVX2(dst, src0, src1 []byte, size int) {
|
|
if size < avx2loopsize {
|
|
bytesAVX2mini(dst, src0, src1, size)
|
|
} else if size >= avx2loopsize && size <= nontmp {
|
|
bytesAVX2small(dst, src0, src1, size)
|
|
} else {
|
|
bytesAVX2big(dst, src0, src1, size)
|
|
}
|
|
}
|
|
|
|
const sse2loopsize = 64
|
|
|
|
func bytesSSE2(dst, src0, src1 []byte, size int) {
|
|
if size < sse2loopsize {
|
|
bytesSSE2mini(dst, src0, src1, size)
|
|
} else if size >= sse2loopsize && size <= nontmp {
|
|
bytesSSE2small(dst, src0, src1, size)
|
|
} else {
|
|
bytesSSE2big(dst, src0, src1, size)
|
|
}
|
|
}
|
|
|
|
func xorMatrix(dst []byte, src [][]byte) {
|
|
switch extension {
|
|
case avx2:
|
|
matrixAVX2(dst, src)
|
|
default:
|
|
matrixSSE2(dst, src)
|
|
}
|
|
}
|
|
|
|
func matrixAVX2(dst []byte, src [][]byte) {
|
|
size := len(dst)
|
|
if size > nontmp {
|
|
matrixAVX2big(dst, src)
|
|
} else {
|
|
matrixAVX2small(dst, src)
|
|
}
|
|
}
|
|
|
|
func matrixSSE2(dst []byte, src [][]byte) {
|
|
size := len(dst)
|
|
if size > nontmp {
|
|
matrixSSE2big(dst, src)
|
|
} else {
|
|
matrixSSE2small(dst, src)
|
|
}
|
|
}
|
|
|
|
//go:noescape
|
|
func xorSrc0(dst, src0, src1 []byte)
|
|
|
|
//go:noescape
|
|
func xorSrc1(dst, src0, src1 []byte)
|
|
|
|
//go:noescape
|
|
func bytesAVX2mini(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func bytesAVX2big(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func bytesAVX2small(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func bytesSSE2mini(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func bytesSSE2small(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func bytesSSE2big(dst, src0, src1 []byte, size int)
|
|
|
|
//go:noescape
|
|
func matrixAVX2small(dst []byte, src [][]byte)
|
|
|
|
//go:noescape
|
|
func matrixAVX2big(dst []byte, src [][]byte)
|
|
|
|
//go:noescape
|
|
func matrixSSE2small(dst []byte, src [][]byte)
|
|
|
|
//go:noescape
|
|
func matrixSSE2big(dst []byte, src [][]byte)
|
|
|
|
//go:noescape
|
|
func hasAVX2() bool
|
|
|
|
//go:noescape
|
|
func hasSSE2() bool
|