package s2
import (
"sync"
"github.com/klauspost/compress/internal/race"
)
const hasAmd64Asm = true
var encPools [4 ]sync .Pool
func encodeBlock(dst , src []byte ) (d int ) {
race .ReadSlice (src )
race .WriteSlice (dst )
const (
limit12B = 16 << 10
limit10B = 4 << 10
limit8B = 512
)
if len (src ) >= 4 <<20 {
const sz , pool = 65536 , 0
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeBlockAsm (dst , src , tmp )
}
if len (src ) >= limit12B {
const sz , pool = 65536 , 0
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeBlockAsm4MB (dst , src , tmp )
}
if len (src ) >= limit10B {
const sz , pool = 16384 , 1
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeBlockAsm12B (dst , src , tmp )
}
if len (src ) >= limit8B {
const sz , pool = 4096 , 2
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeBlockAsm10B (dst , src , tmp )
}
if len (src ) < minNonLiteralBlockSize {
return 0
}
const sz , pool = 1024 , 3
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeBlockAsm8B (dst , src , tmp )
}
var encBetterPools [5 ]sync .Pool
func encodeBlockBetter(dst , src []byte ) (d int ) {
race .ReadSlice (src )
race .WriteSlice (dst )
const (
limit12B = 16 << 10
limit10B = 4 << 10
limit8B = 512
)
if len (src ) > 4 <<20 {
const sz , pool = 589824 , 0
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeBetterBlockAsm (dst , src , tmp )
}
if len (src ) >= limit12B {
const sz , pool = 589824 , 0
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeBetterBlockAsm4MB (dst , src , tmp )
}
if len (src ) >= limit10B {
const sz , pool = 81920 , 0
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeBetterBlockAsm12B (dst , src , tmp )
}
if len (src ) >= limit8B {
const sz , pool = 20480 , 1
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeBetterBlockAsm10B (dst , src , tmp )
}
if len (src ) < minNonLiteralBlockSize {
return 0
}
const sz , pool = 5120 , 2
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeBetterBlockAsm8B (dst , src , tmp )
}
func encodeBlockSnappy(dst , src []byte ) (d int ) {
race .ReadSlice (src )
race .WriteSlice (dst )
const (
limit12B = 16 << 10
limit10B = 4 << 10
limit8B = 512
)
if len (src ) > 65536 {
const sz , pool = 65536 , 0
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeSnappyBlockAsm (dst , src , tmp )
}
if len (src ) >= limit12B {
const sz , pool = 65536 , 0
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeSnappyBlockAsm64K (dst , src , tmp )
}
if len (src ) >= limit10B {
const sz , pool = 16384 , 1
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeSnappyBlockAsm12B (dst , src , tmp )
}
if len (src ) >= limit8B {
const sz , pool = 4096 , 2
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeSnappyBlockAsm10B (dst , src , tmp )
}
if len (src ) < minNonLiteralBlockSize {
return 0
}
const sz , pool = 1024 , 3
tmp , ok := encPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encPools [pool ].Put (tmp )
return encodeSnappyBlockAsm8B (dst , src , tmp )
}
func encodeBlockBetterSnappy(dst , src []byte ) (d int ) {
race .ReadSlice (src )
race .WriteSlice (dst )
const (
limit12B = 16 << 10
limit10B = 4 << 10
limit8B = 512
)
if len (src ) > 65536 {
const sz , pool = 589824 , 0
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeSnappyBetterBlockAsm (dst , src , tmp )
}
if len (src ) >= limit12B {
const sz , pool = 294912 , 4
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeSnappyBetterBlockAsm64K (dst , src , tmp )
}
if len (src ) >= limit10B {
const sz , pool = 81920 , 0
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeSnappyBetterBlockAsm12B (dst , src , tmp )
}
if len (src ) >= limit8B {
const sz , pool = 20480 , 1
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeSnappyBetterBlockAsm10B (dst , src , tmp )
}
if len (src ) < minNonLiteralBlockSize {
return 0
}
const sz , pool = 5120 , 2
tmp , ok := encBetterPools [pool ].Get ().(*[sz ]byte )
if !ok {
tmp = &[sz ]byte {}
}
race .WriteSlice (tmp [:])
defer encBetterPools [pool ].Put (tmp )
return encodeSnappyBetterBlockAsm8B (dst , src , tmp )
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .