From e3b2a8d55fb0496715094f4141f1f6dc2ac75eb4 Mon Sep 17 00:00:00 2001 From: Klaus Post Date: Thu, 3 Oct 2024 20:39:12 +0200 Subject: [PATCH 1/2] s2: Don't use stack for index tables Provide a pooled array pointer for tables instead of using stack. Seems like Go is still unstable with large stacks, so use alternative method. --- s2/_generate/gen.go | 53 +- s2/encode.go | 25 +- s2/encode_amd64.go | 201 +- s2/encodeblock_amd64.go | 44 +- s2/encodeblock_amd64.s | 21920 ++++++++++++------------ s2/s2_test.go | 48 + s2/testdata/fuzz/block-corpus-enc.zip | Bin 2848855 -> 3184763 bytes 7 files changed, 11282 insertions(+), 11009 deletions(-) diff --git a/s2/_generate/gen.go b/s2/_generate/gen.go index 05199b66be..340298ef42 100644 --- a/s2/_generate/gen.go +++ b/s2/_generate/gen.go @@ -81,7 +81,7 @@ func main() { o.maxSkip = 100 o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm", 17, 14, 7, 7, limit14B) o.maxSkip = 0 - o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm64K", 16, 14, 7, 7, 64<<10-1) + o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm64K", 16, 13, 7, 7, 64<<10-1) o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm12B", 14, 12, 6, 6, limit12B) o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm10B", 12, 10, 5, 6, limit10B) o.genEncodeBetterBlockAsm("encodeSnappyBetterBlockAsm8B", 10, 8, 4, 6, limit8B) @@ -146,6 +146,15 @@ func assert(fn func(ok LabelRef)) { } } +type regTable struct { + r reg.Register + disp int +} + +func (r regTable) Idx(idx reg.GPVirtual, scale uint8) Mem { + return Mem{Base: r.r, Index: idx, Scale: scale, Disp: r.disp} +} + type options struct { snappy bool bmi1 bool @@ -163,7 +172,15 @@ func (o options) genEncodeBlockAsm(name string, tableBits, skipLog, hashBytes, m if o.skipOutput { dstTxt = "" } - TEXT(name, 0, "func("+dstTxt+"src []byte) int") + + var tableSize = 4 * (1 << tableBits) + // Memzero needs at least 128 bytes. + if tableSize < 128 { + panic("tableSize must be at least 128 bytes") + } + + arrPtr := fmt.Sprintf(",tmp *[%d]byte", tableSize) + TEXT(name, 0, "func("+dstTxt+"src []byte"+arrPtr+") int") Doc(name+" encodes a non-empty src to a guaranteed-large-enough dst.", fmt.Sprintf("Maximum input %d bytes.", maxLen), "It assumes that the varint-encoded length of the decompressed bytes has already been written.", "") @@ -173,7 +190,6 @@ func (o options) genEncodeBlockAsm(name string, tableBits, skipLog, hashBytes, m o.maxOffset = maxLen - 1 var literalMaxOverhead = maxLitOverheadFor(maxLen) - var tableSize = 4 * (1 << tableBits) // Memzero needs at least 128 bytes. if tableSize < 128 { panic("tableSize must be at least 128 bytes") @@ -209,8 +225,8 @@ func (o options) genEncodeBlockAsm(name string, tableBits, skipLog, hashBytes, m // nextSTempL keeps nextS while other functions are being called. nextSTempL := AllocLocal(4) - // Alloc table last - table := AllocLocal(tableSize) + // Load pointer to temp table + table := regTable{r: Load(Param("tmp"), GP64())} dst := GP64() if !o.skipOutput { @@ -236,7 +252,7 @@ func (o options) genEncodeBlockAsm(name string, tableBits, skipLog, hashBytes, m iReg := GP64() MOVQ(U32(tableSize/8/16), iReg) tablePtr := GP64() - LEAQ(table, tablePtr) + MOVQ(table.r, tablePtr) zeroXmm := XMM() PXOR(zeroXmm, zeroXmm) @@ -855,7 +871,17 @@ func maxLitOverheadFor(n int) int { } func (o options) genEncodeBetterBlockAsm(name string, lTableBits, sTableBits, skipLog, lHashBytes, maxLen int) { - TEXT(name, 0, "func(dst, src []byte) int") + var lTableSize = 4 * (1 << lTableBits) + var sTableSize = 4 * (1 << sTableBits) + tableSize := lTableSize + sTableSize + + // Memzero needs at least 128 bytes. + if tableSize < 128 { + panic("tableSize must be at least 128 bytes") + } + arrPtr := fmt.Sprintf(", tmp *[%d]byte", tableSize) + + TEXT(name, 0, "func(dst, src []byte"+arrPtr+") int") Doc(name+" encodes a non-empty src to a guaranteed-large-enough dst.", fmt.Sprintf("Maximum input %d bytes.", maxLen), "It assumes that the varint-encoded length of the decompressed bytes has already been written.", "") @@ -870,9 +896,6 @@ func (o options) genEncodeBetterBlockAsm(name string, lTableBits, sTableBits, sk o.maxLen = maxLen o.maxOffset = maxLen - 1 - var lTableSize = 4 * (1 << lTableBits) - var sTableSize = 4 * (1 << sTableBits) - // Memzero needs at least 128 bytes. if (lTableSize + sTableSize) < 128 { panic("tableSize must be at least 128 bytes") @@ -905,9 +928,9 @@ func (o options) genEncodeBetterBlockAsm(name string, lTableBits, sTableBits, sk // nextSTempL keeps nextS while other functions are being called. nextSTempL := AllocLocal(4) - // Alloc table last, lTab must be before sTab. - lTab := AllocLocal(lTableSize) - sTab := AllocLocal(sTableSize) + table := Load(Param("tmp"), GP64()) + lTab := regTable{r: table} + sTab := regTable{r: table, disp: lTableSize} dst := GP64() { @@ -930,7 +953,7 @@ func (o options) genEncodeBetterBlockAsm(name string, lTableBits, sTableBits, sk iReg := GP64() MOVQ(U32((sTableSize+lTableSize)/8/16), iReg) tablePtr := GP64() - LEAQ(lTab, tablePtr) + MOVQ(table, tablePtr) zeroXmm := XMM() PXOR(zeroXmm, zeroXmm) @@ -2916,7 +2939,7 @@ func (o options) cvtLZ4BlockAsm(lz4s bool) { TEXT("cvt"+srcAlgo+"Block"+snap, NOSPLIT, "func(dst, src []byte) (uncompressed int, dstUsed int)") Doc("cvt"+srcAlgo+"Block converts an "+srcAlgo+" block to "+dstAlgo, "") Pragma("noescape") - o.outputMargin = 10 + o.outputMargin = 8 o.maxOffset = math.MaxUint16 const ( diff --git a/s2/encode.go b/s2/encode.go index 0c9088adfe..c1b8b11eab 100644 --- a/s2/encode.go +++ b/s2/encode.go @@ -9,6 +9,9 @@ import ( "encoding/binary" "math" "math/bits" + "sync" + + "github.com/klauspost/compress/internal/race" ) // Encode returns the encoded form of src. The returned slice may be a sub- @@ -52,6 +55,8 @@ func Encode(dst, src []byte) []byte { return dst[:d] } +var estblockPool [2]sync.Pool + // EstimateBlockSize will perform a very fast compression // without outputting the result and return the compressed output size. // The function returns -1 if no improvement could be achieved. @@ -61,9 +66,25 @@ func EstimateBlockSize(src []byte) (d int) { return -1 } if len(src) <= 1024 { - d = calcBlockSizeSmall(src) + const sz, pool = 2048, 0 + tmp, ok := encPools[pool].Get().(*[sz]byte) + if !ok { + tmp = &[sz]byte{} + } + race.WriteSlice(tmp[:]) + defer encPools[pool].Put(tmp) + + d = calcBlockSizeSmall(src, tmp) } else { - d = calcBlockSize(src) + const sz, pool = 32768, 1 + tmp, ok := encPools[pool].Get().(*[sz]byte) + if !ok { + tmp = &[sz]byte{} + } + race.WriteSlice(tmp[:]) + defer encPools[pool].Put(tmp) + + d = calcBlockSize(src, tmp) } if d == 0 { diff --git a/s2/encode_amd64.go b/s2/encode_amd64.go index 4f45206a4e..7aadd255fe 100644 --- a/s2/encode_amd64.go +++ b/s2/encode_amd64.go @@ -3,10 +3,16 @@ package s2 -import "github.com/klauspost/compress/internal/race" +import ( + "sync" + + "github.com/klauspost/compress/internal/race" +) const hasAmd64Asm = true +var encPools [4]sync.Pool + // encodeBlock encodes a non-empty src to a guaranteed-large-enough dst. It // assumes that the varint-encoded length of the decompressed bytes has already // been written. @@ -29,23 +35,60 @@ func encodeBlock(dst, src []byte) (d int) { ) if len(src) >= 4<<20 { - return encodeBlockAsm(dst, src) + 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 { - return encodeBlockAsm4MB(dst, src) + 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 { - return encodeBlockAsm12B(dst, src) + 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 { - return encodeBlockAsm10B(dst, src) + 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 } - return encodeBlockAsm8B(dst, src) + 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 + // encodeBlockBetter encodes a non-empty src to a guaranteed-large-enough dst. It // assumes that the varint-encoded length of the decompressed bytes has already // been written. @@ -68,21 +111,59 @@ func encodeBlockBetter(dst, src []byte) (d int) { ) if len(src) > 4<<20 { - return encodeBetterBlockAsm(dst, src) + 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 { - return encodeBetterBlockAsm4MB(dst, src) + 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 { - return encodeBetterBlockAsm12B(dst, src) + 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 { - return encodeBetterBlockAsm10B(dst, src) + 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 } - return encodeBetterBlockAsm8B(dst, src) + + 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) } // encodeBlockSnappy encodes a non-empty src to a guaranteed-large-enough dst. It @@ -105,22 +186,57 @@ func encodeBlockSnappy(dst, src []byte) (d int) { // Use 8 bit table when less than... limit8B = 512 ) - if len(src) >= 64<<10 { - return encodeSnappyBlockAsm(dst, src) + 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 { - return encodeSnappyBlockAsm64K(dst, src) + 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 { - return encodeSnappyBlockAsm12B(dst, src) + 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 { - return encodeSnappyBlockAsm10B(dst, src) + 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 } - return encodeSnappyBlockAsm8B(dst, src) + 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) } // encodeBlockSnappy encodes a non-empty src to a guaranteed-large-enough dst. It @@ -143,20 +259,59 @@ func encodeBlockBetterSnappy(dst, src []byte) (d int) { // Use 8 bit table when less than... limit8B = 512 ) - if len(src) >= 64<<10 { - return encodeSnappyBetterBlockAsm(dst, src) + 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 { - return encodeSnappyBetterBlockAsm64K(dst, src) + 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 { - return encodeSnappyBetterBlockAsm12B(dst, src) + 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 { - return encodeSnappyBetterBlockAsm10B(dst, src) + 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 } - return encodeSnappyBetterBlockAsm8B(dst, src) + + 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) } diff --git a/s2/encodeblock_amd64.go b/s2/encodeblock_amd64.go index 297e41501b..f43aa81543 100644 --- a/s2/encodeblock_amd64.go +++ b/s2/encodeblock_amd64.go @@ -11,154 +11,154 @@ func _dummy_() // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBlockAsm(dst []byte, src []byte) int +func encodeBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int // encodeBlockAsm4MB encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4194304 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBlockAsm4MB(dst []byte, src []byte) int +func encodeBlockAsm4MB(dst []byte, src []byte, tmp *[65536]byte) int // encodeBlockAsm12B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 16383 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBlockAsm12B(dst []byte, src []byte) int +func encodeBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int // encodeBlockAsm10B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4095 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBlockAsm10B(dst []byte, src []byte) int +func encodeBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int // encodeBlockAsm8B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 511 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBlockAsm8B(dst []byte, src []byte) int +func encodeBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int // encodeBetterBlockAsm encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4294967295 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBetterBlockAsm(dst []byte, src []byte) int +func encodeBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int // encodeBetterBlockAsm4MB encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4194304 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBetterBlockAsm4MB(dst []byte, src []byte) int +func encodeBetterBlockAsm4MB(dst []byte, src []byte, tmp *[589824]byte) int // encodeBetterBlockAsm12B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 16383 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBetterBlockAsm12B(dst []byte, src []byte) int +func encodeBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int // encodeBetterBlockAsm10B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4095 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBetterBlockAsm10B(dst []byte, src []byte) int +func encodeBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int // encodeBetterBlockAsm8B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 511 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeBetterBlockAsm8B(dst []byte, src []byte) int +func encodeBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int // encodeSnappyBlockAsm encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4294967295 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBlockAsm(dst []byte, src []byte) int +func encodeSnappyBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int // encodeSnappyBlockAsm64K encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 65535 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBlockAsm64K(dst []byte, src []byte) int +func encodeSnappyBlockAsm64K(dst []byte, src []byte, tmp *[65536]byte) int // encodeSnappyBlockAsm12B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 16383 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBlockAsm12B(dst []byte, src []byte) int +func encodeSnappyBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int // encodeSnappyBlockAsm10B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4095 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBlockAsm10B(dst []byte, src []byte) int +func encodeSnappyBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int // encodeSnappyBlockAsm8B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 511 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBlockAsm8B(dst []byte, src []byte) int +func encodeSnappyBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int // encodeSnappyBetterBlockAsm encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4294967295 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBetterBlockAsm(dst []byte, src []byte) int +func encodeSnappyBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int // encodeSnappyBetterBlockAsm64K encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 65535 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte) int +func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte, tmp *[294912]byte) int // encodeSnappyBetterBlockAsm12B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 16383 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte) int +func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int // encodeSnappyBetterBlockAsm10B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4095 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte) int +func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int // encodeSnappyBetterBlockAsm8B encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 511 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte) int +func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int // calcBlockSize encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 4294967295 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func calcBlockSize(src []byte) int +func calcBlockSize(src []byte, tmp *[32768]byte) int // calcBlockSizeSmall encodes a non-empty src to a guaranteed-large-enough dst. // Maximum input 1024 bytes. // It assumes that the varint-encoded length of the decompressed bytes has already been written. // //go:noescape -func calcBlockSizeSmall(src []byte) int +func calcBlockSizeSmall(src []byte, tmp *[2048]byte) int // emitLiteral writes a literal chunk and returns the number of bytes written. // diff --git a/s2/encodeblock_amd64.s b/s2/encodeblock_amd64.s index 2ff5b33401..df9be687be 100644 --- a/s2/encodeblock_amd64.s +++ b/s2/encodeblock_amd64.s @@ -13,1270 +13,1271 @@ TEXT ·_dummy_(SB), $0 #endif RET -// func encodeBlockAsm(dst []byte, src []byte) int +// func encodeBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBlockAsm(SB), $65560-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000200, CX - LEAQ 24(SP), DX +TEXT ·encodeBlockAsm(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBlockAsm: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBlockAsm MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeBlockAsm: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBlockAsm - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x10, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x10, R11 + IMULQ R9, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeBlockAsm - LEAL 1(CX), SI - MOVL 12(SP), DI - MOVL SI, BX - SUBL 16(SP), BX + LEAL 1(DX), DI + MOVL 12(SP), R8 + MOVL DI, SI + SUBL 16(SP), SI JZ repeat_extend_back_end_encodeBlockAsm repeat_extend_back_loop_encodeBlockAsm: - CMPL SI, DI + CMPL DI, R8 JBE repeat_extend_back_end_encodeBlockAsm - MOVB -1(DX)(BX*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(SI*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeBlockAsm - LEAL -1(SI), SI - DECL BX + LEAL -1(DI), DI + DECL SI JNZ repeat_extend_back_loop_encodeBlockAsm repeat_extend_back_end_encodeBlockAsm: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 5(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 5(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeBlockAsm: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeBlockAsm - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeBlockAsm - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_repeat_emit_encodeBlockAsm - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_repeat_emit_encodeBlockAsm - MOVB $0xfc, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP memmove_long_repeat_emit_encodeBlockAsm four_bytes_repeat_emit_encodeBlockAsm: - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_repeat_emit_encodeBlockAsm three_bytes_repeat_emit_encodeBlockAsm: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeBlockAsm two_bytes_repeat_emit_encodeBlockAsm: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeBlockAsm JMP memmove_long_repeat_emit_encodeBlockAsm one_byte_repeat_emit_encodeBlockAsm: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_repeat_emit_encodeBlockAsm emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_repeat_emit_encodeBlockAsm: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeBlockAsm memmove_long_repeat_emit_encodeBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R11 - SHRQ $0x05, R11 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R12 - SUBQ R10, R12 - DECQ R11 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R12 + SHRQ $0x05, R12 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R13 + SUBQ R11, R13 + DECQ R12 JA emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(R9)(R12*1), R10 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R10)(R13*1), R11 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R11 ADDQ $0x20, R13 - ADDQ $0x20, R10 - ADDQ $0x20, R12 - DECQ R11 + DECQ R12 JNA emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(R9)(R12*1), X4 - MOVOU -16(R9)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ R8, R12 + MOVOU -32(R10)(R13*1), X4 + MOVOU -16(R10)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R9, R13 JAE emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeBlockAsm: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), R8 - SUBL CX, R8 - LEAQ (DX)(CX*1), R9 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R9 + SUBL DX, R9 + LEAQ (BX)(DX*1), R10 + LEAQ (BX)(SI*1), SI // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_repeat_extend_encodeBlockAsm: - CMPL R8, $0x10 + CMPL R9, $0x10 JB matchlen_match8_repeat_extend_encodeBlockAsm - MOVQ (R9)(R11*1), R10 - MOVQ 8(R9)(R11*1), R12 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + MOVQ 8(R10)(R12*1), R13 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm - XORQ 8(BX)(R11*1), R12 + XORQ 8(SI)(R12*1), R13 JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm - LEAL -16(R8), R8 - LEAL 16(R11), R11 + LEAL -16(R9), R9 + LEAL 16(R12), R12 JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm matchlen_bsf_16repeat_extend_encodeBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm matchlen_match8_repeat_extend_encodeBlockAsm: - CMPL R8, $0x08 + CMPL R9, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm - LEAL -8(R8), R8 - LEAL 8(R11), R11 + LEAL -8(R9), R9 + LEAL 8(R12), R12 JMP matchlen_match4_repeat_extend_encodeBlockAsm matchlen_bsf_8_repeat_extend_encodeBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm matchlen_match4_repeat_extend_encodeBlockAsm: - CMPL R8, $0x04 + CMPL R9, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm - MOVL (R9)(R11*1), R10 - CMPL (BX)(R11*1), R10 + MOVL (R10)(R12*1), R11 + CMPL (SI)(R12*1), R11 JNE matchlen_match2_repeat_extend_encodeBlockAsm - LEAL -4(R8), R8 - LEAL 4(R11), R11 + LEAL -4(R9), R9 + LEAL 4(R12), R12 matchlen_match2_repeat_extend_encodeBlockAsm: - CMPL R8, $0x01 + CMPL R9, $0x01 JE matchlen_match1_repeat_extend_encodeBlockAsm JB repeat_extend_forward_end_encodeBlockAsm - MOVW (R9)(R11*1), R10 - CMPW (BX)(R11*1), R10 + MOVW (R10)(R12*1), R11 + CMPW (SI)(R12*1), R11 JNE matchlen_match1_repeat_extend_encodeBlockAsm - LEAL 2(R11), R11 - SUBL $0x02, R8 + LEAL 2(R12), R12 + SUBL $0x02, R9 JZ repeat_extend_forward_end_encodeBlockAsm matchlen_match1_repeat_extend_encodeBlockAsm: - MOVB (R9)(R11*1), R10 - CMPB (BX)(R11*1), R10 + MOVB (R10)(R12*1), R11 + CMPB (SI)(R12*1), R11 JNE repeat_extend_forward_end_encodeBlockAsm - LEAL 1(R11), R11 + LEAL 1(R12), R12 repeat_extend_forward_end_encodeBlockAsm: - ADDL R11, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI - TESTL DI, DI + ADDL R12, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI + TESTL R8, R8 JZ repeat_as_copy_encodeBlockAsm // emitRepeat emit_repeat_again_match_repeat_encodeBlockAsm: - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_match_repeat_encodeBlockAsm - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_match_repeat_encodeBlockAsm cant_repeat_two_offset_match_repeat_encodeBlockAsm: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_match_repeat_encodeBlockAsm - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_match_repeat_encodeBlockAsm - CMPL BX, $0x0100ffff + CMPL SI, $0x0100ffff JB repeat_five_match_repeat_encodeBlockAsm - LEAL -16842747(BX), BX - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(SI), SI + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_repeat_encodeBlockAsm repeat_five_match_repeat_encodeBlockAsm: - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm repeat_four_match_repeat_encodeBlockAsm: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm repeat_three_match_repeat_encodeBlockAsm: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_match_repeat_encodeBlockAsm: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_offset_match_repeat_encodeBlockAsm: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm repeat_as_copy_encodeBlockAsm: // emitCopy - CMPL SI, $0x00010000 + CMPL DI, $0x00010000 JB two_byte_offset_repeat_as_copy_encodeBlockAsm - CMPL BX, $0x40 + CMPL SI, $0x40 JBE four_bytes_remain_repeat_as_copy_encodeBlockAsm - MOVB $0xff, (AX) - MOVL SI, 1(AX) - LEAL -64(BX), BX - ADDQ $0x05, AX - CMPL BX, $0x04 + MOVB $0xff, (CX) + MOVL DI, 1(CX) + LEAL -64(SI), SI + ADDQ $0x05, CX + CMPL SI, $0x04 JB four_bytes_remain_repeat_as_copy_encodeBlockAsm // emitRepeat emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy: - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy - CMPL BX, $0x0100ffff + CMPL SI, $0x0100ffff JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy - LEAL -16842747(BX), BX - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(SI), SI + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy: - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm four_bytes_remain_repeat_as_copy_encodeBlockAsm: - TESTL BX, BX + TESTL SI, SI JZ repeat_end_emit_encodeBlockAsm - XORL DI, DI - LEAL -1(DI)(BX*4), BX - MOVB BL, (AX) - MOVL SI, 1(AX) - ADDQ $0x05, AX + XORL R8, R8 + LEAL -1(R8)(SI*4), SI + MOVB SI, (CX) + MOVL DI, 1(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm two_byte_offset_repeat_as_copy_encodeBlockAsm: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE long_offset_short_repeat_as_copy_encodeBlockAsm - MOVL $0x00000001, DI - LEAL 16(DI), DI - MOVB SI, 1(AX) - MOVL SI, R8 - SHRL $0x08, R8 - SHLL $0x05, R8 - ORL R8, DI - MOVB DI, (AX) - ADDQ $0x02, AX - SUBL $0x08, BX + MOVL $0x00000001, R8 + LEAL 16(R8), R8 + MOVB DI, 1(CX) + MOVL DI, R9 + SHRL $0x08, R9 + SHLL $0x05, R9 + ORL R9, R8 + MOVB R8, (CX) + ADDQ $0x02, CX + SUBL $0x08, SI // emitRepeat - LEAL -4(BX), BX + LEAL -4(SI), SI JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b - CMPL BX, $0x0100ffff + CMPL SI, $0x0100ffff JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b - LEAL -16842747(BX), BX - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(SI), SI + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm long_offset_short_repeat_as_copy_encodeBlockAsm: - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX // emitRepeat emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short: - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short - CMPL BX, $0x0100ffff + CMPL SI, $0x0100ffff JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short - LEAL -16842747(BX), BX - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(SI), SI + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short: - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm two_byte_offset_short_repeat_as_copy_encodeBlockAsm: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeBlockAsm - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeBlockAsm - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm emit_copy_three_repeat_as_copy_encodeBlockAsm: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeBlockAsm: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeBlockAsm no_repeat_found_encodeBlockAsm: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBlockAsm - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeBlockAsm - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeBlockAsm - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBlockAsm candidate3_match_encodeBlockAsm: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeBlockAsm candidate2_match_encodeBlockAsm: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeBlockAsm: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBlockAsm match_extend_back_loop_encodeBlockAsm: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBlockAsm - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBlockAsm - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBlockAsm JMP match_extend_back_loop_encodeBlockAsm match_extend_back_end_encodeBlockAsm: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 5(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 5(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBlockAsm: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeBlockAsm - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeBlockAsm - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB three_bytes_match_emit_encodeBlockAsm - CMPL DI, $0x01000000 + CMPL R8, $0x01000000 JB four_bytes_match_emit_encodeBlockAsm - MOVB $0xfc, (AX) - MOVL DI, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL R8, 1(CX) + ADDQ $0x05, CX JMP memmove_long_match_emit_encodeBlockAsm four_bytes_match_emit_encodeBlockAsm: - MOVL DI, R9 - SHRL $0x10, R9 - MOVB $0xf8, (AX) - MOVW DI, 1(AX) - MOVB R9, 3(AX) - ADDQ $0x04, AX + MOVL R8, R10 + SHRL $0x10, R10 + MOVB $0xf8, (CX) + MOVW R8, 1(CX) + MOVB R10, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeBlockAsm three_bytes_match_emit_encodeBlockAsm: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBlockAsm two_bytes_match_emit_encodeBlockAsm: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeBlockAsm JMP memmove_long_match_emit_encodeBlockAsm one_byte_match_emit_encodeBlockAsm: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBlockAsm: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeBlockAsm emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBlockAsm: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeBlockAsm memmove_long_match_emit_encodeBlockAsm: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeBlockAsm: match_nolit_loop_encodeBlockAsm: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeBlockAsm: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeBlockAsm - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeBlockAsm - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeBlockAsm matchlen_bsf_16match_nolit_encodeBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeBlockAsm matchlen_match8_match_nolit_encodeBlockAsm: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeBlockAsm matchlen_bsf_8_match_nolit_encodeBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeBlockAsm matchlen_match4_match_nolit_encodeBlockAsm: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeBlockAsm - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeBlockAsm: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeBlockAsm JB match_nolit_end_encodeBlockAsm - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeBlockAsm - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeBlockAsm matchlen_match1_match_nolit_encodeBlockAsm: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeBlockAsm - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeBlockAsm: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB two_byte_offset_match_nolit_encodeBlockAsm - CMPL R9, $0x40 + CMPL R10, $0x40 JBE four_bytes_remain_match_nolit_encodeBlockAsm - MOVB $0xff, (AX) - MOVL BX, 1(AX) - LEAL -64(R9), R9 - ADDQ $0x05, AX - CMPL R9, $0x04 + MOVB $0xff, (CX) + MOVL SI, 1(CX) + LEAL -64(R10), R10 + ADDQ $0x05, CX + CMPL R10, $0x04 JB four_bytes_remain_match_nolit_encodeBlockAsm // emitRepeat emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy: - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm_emit_copy - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm_emit_copy - CMPL R9, $0x0100ffff + CMPL R10, $0x0100ffff JB repeat_five_match_nolit_encodeBlockAsm_emit_copy - LEAL -16842747(R9), R9 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R10), R10 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy repeat_five_match_nolit_encodeBlockAsm_emit_copy: - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_four_match_nolit_encodeBlockAsm_emit_copy: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_three_match_nolit_encodeBlockAsm_emit_copy: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_match_nolit_encodeBlockAsm_emit_copy: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm four_bytes_remain_match_nolit_encodeBlockAsm: - TESTL R9, R9 + TESTL R10, R10 JZ match_nolit_emitcopy_end_encodeBlockAsm - XORL SI, SI - LEAL -1(SI)(R9*4), R9 - MOVB R9, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + XORL DI, DI + LEAL -1(DI)(R10*4), R10 + MOVB R10, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm two_byte_offset_match_nolit_encodeBlockAsm: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeBlockAsm - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE long_offset_short_match_nolit_encodeBlockAsm - MOVL $0x00000001, SI - LEAL 16(SI), SI - MOVB BL, 1(AX) - MOVL BX, DI - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, SI - MOVB SI, (AX) - ADDQ $0x02, AX - SUBL $0x08, R9 + MOVL $0x00000001, DI + LEAL 16(DI), DI + MOVB SI, 1(CX) + MOVL SI, R8 + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, DI + MOVB DI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R10 // emitRepeat - LEAL -4(R9), R9 + LEAL -4(R10), R10 JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short_2b: - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy_short_2b - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm_emit_copy_short_2b - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm_emit_copy_short_2b - CMPL R9, $0x0100ffff + CMPL R10, $0x0100ffff JB repeat_five_match_nolit_encodeBlockAsm_emit_copy_short_2b - LEAL -16842747(R9), R9 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R10), R10 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short_2b repeat_five_match_nolit_encodeBlockAsm_emit_copy_short_2b: - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_four_match_nolit_encodeBlockAsm_emit_copy_short_2b: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_three_match_nolit_encodeBlockAsm_emit_copy_short_2b: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_match_nolit_encodeBlockAsm_emit_copy_short_2b: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm long_offset_short_match_nolit_encodeBlockAsm: - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX // emitRepeat emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short: - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy_short - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm_emit_copy_short - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm_emit_copy_short - CMPL R9, $0x0100ffff + CMPL R10, $0x0100ffff JB repeat_five_match_nolit_encodeBlockAsm_emit_copy_short - LEAL -16842747(R9), R9 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R10), R10 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short repeat_five_match_nolit_encodeBlockAsm_emit_copy_short: - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_four_match_nolit_encodeBlockAsm_emit_copy_short: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_three_match_nolit_encodeBlockAsm_emit_copy_short: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_match_nolit_encodeBlockAsm_emit_copy_short: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm two_byte_offset_short_match_nolit_encodeBlockAsm: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeBlockAsm - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeBlockAsm - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm emit_copy_three_match_nolit_encodeBlockAsm: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeBlockAsm: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBlockAsm - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBlockAsm: - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x10, DI - IMULQ R8, DI - SHRQ $0x32, DI - SHLQ $0x10, BX - IMULQ R8, BX - SHRQ $0x32, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x10, R8 + IMULQ R9, R8 + SHRQ $0x32, R8 + SHLQ $0x10, SI + IMULQ R9, SI + SHRQ $0x32, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeBlockAsm - INCL CX + INCL DX JMP search_loop_encodeBlockAsm emit_remainder_encodeBlockAsm: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 5(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 5(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBlockAsm: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBlockAsm - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBlockAsm @@ -1286,41 +1287,41 @@ emit_remainder_ok_encodeBlockAsm: JB three_bytes_emit_remainder_encodeBlockAsm CMPL DX, $0x01000000 JB four_bytes_emit_remainder_encodeBlockAsm - MOVB $0xfc, (AX) - MOVL DX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL DX, 1(CX) + ADDQ $0x05, CX JMP memmove_long_emit_remainder_encodeBlockAsm four_bytes_emit_remainder_encodeBlockAsm: MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeBlockAsm three_bytes_emit_remainder_encodeBlockAsm: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBlockAsm two_bytes_emit_remainder_encodeBlockAsm: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBlockAsm JMP memmove_long_emit_remainder_encodeBlockAsm one_byte_emit_remainder_encodeBlockAsm: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -1336,73 +1337,73 @@ memmove_emit_remainder_encodeBlockAsm: JMP emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBlockAsm emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBlockAsm: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBlockAsm memmove_long_emit_remainder_encodeBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back: MOVOU (SI), X4 @@ -1416,1199 +1417,1200 @@ emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBlockAsm: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBlockAsm4MB(dst []byte, src []byte) int +// func encodeBlockAsm4MB(dst []byte, src []byte, tmp *[65536]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBlockAsm4MB(SB), $65560-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000200, CX - LEAQ 24(SP), DX +TEXT ·encodeBlockAsm4MB(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBlockAsm4MB: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBlockAsm4MB MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeBlockAsm4MB: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBlockAsm4MB - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x10, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x10, R11 + IMULQ R9, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeBlockAsm4MB - LEAL 1(CX), SI - MOVL 12(SP), DI - MOVL SI, BX - SUBL 16(SP), BX + LEAL 1(DX), DI + MOVL 12(SP), R8 + MOVL DI, SI + SUBL 16(SP), SI JZ repeat_extend_back_end_encodeBlockAsm4MB repeat_extend_back_loop_encodeBlockAsm4MB: - CMPL SI, DI + CMPL DI, R8 JBE repeat_extend_back_end_encodeBlockAsm4MB - MOVB -1(DX)(BX*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(SI*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeBlockAsm4MB - LEAL -1(SI), SI - DECL BX + LEAL -1(DI), DI + DECL SI JNZ repeat_extend_back_loop_encodeBlockAsm4MB repeat_extend_back_end_encodeBlockAsm4MB: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 4(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 4(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeBlockAsm4MB: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeBlockAsm4MB - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeBlockAsm4MB - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeBlockAsm4MB - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_repeat_emit_encodeBlockAsm4MB - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_repeat_emit_encodeBlockAsm4MB three_bytes_repeat_emit_encodeBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeBlockAsm4MB two_bytes_repeat_emit_encodeBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeBlockAsm4MB JMP memmove_long_repeat_emit_encodeBlockAsm4MB one_byte_repeat_emit_encodeBlockAsm4MB: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_repeat_emit_encodeBlockAsm4MB: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeBlockAsm4MB memmove_long_repeat_emit_encodeBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R11 - SHRQ $0x05, R11 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R12 - SUBQ R10, R12 - DECQ R11 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R12 + SHRQ $0x05, R12 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R13 + SUBQ R11, R13 + DECQ R12 JA emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(R9)(R12*1), R10 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R10)(R13*1), R11 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R11 ADDQ $0x20, R13 - ADDQ $0x20, R10 - ADDQ $0x20, R12 - DECQ R11 + DECQ R12 JNA emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(R9)(R12*1), X4 - MOVOU -16(R9)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ R8, R12 + MOVOU -32(R10)(R13*1), X4 + MOVOU -16(R10)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R9, R13 JAE emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeBlockAsm4MB: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), R8 - SUBL CX, R8 - LEAQ (DX)(CX*1), R9 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R9 + SUBL DX, R9 + LEAQ (BX)(DX*1), R10 + LEAQ (BX)(SI*1), SI // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB: - CMPL R8, $0x10 + CMPL R9, $0x10 JB matchlen_match8_repeat_extend_encodeBlockAsm4MB - MOVQ (R9)(R11*1), R10 - MOVQ 8(R9)(R11*1), R12 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + MOVQ 8(R10)(R12*1), R13 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB - XORQ 8(BX)(R11*1), R12 + XORQ 8(SI)(R12*1), R13 JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm4MB - LEAL -16(R8), R8 - LEAL 16(R11), R11 + LEAL -16(R9), R9 + LEAL 16(R12), R12 JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB matchlen_bsf_16repeat_extend_encodeBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm4MB matchlen_match8_repeat_extend_encodeBlockAsm4MB: - CMPL R8, $0x08 + CMPL R9, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm4MB - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB - LEAL -8(R8), R8 - LEAL 8(R11), R11 + LEAL -8(R9), R9 + LEAL 8(R12), R12 JMP matchlen_match4_repeat_extend_encodeBlockAsm4MB matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm4MB matchlen_match4_repeat_extend_encodeBlockAsm4MB: - CMPL R8, $0x04 + CMPL R9, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm4MB - MOVL (R9)(R11*1), R10 - CMPL (BX)(R11*1), R10 + MOVL (R10)(R12*1), R11 + CMPL (SI)(R12*1), R11 JNE matchlen_match2_repeat_extend_encodeBlockAsm4MB - LEAL -4(R8), R8 - LEAL 4(R11), R11 + LEAL -4(R9), R9 + LEAL 4(R12), R12 matchlen_match2_repeat_extend_encodeBlockAsm4MB: - CMPL R8, $0x01 + CMPL R9, $0x01 JE matchlen_match1_repeat_extend_encodeBlockAsm4MB JB repeat_extend_forward_end_encodeBlockAsm4MB - MOVW (R9)(R11*1), R10 - CMPW (BX)(R11*1), R10 + MOVW (R10)(R12*1), R11 + CMPW (SI)(R12*1), R11 JNE matchlen_match1_repeat_extend_encodeBlockAsm4MB - LEAL 2(R11), R11 - SUBL $0x02, R8 + LEAL 2(R12), R12 + SUBL $0x02, R9 JZ repeat_extend_forward_end_encodeBlockAsm4MB matchlen_match1_repeat_extend_encodeBlockAsm4MB: - MOVB (R9)(R11*1), R10 - CMPB (BX)(R11*1), R10 + MOVB (R10)(R12*1), R11 + CMPB (SI)(R12*1), R11 JNE repeat_extend_forward_end_encodeBlockAsm4MB - LEAL 1(R11), R11 + LEAL 1(R12), R12 repeat_extend_forward_end_encodeBlockAsm4MB: - ADDL R11, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI - TESTL DI, DI + ADDL R12, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI + TESTL R8, R8 JZ repeat_as_copy_encodeBlockAsm4MB // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_match_repeat_encodeBlockAsm4MB - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_match_repeat_encodeBlockAsm4MB cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_match_repeat_encodeBlockAsm4MB - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_match_repeat_encodeBlockAsm4MB - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_four_match_repeat_encodeBlockAsm4MB: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_three_match_repeat_encodeBlockAsm4MB: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_match_repeat_encodeBlockAsm4MB: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_offset_match_repeat_encodeBlockAsm4MB: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_as_copy_encodeBlockAsm4MB: // emitCopy - CMPL SI, $0x00010000 + CMPL DI, $0x00010000 JB two_byte_offset_repeat_as_copy_encodeBlockAsm4MB - CMPL BX, $0x40 + CMPL SI, $0x40 JBE four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB - MOVB $0xff, (AX) - MOVL SI, 1(AX) - LEAL -64(BX), BX - ADDQ $0x05, AX - CMPL BX, $0x04 + MOVB $0xff, (CX) + MOVL DI, 1(CX) + LEAL -64(SI), SI + ADDQ $0x05, CX + CMPL SI, $0x04 JB four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB: - TESTL BX, BX + TESTL SI, SI JZ repeat_end_emit_encodeBlockAsm4MB - XORL DI, DI - LEAL -1(DI)(BX*4), BX - MOVB BL, (AX) - MOVL SI, 1(AX) - ADDQ $0x05, AX + XORL R8, R8 + LEAL -1(R8)(SI*4), SI + MOVB SI, (CX) + MOVL DI, 1(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm4MB two_byte_offset_repeat_as_copy_encodeBlockAsm4MB: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm4MB - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE long_offset_short_repeat_as_copy_encodeBlockAsm4MB - MOVL $0x00000001, DI - LEAL 16(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX - SUBL $0x08, BX + MOVL $0x00000001, R8 + LEAL 16(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX + SUBL $0x08, SI // emitRepeat - LEAL -4(BX), BX + LEAL -4(SI), SI JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB long_offset_short_repeat_as_copy_encodeBlockAsm4MB: - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short - CMPL BX, $0x00010100 + CMPL SI, $0x00010100 JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short - LEAL -65536(BX), BX - MOVL BX, SI - MOVW $0x001d, (AX) - MOVW BX, 2(AX) - SARL $0x10, SI - MOVB SI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(SI), SI + MOVL SI, DI + MOVW $0x001d, (CX) + MOVW SI, 2(CX) + SARL $0x10, DI + MOVB DI, 4(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short: - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB two_byte_offset_short_repeat_as_copy_encodeBlockAsm4MB: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeBlockAsm4MB - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeBlockAsm4MB - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm4MB emit_copy_three_repeat_as_copy_encodeBlockAsm4MB: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeBlockAsm4MB: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeBlockAsm4MB no_repeat_found_encodeBlockAsm4MB: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBlockAsm4MB - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeBlockAsm4MB - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeBlockAsm4MB - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBlockAsm4MB candidate3_match_encodeBlockAsm4MB: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeBlockAsm4MB candidate2_match_encodeBlockAsm4MB: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeBlockAsm4MB: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBlockAsm4MB match_extend_back_loop_encodeBlockAsm4MB: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBlockAsm4MB - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBlockAsm4MB - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBlockAsm4MB JMP match_extend_back_loop_encodeBlockAsm4MB match_extend_back_end_encodeBlockAsm4MB: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 4(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 4(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBlockAsm4MB: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeBlockAsm4MB - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeBlockAsm4MB - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeBlockAsm4MB - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB three_bytes_match_emit_encodeBlockAsm4MB - MOVL DI, R9 - SHRL $0x10, R9 - MOVB $0xf8, (AX) - MOVW DI, 1(AX) - MOVB R9, 3(AX) - ADDQ $0x04, AX + MOVL R8, R10 + SHRL $0x10, R10 + MOVB $0xf8, (CX) + MOVW R8, 1(CX) + MOVB R10, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeBlockAsm4MB three_bytes_match_emit_encodeBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBlockAsm4MB two_bytes_match_emit_encodeBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeBlockAsm4MB JMP memmove_long_match_emit_encodeBlockAsm4MB one_byte_match_emit_encodeBlockAsm4MB: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBlockAsm4MB: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeBlockAsm4MB emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm4MB emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm4MB emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBlockAsm4MB: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeBlockAsm4MB memmove_long_match_emit_encodeBlockAsm4MB: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeBlockAsm4MB: match_nolit_loop_encodeBlockAsm4MB: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeBlockAsm4MB: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeBlockAsm4MB - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm4MB - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeBlockAsm4MB - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeBlockAsm4MB matchlen_bsf_16match_nolit_encodeBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeBlockAsm4MB matchlen_match8_match_nolit_encodeBlockAsm4MB: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm4MB - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm4MB - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeBlockAsm4MB matchlen_bsf_8_match_nolit_encodeBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeBlockAsm4MB matchlen_match4_match_nolit_encodeBlockAsm4MB: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm4MB - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeBlockAsm4MB - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeBlockAsm4MB: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeBlockAsm4MB JB match_nolit_end_encodeBlockAsm4MB - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeBlockAsm4MB - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeBlockAsm4MB matchlen_match1_match_nolit_encodeBlockAsm4MB: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeBlockAsm4MB - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeBlockAsm4MB: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB two_byte_offset_match_nolit_encodeBlockAsm4MB - CMPL R9, $0x40 + CMPL R10, $0x40 JBE four_bytes_remain_match_nolit_encodeBlockAsm4MB - MOVB $0xff, (AX) - MOVL BX, 1(AX) - LEAL -64(R9), R9 - ADDQ $0x05, AX - CMPL R9, $0x04 + MOVB $0xff, (CX) + MOVL SI, 1(CX) + LEAL -64(R10), R10 + ADDQ $0x05, CX + CMPL R10, $0x04 JB four_bytes_remain_match_nolit_encodeBlockAsm4MB // emitRepeat - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB four_bytes_remain_match_nolit_encodeBlockAsm4MB: - TESTL R9, R9 + TESTL R10, R10 JZ match_nolit_emitcopy_end_encodeBlockAsm4MB - XORL SI, SI - LEAL -1(SI)(R9*4), R9 - MOVB R9, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + XORL DI, DI + LEAL -1(DI)(R10*4), R10 + MOVB R10, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB two_byte_offset_match_nolit_encodeBlockAsm4MB: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeBlockAsm4MB - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE long_offset_short_match_nolit_encodeBlockAsm4MB - MOVL $0x00000001, SI - LEAL 16(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX - SUBL $0x08, R9 - + MOVL $0x00000001, DI + LEAL 16(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R10 + // emitRepeat - LEAL -4(R9), R9 + LEAL -4(R10), R10 JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB long_offset_short_match_nolit_encodeBlockAsm4MB: - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX // emitRepeat - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short - CMPL R9, $0x00010100 + CMPL R10, $0x00010100 JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short - LEAL -65536(R9), R9 - MOVL R9, BX - MOVW $0x001d, (AX) - MOVW R9, 2(AX) - SARL $0x10, BX - MOVB BL, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R10), R10 + MOVL R10, SI + MOVW $0x001d, (CX) + MOVW R10, 2(CX) + SARL $0x10, SI + MOVB SI, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short: - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB two_byte_offset_short_match_nolit_encodeBlockAsm4MB: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeBlockAsm4MB - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeBlockAsm4MB - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm4MB emit_copy_three_match_nolit_encodeBlockAsm4MB: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeBlockAsm4MB: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBlockAsm4MB - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBlockAsm4MB: - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x10, DI - IMULQ R8, DI - SHRQ $0x32, DI - SHLQ $0x10, BX - IMULQ R8, BX - SHRQ $0x32, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x10, R8 + IMULQ R9, R8 + SHRQ $0x32, R8 + SHLQ $0x10, SI + IMULQ R9, SI + SHRQ $0x32, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeBlockAsm4MB - INCL CX + INCL DX JMP search_loop_encodeBlockAsm4MB emit_remainder_encodeBlockAsm4MB: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 4(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 4(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBlockAsm4MB: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBlockAsm4MB - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBlockAsm4MB @@ -2618,33 +2620,33 @@ emit_remainder_ok_encodeBlockAsm4MB: JB three_bytes_emit_remainder_encodeBlockAsm4MB MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeBlockAsm4MB three_bytes_emit_remainder_encodeBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBlockAsm4MB two_bytes_emit_remainder_encodeBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBlockAsm4MB JMP memmove_long_emit_remainder_encodeBlockAsm4MB one_byte_emit_remainder_encodeBlockAsm4MB: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBlockAsm4MB: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -2660,73 +2662,73 @@ memmove_emit_remainder_encodeBlockAsm4MB: JMP emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBlockAsm4MB: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBlockAsm4MB memmove_long_emit_remainder_encodeBlockAsm4MB: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back: MOVOU (SI), X4 @@ -2740,967 +2742,968 @@ emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBlockAsm4MB: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBlockAsm12B(dst []byte, src []byte) int +// func encodeBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBlockAsm12B(SB), $16408-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000080, CX - LEAQ 24(SP), DX +TEXT ·encodeBlockAsm12B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000080, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBlockAsm12B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBlockAsm12B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeBlockAsm12B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBlockAsm12B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x000000cf1bbcdcbb, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x18, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x000000cf1bbcdcbb, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x18, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x34, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x18, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x18, R11 + IMULQ R9, R11 + SHRQ $0x34, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x18, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeBlockAsm12B - LEAL 1(CX), SI - MOVL 12(SP), DI - MOVL SI, BX - SUBL 16(SP), BX + LEAL 1(DX), DI + MOVL 12(SP), R8 + MOVL DI, SI + SUBL 16(SP), SI JZ repeat_extend_back_end_encodeBlockAsm12B repeat_extend_back_loop_encodeBlockAsm12B: - CMPL SI, DI + CMPL DI, R8 JBE repeat_extend_back_end_encodeBlockAsm12B - MOVB -1(DX)(BX*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(SI*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeBlockAsm12B - LEAL -1(SI), SI - DECL BX + LEAL -1(DI), DI + DECL SI JNZ repeat_extend_back_loop_encodeBlockAsm12B repeat_extend_back_end_encodeBlockAsm12B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeBlockAsm12B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeBlockAsm12B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeBlockAsm12B JB three_bytes_repeat_emit_encodeBlockAsm12B three_bytes_repeat_emit_encodeBlockAsm12B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeBlockAsm12B two_bytes_repeat_emit_encodeBlockAsm12B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeBlockAsm12B JMP memmove_long_repeat_emit_encodeBlockAsm12B one_byte_repeat_emit_encodeBlockAsm12B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_repeat_emit_encodeBlockAsm12B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeBlockAsm12B memmove_long_repeat_emit_encodeBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R11 - SHRQ $0x05, R11 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R12 - SUBQ R10, R12 - DECQ R11 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R12 + SHRQ $0x05, R12 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R13 + SUBQ R11, R13 + DECQ R12 JA emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R12*1), R10 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R10)(R13*1), R11 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R11 ADDQ $0x20, R13 - ADDQ $0x20, R10 - ADDQ $0x20, R12 - DECQ R11 + DECQ R12 JNA emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R12*1), X4 - MOVOU -16(R9)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ R8, R12 + MOVOU -32(R10)(R13*1), X4 + MOVOU -16(R10)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R9, R13 JAE emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeBlockAsm12B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), R8 - SUBL CX, R8 - LEAQ (DX)(CX*1), R9 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R9 + SUBL DX, R9 + LEAQ (BX)(DX*1), R10 + LEAQ (BX)(SI*1), SI // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_repeat_extend_encodeBlockAsm12B: - CMPL R8, $0x10 + CMPL R9, $0x10 JB matchlen_match8_repeat_extend_encodeBlockAsm12B - MOVQ (R9)(R11*1), R10 - MOVQ 8(R9)(R11*1), R12 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + MOVQ 8(R10)(R12*1), R13 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm12B - XORQ 8(BX)(R11*1), R12 + XORQ 8(SI)(R12*1), R13 JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm12B - LEAL -16(R8), R8 - LEAL 16(R11), R11 + LEAL -16(R9), R9 + LEAL 16(R12), R12 JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm12B matchlen_bsf_16repeat_extend_encodeBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm12B matchlen_match8_repeat_extend_encodeBlockAsm12B: - CMPL R8, $0x08 + CMPL R9, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm12B - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm12B - LEAL -8(R8), R8 - LEAL 8(R11), R11 + LEAL -8(R9), R9 + LEAL 8(R12), R12 JMP matchlen_match4_repeat_extend_encodeBlockAsm12B matchlen_bsf_8_repeat_extend_encodeBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm12B matchlen_match4_repeat_extend_encodeBlockAsm12B: - CMPL R8, $0x04 + CMPL R9, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm12B - MOVL (R9)(R11*1), R10 - CMPL (BX)(R11*1), R10 + MOVL (R10)(R12*1), R11 + CMPL (SI)(R12*1), R11 JNE matchlen_match2_repeat_extend_encodeBlockAsm12B - LEAL -4(R8), R8 - LEAL 4(R11), R11 + LEAL -4(R9), R9 + LEAL 4(R12), R12 matchlen_match2_repeat_extend_encodeBlockAsm12B: - CMPL R8, $0x01 + CMPL R9, $0x01 JE matchlen_match1_repeat_extend_encodeBlockAsm12B JB repeat_extend_forward_end_encodeBlockAsm12B - MOVW (R9)(R11*1), R10 - CMPW (BX)(R11*1), R10 + MOVW (R10)(R12*1), R11 + CMPW (SI)(R12*1), R11 JNE matchlen_match1_repeat_extend_encodeBlockAsm12B - LEAL 2(R11), R11 - SUBL $0x02, R8 + LEAL 2(R12), R12 + SUBL $0x02, R9 JZ repeat_extend_forward_end_encodeBlockAsm12B matchlen_match1_repeat_extend_encodeBlockAsm12B: - MOVB (R9)(R11*1), R10 - CMPB (BX)(R11*1), R10 + MOVB (R10)(R12*1), R11 + CMPB (SI)(R12*1), R11 JNE repeat_extend_forward_end_encodeBlockAsm12B - LEAL 1(R11), R11 + LEAL 1(R12), R12 repeat_extend_forward_end_encodeBlockAsm12B: - ADDL R11, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI - TESTL DI, DI + ADDL R12, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI + TESTL R8, R8 JZ repeat_as_copy_encodeBlockAsm12B // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_match_repeat_encodeBlockAsm12B - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm12B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_match_repeat_encodeBlockAsm12B cant_repeat_two_offset_match_repeat_encodeBlockAsm12B: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_match_repeat_encodeBlockAsm12B - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_three_match_repeat_encodeBlockAsm12B: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_match_repeat_encodeBlockAsm12B: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_offset_match_repeat_encodeBlockAsm12B: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_as_copy_encodeBlockAsm12B: // emitCopy - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm12B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE long_offset_short_repeat_as_copy_encodeBlockAsm12B - MOVL $0x00000001, DI - LEAL 16(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX - SUBL $0x08, BX + MOVL $0x00000001, R8 + LEAL 16(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX + SUBL $0x08, SI // emitRepeat - LEAL -4(BX), BX + LEAL -4(SI), SI JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B long_offset_short_repeat_as_copy_encodeBlockAsm12B: - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B two_byte_offset_short_repeat_as_copy_encodeBlockAsm12B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeBlockAsm12B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeBlockAsm12B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm12B emit_copy_three_repeat_as_copy_encodeBlockAsm12B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeBlockAsm12B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeBlockAsm12B no_repeat_found_encodeBlockAsm12B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBlockAsm12B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeBlockAsm12B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeBlockAsm12B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBlockAsm12B candidate3_match_encodeBlockAsm12B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeBlockAsm12B candidate2_match_encodeBlockAsm12B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeBlockAsm12B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBlockAsm12B match_extend_back_loop_encodeBlockAsm12B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBlockAsm12B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBlockAsm12B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBlockAsm12B JMP match_extend_back_loop_encodeBlockAsm12B match_extend_back_end_encodeBlockAsm12B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBlockAsm12B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeBlockAsm12B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeBlockAsm12B JB three_bytes_match_emit_encodeBlockAsm12B three_bytes_match_emit_encodeBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBlockAsm12B two_bytes_match_emit_encodeBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeBlockAsm12B JMP memmove_long_match_emit_encodeBlockAsm12B one_byte_match_emit_encodeBlockAsm12B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBlockAsm12B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeBlockAsm12B emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm12B emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm12B emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBlockAsm12B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeBlockAsm12B memmove_long_match_emit_encodeBlockAsm12B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeBlockAsm12B: match_nolit_loop_encodeBlockAsm12B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeBlockAsm12B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeBlockAsm12B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm12B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeBlockAsm12B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeBlockAsm12B matchlen_bsf_16match_nolit_encodeBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeBlockAsm12B matchlen_match8_match_nolit_encodeBlockAsm12B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm12B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm12B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeBlockAsm12B matchlen_bsf_8_match_nolit_encodeBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeBlockAsm12B matchlen_match4_match_nolit_encodeBlockAsm12B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm12B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeBlockAsm12B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeBlockAsm12B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeBlockAsm12B JB match_nolit_end_encodeBlockAsm12B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeBlockAsm12B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeBlockAsm12B matchlen_match1_match_nolit_encodeBlockAsm12B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeBlockAsm12B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeBlockAsm12B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeBlockAsm12B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE long_offset_short_match_nolit_encodeBlockAsm12B - MOVL $0x00000001, SI - LEAL 16(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX - SUBL $0x08, R9 + MOVL $0x00000001, DI + LEAL 16(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R10 // emitRepeat - LEAL -4(R9), R9 + LEAL -4(R10), R10 JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short_2b - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short_2b - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short_2b: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short_2b: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B long_offset_short_match_nolit_encodeBlockAsm12B: - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX // emitRepeat - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX - JMP match_nolit_emitcopy_end_encodeBlockAsm12B - + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX + JMP match_nolit_emitcopy_end_encodeBlockAsm12B + two_byte_offset_short_match_nolit_encodeBlockAsm12B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeBlockAsm12B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeBlockAsm12B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm12B emit_copy_three_match_nolit_encodeBlockAsm12B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeBlockAsm12B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBlockAsm12B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBlockAsm12B: - MOVQ $0x000000cf1bbcdcbb, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x18, DI - IMULQ R8, DI - SHRQ $0x34, DI - SHLQ $0x18, BX - IMULQ R8, BX - SHRQ $0x34, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x000000cf1bbcdcbb, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x18, R8 + IMULQ R9, R8 + SHRQ $0x34, R8 + SHLQ $0x18, SI + IMULQ R9, SI + SHRQ $0x34, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeBlockAsm12B - INCL CX + INCL DX JMP search_loop_encodeBlockAsm12B emit_remainder_encodeBlockAsm12B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBlockAsm12B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBlockAsm12B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBlockAsm12B @@ -3709,26 +3712,26 @@ emit_remainder_ok_encodeBlockAsm12B: JB three_bytes_emit_remainder_encodeBlockAsm12B three_bytes_emit_remainder_encodeBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBlockAsm12B two_bytes_emit_remainder_encodeBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBlockAsm12B JMP memmove_long_emit_remainder_encodeBlockAsm12B one_byte_emit_remainder_encodeBlockAsm12B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -3744,73 +3747,73 @@ memmove_emit_remainder_encodeBlockAsm12B: JMP emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBlockAsm12B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBlockAsm12B memmove_long_emit_remainder_encodeBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back: MOVOU (SI), X4 @@ -3824,967 +3827,968 @@ emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBlockAsm12B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBlockAsm10B(dst []byte, src []byte) int +// func encodeBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBlockAsm10B(SB), $4120-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000020, CX - LEAQ 24(SP), DX +TEXT ·encodeBlockAsm10B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000020, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBlockAsm10B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBlockAsm10B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeBlockAsm10B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBlockAsm10B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x9e3779b1, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x9e3779b1, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x20, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x36, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x20, R11 + IMULQ R9, R11 + SHRQ $0x36, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x20, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeBlockAsm10B - LEAL 1(CX), SI - MOVL 12(SP), DI - MOVL SI, BX - SUBL 16(SP), BX + LEAL 1(DX), DI + MOVL 12(SP), R8 + MOVL DI, SI + SUBL 16(SP), SI JZ repeat_extend_back_end_encodeBlockAsm10B repeat_extend_back_loop_encodeBlockAsm10B: - CMPL SI, DI + CMPL DI, R8 JBE repeat_extend_back_end_encodeBlockAsm10B - MOVB -1(DX)(BX*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(SI*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeBlockAsm10B - LEAL -1(SI), SI - DECL BX + LEAL -1(DI), DI + DECL SI JNZ repeat_extend_back_loop_encodeBlockAsm10B repeat_extend_back_end_encodeBlockAsm10B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeBlockAsm10B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeBlockAsm10B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeBlockAsm10B JB three_bytes_repeat_emit_encodeBlockAsm10B three_bytes_repeat_emit_encodeBlockAsm10B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeBlockAsm10B two_bytes_repeat_emit_encodeBlockAsm10B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeBlockAsm10B JMP memmove_long_repeat_emit_encodeBlockAsm10B one_byte_repeat_emit_encodeBlockAsm10B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_repeat_emit_encodeBlockAsm10B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeBlockAsm10B memmove_long_repeat_emit_encodeBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R11 - SHRQ $0x05, R11 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R12 - SUBQ R10, R12 - DECQ R11 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R12 + SHRQ $0x05, R12 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R13 + SUBQ R11, R13 + DECQ R12 JA emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R12*1), R10 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R10)(R13*1), R11 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R11 ADDQ $0x20, R13 - ADDQ $0x20, R10 - ADDQ $0x20, R12 - DECQ R11 + DECQ R12 JNA emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R12*1), X4 - MOVOU -16(R9)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ R8, R12 + MOVOU -32(R10)(R13*1), X4 + MOVOU -16(R10)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R9, R13 JAE emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeBlockAsm10B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), R8 - SUBL CX, R8 - LEAQ (DX)(CX*1), R9 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R9 + SUBL DX, R9 + LEAQ (BX)(DX*1), R10 + LEAQ (BX)(SI*1), SI // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_repeat_extend_encodeBlockAsm10B: - CMPL R8, $0x10 + CMPL R9, $0x10 JB matchlen_match8_repeat_extend_encodeBlockAsm10B - MOVQ (R9)(R11*1), R10 - MOVQ 8(R9)(R11*1), R12 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + MOVQ 8(R10)(R12*1), R13 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm10B - XORQ 8(BX)(R11*1), R12 + XORQ 8(SI)(R12*1), R13 JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm10B - LEAL -16(R8), R8 - LEAL 16(R11), R11 + LEAL -16(R9), R9 + LEAL 16(R12), R12 JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm10B matchlen_bsf_16repeat_extend_encodeBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm10B matchlen_match8_repeat_extend_encodeBlockAsm10B: - CMPL R8, $0x08 + CMPL R9, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm10B - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm10B - LEAL -8(R8), R8 - LEAL 8(R11), R11 + LEAL -8(R9), R9 + LEAL 8(R12), R12 JMP matchlen_match4_repeat_extend_encodeBlockAsm10B matchlen_bsf_8_repeat_extend_encodeBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm10B matchlen_match4_repeat_extend_encodeBlockAsm10B: - CMPL R8, $0x04 + CMPL R9, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm10B - MOVL (R9)(R11*1), R10 - CMPL (BX)(R11*1), R10 + MOVL (R10)(R12*1), R11 + CMPL (SI)(R12*1), R11 JNE matchlen_match2_repeat_extend_encodeBlockAsm10B - LEAL -4(R8), R8 - LEAL 4(R11), R11 + LEAL -4(R9), R9 + LEAL 4(R12), R12 matchlen_match2_repeat_extend_encodeBlockAsm10B: - CMPL R8, $0x01 + CMPL R9, $0x01 JE matchlen_match1_repeat_extend_encodeBlockAsm10B JB repeat_extend_forward_end_encodeBlockAsm10B - MOVW (R9)(R11*1), R10 - CMPW (BX)(R11*1), R10 + MOVW (R10)(R12*1), R11 + CMPW (SI)(R12*1), R11 JNE matchlen_match1_repeat_extend_encodeBlockAsm10B - LEAL 2(R11), R11 - SUBL $0x02, R8 + LEAL 2(R12), R12 + SUBL $0x02, R9 JZ repeat_extend_forward_end_encodeBlockAsm10B matchlen_match1_repeat_extend_encodeBlockAsm10B: - MOVB (R9)(R11*1), R10 - CMPB (BX)(R11*1), R10 + MOVB (R10)(R12*1), R11 + CMPB (SI)(R12*1), R11 JNE repeat_extend_forward_end_encodeBlockAsm10B - LEAL 1(R11), R11 + LEAL 1(R12), R12 repeat_extend_forward_end_encodeBlockAsm10B: - ADDL R11, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI - TESTL DI, DI + ADDL R12, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI + TESTL R8, R8 JZ repeat_as_copy_encodeBlockAsm10B // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_match_repeat_encodeBlockAsm10B - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm10B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_match_repeat_encodeBlockAsm10B cant_repeat_two_offset_match_repeat_encodeBlockAsm10B: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_match_repeat_encodeBlockAsm10B - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_three_match_repeat_encodeBlockAsm10B: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_match_repeat_encodeBlockAsm10B: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_offset_match_repeat_encodeBlockAsm10B: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_as_copy_encodeBlockAsm10B: // emitCopy - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm10B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE long_offset_short_repeat_as_copy_encodeBlockAsm10B - MOVL $0x00000001, DI - LEAL 16(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX - SUBL $0x08, BX + MOVL $0x00000001, R8 + LEAL 16(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX + SUBL $0x08, SI // emitRepeat - LEAL -4(BX), BX + LEAL -4(SI), SI JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B long_offset_short_repeat_as_copy_encodeBlockAsm10B: - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX // emitRepeat - MOVL BX, DI - LEAL -4(BX), BX - CMPL DI, $0x08 + MOVL SI, R8 + LEAL -4(SI), SI + CMPL R8, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short - CMPL DI, $0x0c + CMPL R8, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JB repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short: - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B two_byte_offset_short_repeat_as_copy_encodeBlockAsm10B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeBlockAsm10B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeBlockAsm10B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm10B emit_copy_three_repeat_as_copy_encodeBlockAsm10B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeBlockAsm10B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeBlockAsm10B no_repeat_found_encodeBlockAsm10B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBlockAsm10B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeBlockAsm10B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeBlockAsm10B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBlockAsm10B candidate3_match_encodeBlockAsm10B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeBlockAsm10B candidate2_match_encodeBlockAsm10B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeBlockAsm10B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBlockAsm10B match_extend_back_loop_encodeBlockAsm10B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBlockAsm10B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBlockAsm10B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBlockAsm10B JMP match_extend_back_loop_encodeBlockAsm10B match_extend_back_end_encodeBlockAsm10B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBlockAsm10B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeBlockAsm10B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeBlockAsm10B JB three_bytes_match_emit_encodeBlockAsm10B three_bytes_match_emit_encodeBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBlockAsm10B two_bytes_match_emit_encodeBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeBlockAsm10B JMP memmove_long_match_emit_encodeBlockAsm10B one_byte_match_emit_encodeBlockAsm10B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBlockAsm10B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeBlockAsm10B emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm10B emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm10B emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBlockAsm10B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeBlockAsm10B memmove_long_match_emit_encodeBlockAsm10B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeBlockAsm10B: match_nolit_loop_encodeBlockAsm10B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeBlockAsm10B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeBlockAsm10B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm10B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeBlockAsm10B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeBlockAsm10B matchlen_bsf_16match_nolit_encodeBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeBlockAsm10B matchlen_match8_match_nolit_encodeBlockAsm10B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm10B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm10B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeBlockAsm10B matchlen_bsf_8_match_nolit_encodeBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeBlockAsm10B matchlen_match4_match_nolit_encodeBlockAsm10B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm10B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeBlockAsm10B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeBlockAsm10B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeBlockAsm10B JB match_nolit_end_encodeBlockAsm10B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeBlockAsm10B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeBlockAsm10B matchlen_match1_match_nolit_encodeBlockAsm10B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeBlockAsm10B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeBlockAsm10B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeBlockAsm10B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE long_offset_short_match_nolit_encodeBlockAsm10B - MOVL $0x00000001, SI - LEAL 16(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX - SUBL $0x08, R9 + MOVL $0x00000001, DI + LEAL 16(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R10 // emitRepeat - LEAL -4(R9), R9 + LEAL -4(R10), R10 JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short_2b - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short_2b - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short_2b: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short_2b: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B long_offset_short_match_nolit_encodeBlockAsm10B: - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX // emitRepeat - MOVL R9, SI - LEAL -4(R9), R9 - CMPL SI, $0x08 + MOVL R10, DI + LEAL -4(R10), R10 + CMPL DI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JB repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short: - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B two_byte_offset_short_match_nolit_encodeBlockAsm10B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeBlockAsm10B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeBlockAsm10B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm10B emit_copy_three_match_nolit_encodeBlockAsm10B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeBlockAsm10B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBlockAsm10B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBlockAsm10B: - MOVQ $0x9e3779b1, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x20, DI - IMULQ R8, DI - SHRQ $0x36, DI - SHLQ $0x20, BX - IMULQ R8, BX - SHRQ $0x36, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x9e3779b1, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x20, R8 + IMULQ R9, R8 + SHRQ $0x36, R8 + SHLQ $0x20, SI + IMULQ R9, SI + SHRQ $0x36, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeBlockAsm10B - INCL CX + INCL DX JMP search_loop_encodeBlockAsm10B emit_remainder_encodeBlockAsm10B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBlockAsm10B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBlockAsm10B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBlockAsm10B @@ -4793,26 +4797,26 @@ emit_remainder_ok_encodeBlockAsm10B: JB three_bytes_emit_remainder_encodeBlockAsm10B three_bytes_emit_remainder_encodeBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBlockAsm10B two_bytes_emit_remainder_encodeBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBlockAsm10B JMP memmove_long_emit_remainder_encodeBlockAsm10B one_byte_emit_remainder_encodeBlockAsm10B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -4828,73 +4832,73 @@ memmove_emit_remainder_encodeBlockAsm10B: JMP emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBlockAsm10B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBlockAsm10B memmove_long_emit_remainder_encodeBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back: MOVOU (SI), X4 @@ -4908,943 +4912,944 @@ emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBlockAsm10B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBlockAsm8B(dst []byte, src []byte) int +// func encodeBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBlockAsm8B(SB), $1048-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000008, CX - LEAQ 24(SP), DX +TEXT ·encodeBlockAsm8B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000008, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBlockAsm8B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBlockAsm8B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeBlockAsm8B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x04, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x04, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBlockAsm8B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x9e3779b1, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x38, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x9e3779b1, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x20, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x38, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x38, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 - JNE no_repeat_found_encodeBlockAsm8B - LEAL 1(CX), SI - MOVL 12(SP), DI - MOVL SI, BX - SUBL 16(SP), BX + SHLQ $0x20, R11 + IMULQ R9, R11 + SHRQ $0x38, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x20, R10 + IMULQ R9, R10 + SHRQ $0x38, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 + JNE no_repeat_found_encodeBlockAsm8B + LEAL 1(DX), DI + MOVL 12(SP), R8 + MOVL DI, SI + SUBL 16(SP), SI JZ repeat_extend_back_end_encodeBlockAsm8B repeat_extend_back_loop_encodeBlockAsm8B: - CMPL SI, DI + CMPL DI, R8 JBE repeat_extend_back_end_encodeBlockAsm8B - MOVB -1(DX)(BX*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(SI*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeBlockAsm8B - LEAL -1(SI), SI - DECL BX + LEAL -1(DI), DI + DECL SI JNZ repeat_extend_back_loop_encodeBlockAsm8B repeat_extend_back_end_encodeBlockAsm8B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeBlockAsm8B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeBlockAsm8B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeBlockAsm8B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeBlockAsm8B JB three_bytes_repeat_emit_encodeBlockAsm8B three_bytes_repeat_emit_encodeBlockAsm8B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeBlockAsm8B two_bytes_repeat_emit_encodeBlockAsm8B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeBlockAsm8B JMP memmove_long_repeat_emit_encodeBlockAsm8B one_byte_repeat_emit_encodeBlockAsm8B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_repeat_emit_encodeBlockAsm8B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeBlockAsm8B memmove_long_repeat_emit_encodeBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R11 - SHRQ $0x05, R11 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R12 - SUBQ R10, R12 - DECQ R11 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R12 + SHRQ $0x05, R12 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R13 + SUBQ R11, R13 + DECQ R12 JA emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R12*1), R10 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R10)(R13*1), R11 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R11 ADDQ $0x20, R13 - ADDQ $0x20, R10 - ADDQ $0x20, R12 - DECQ R11 + DECQ R12 JNA emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R12*1), X4 - MOVOU -16(R9)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ R8, R12 + MOVOU -32(R10)(R13*1), X4 + MOVOU -16(R10)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R9, R13 JAE emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeBlockAsm8B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), R8 - SUBL CX, R8 - LEAQ (DX)(CX*1), R9 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R9 + SUBL DX, R9 + LEAQ (BX)(DX*1), R10 + LEAQ (BX)(SI*1), SI // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_repeat_extend_encodeBlockAsm8B: - CMPL R8, $0x10 + CMPL R9, $0x10 JB matchlen_match8_repeat_extend_encodeBlockAsm8B - MOVQ (R9)(R11*1), R10 - MOVQ 8(R9)(R11*1), R12 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + MOVQ 8(R10)(R12*1), R13 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm8B - XORQ 8(BX)(R11*1), R12 + XORQ 8(SI)(R12*1), R13 JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm8B - LEAL -16(R8), R8 - LEAL 16(R11), R11 + LEAL -16(R9), R9 + LEAL 16(R12), R12 JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm8B matchlen_bsf_16repeat_extend_encodeBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm8B matchlen_match8_repeat_extend_encodeBlockAsm8B: - CMPL R8, $0x08 + CMPL R9, $0x08 JB matchlen_match4_repeat_extend_encodeBlockAsm8B - MOVQ (R9)(R11*1), R10 - XORQ (BX)(R11*1), R10 + MOVQ (R10)(R12*1), R11 + XORQ (SI)(R12*1), R11 JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm8B - LEAL -8(R8), R8 - LEAL 8(R11), R11 + LEAL -8(R9), R9 + LEAL 8(R12), R12 JMP matchlen_match4_repeat_extend_encodeBlockAsm8B matchlen_bsf_8_repeat_extend_encodeBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP repeat_extend_forward_end_encodeBlockAsm8B matchlen_match4_repeat_extend_encodeBlockAsm8B: - CMPL R8, $0x04 + CMPL R9, $0x04 JB matchlen_match2_repeat_extend_encodeBlockAsm8B - MOVL (R9)(R11*1), R10 - CMPL (BX)(R11*1), R10 + MOVL (R10)(R12*1), R11 + CMPL (SI)(R12*1), R11 JNE matchlen_match2_repeat_extend_encodeBlockAsm8B - LEAL -4(R8), R8 - LEAL 4(R11), R11 + LEAL -4(R9), R9 + LEAL 4(R12), R12 matchlen_match2_repeat_extend_encodeBlockAsm8B: - CMPL R8, $0x01 + CMPL R9, $0x01 JE matchlen_match1_repeat_extend_encodeBlockAsm8B JB repeat_extend_forward_end_encodeBlockAsm8B - MOVW (R9)(R11*1), R10 - CMPW (BX)(R11*1), R10 + MOVW (R10)(R12*1), R11 + CMPW (SI)(R12*1), R11 JNE matchlen_match1_repeat_extend_encodeBlockAsm8B - LEAL 2(R11), R11 - SUBL $0x02, R8 + LEAL 2(R12), R12 + SUBL $0x02, R9 JZ repeat_extend_forward_end_encodeBlockAsm8B matchlen_match1_repeat_extend_encodeBlockAsm8B: - MOVB (R9)(R11*1), R10 - CMPB (BX)(R11*1), R10 + MOVB (R10)(R12*1), R11 + CMPB (SI)(R12*1), R11 JNE repeat_extend_forward_end_encodeBlockAsm8B - LEAL 1(R11), R11 + LEAL 1(R12), R12 repeat_extend_forward_end_encodeBlockAsm8B: - ADDL R11, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI - TESTL DI, DI + ADDL R12, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI + TESTL R8, R8 JZ repeat_as_copy_encodeBlockAsm8B // emitRepeat - MOVL BX, SI - LEAL -4(BX), BX - CMPL SI, $0x08 + MOVL SI, DI + LEAL -4(SI), SI + CMPL DI, $0x08 JBE repeat_two_match_repeat_encodeBlockAsm8B - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm8B cant_repeat_two_offset_match_repeat_encodeBlockAsm8B: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_match_repeat_encodeBlockAsm8B - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_three_match_repeat_encodeBlockAsm8B: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_two_match_repeat_encodeBlockAsm8B: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_as_copy_encodeBlockAsm8B: // emitCopy - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm8B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE long_offset_short_repeat_as_copy_encodeBlockAsm8B - MOVL $0x00000001, DI - LEAL 16(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX - SUBL $0x08, BX + MOVL $0x00000001, R8 + LEAL 16(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX + SUBL $0x08, SI // emitRepeat - LEAL -4(BX), BX + LEAL -4(SI), SI JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b - MOVL BX, SI - LEAL -4(BX), BX - CMPL SI, $0x08 + MOVL SI, DI + LEAL -4(SI), SI + CMPL DI, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B long_offset_short_repeat_as_copy_encodeBlockAsm8B: - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX // emitRepeat - MOVL BX, SI - LEAL -4(BX), BX - CMPL SI, $0x08 + MOVL SI, DI + LEAL -4(SI), SI + CMPL DI, $0x08 JBE repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short - CMPL SI, $0x0c + CMPL DI, $0x0c JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short: - CMPL BX, $0x00000104 + CMPL SI, $0x00000104 JB repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short - LEAL -256(BX), BX - MOVW $0x0019, (AX) - MOVW BX, 2(AX) - ADDQ $0x04, AX + LEAL -256(SI), SI + MOVW $0x0019, (CX) + MOVW SI, 2(CX) + ADDQ $0x04, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short: - LEAL -4(BX), BX - MOVW $0x0015, (AX) - MOVB BL, 2(AX) - ADDQ $0x03, AX + LEAL -4(SI), SI + MOVW $0x0015, (CX) + MOVB SI, 2(CX) + ADDQ $0x03, CX JMP repeat_end_emit_encodeBlockAsm8B repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short: - SHLL $0x02, BX - ORL $0x01, BX - MOVW BX, (AX) - ADDQ $0x02, AX + SHLL $0x02, SI + ORL $0x01, SI + MOVW SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B - XORQ DI, DI - LEAL 1(DI)(BX*4), BX - MOVB SI, 1(AX) - SARL $0x08, SI - SHLL $0x05, SI - ORL SI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + XORQ R8, R8 + LEAL 1(R8)(SI*4), SI + MOVB DI, 1(CX) + SARL $0x08, DI + SHLL $0x05, DI + ORL DI, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B two_byte_offset_short_repeat_as_copy_encodeBlockAsm8B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeBlockAsm8B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeBlockAsm8B emit_copy_three_repeat_as_copy_encodeBlockAsm8B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeBlockAsm8B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeBlockAsm8B no_repeat_found_encodeBlockAsm8B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBlockAsm8B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeBlockAsm8B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeBlockAsm8B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBlockAsm8B candidate3_match_encodeBlockAsm8B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeBlockAsm8B candidate2_match_encodeBlockAsm8B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeBlockAsm8B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBlockAsm8B match_extend_back_loop_encodeBlockAsm8B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBlockAsm8B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBlockAsm8B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBlockAsm8B JMP match_extend_back_loop_encodeBlockAsm8B match_extend_back_end_encodeBlockAsm8B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBlockAsm8B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeBlockAsm8B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeBlockAsm8B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeBlockAsm8B JB three_bytes_match_emit_encodeBlockAsm8B three_bytes_match_emit_encodeBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBlockAsm8B two_bytes_match_emit_encodeBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeBlockAsm8B JMP memmove_long_match_emit_encodeBlockAsm8B one_byte_match_emit_encodeBlockAsm8B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBlockAsm8B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeBlockAsm8B emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm8B emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBlockAsm8B emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBlockAsm8B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeBlockAsm8B memmove_long_match_emit_encodeBlockAsm8B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) - ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 + ADDQ $0x20, R12 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeBlockAsm8B: match_nolit_loop_encodeBlockAsm8B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeBlockAsm8B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeBlockAsm8B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm8B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeBlockAsm8B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeBlockAsm8B matchlen_bsf_16match_nolit_encodeBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeBlockAsm8B matchlen_match8_match_nolit_encodeBlockAsm8B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeBlockAsm8B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm8B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeBlockAsm8B matchlen_bsf_8_match_nolit_encodeBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeBlockAsm8B matchlen_match4_match_nolit_encodeBlockAsm8B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeBlockAsm8B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeBlockAsm8B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeBlockAsm8B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeBlockAsm8B JB match_nolit_end_encodeBlockAsm8B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeBlockAsm8B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeBlockAsm8B matchlen_match1_match_nolit_encodeBlockAsm8B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeBlockAsm8B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeBlockAsm8B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeBlockAsm8B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE long_offset_short_match_nolit_encodeBlockAsm8B - MOVL $0x00000001, SI - LEAL 16(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX - SUBL $0x08, R9 + MOVL $0x00000001, DI + LEAL 16(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R10 // emitRepeat - LEAL -4(R9), R9 + LEAL -4(R10), R10 JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b - MOVL R9, BX - LEAL -4(R9), R9 - CMPL BX, $0x08 + MOVL R10, SI + LEAL -4(R10), R10 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short_2b - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short_2b: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short_2b: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B long_offset_short_match_nolit_encodeBlockAsm8B: - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX // emitRepeat - MOVL R9, BX - LEAL -4(R9), R9 - CMPL BX, $0x08 + MOVL R10, SI + LEAL -4(R10), R10 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short: - CMPL R9, $0x00000104 + CMPL R10, $0x00000104 JB repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short - LEAL -256(R9), R9 - MOVW $0x0019, (AX) - MOVW R9, 2(AX) - ADDQ $0x04, AX + LEAL -256(R10), R10 + MOVW $0x0019, (CX) + MOVW R10, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short: - LEAL -4(R9), R9 - MOVW $0x0015, (AX) - MOVB R9, 2(AX) - ADDQ $0x03, AX + LEAL -4(R10), R10 + MOVW $0x0015, (CX) + MOVB R10, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short: - SHLL $0x02, R9 - ORL $0x01, R9 - MOVW R9, (AX) - ADDQ $0x02, AX + SHLL $0x02, R10 + ORL $0x01, R10 + MOVW R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B - XORQ SI, SI - LEAL 1(SI)(R9*4), R9 - MOVB BL, 1(AX) - SARL $0x08, BX - SHLL $0x05, BX - ORL BX, R9 - MOVB R9, (AX) - ADDQ $0x02, AX + XORQ DI, DI + LEAL 1(DI)(R10*4), R10 + MOVB SI, 1(CX) + SARL $0x08, SI + SHLL $0x05, SI + ORL SI, R10 + MOVB R10, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B two_byte_offset_short_match_nolit_encodeBlockAsm8B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeBlockAsm8B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBlockAsm8B emit_copy_three_match_nolit_encodeBlockAsm8B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeBlockAsm8B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBlockAsm8B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBlockAsm8B: - MOVQ $0x9e3779b1, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x20, DI - IMULQ R8, DI - SHRQ $0x38, DI - SHLQ $0x20, BX - IMULQ R8, BX - SHRQ $0x38, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x9e3779b1, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x20, R8 + IMULQ R9, R8 + SHRQ $0x38, R8 + SHLQ $0x20, SI + IMULQ R9, SI + SHRQ $0x38, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeBlockAsm8B - INCL CX + INCL DX JMP search_loop_encodeBlockAsm8B emit_remainder_encodeBlockAsm8B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBlockAsm8B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBlockAsm8B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBlockAsm8B @@ -5853,26 +5858,26 @@ emit_remainder_ok_encodeBlockAsm8B: JB three_bytes_emit_remainder_encodeBlockAsm8B three_bytes_emit_remainder_encodeBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBlockAsm8B two_bytes_emit_remainder_encodeBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBlockAsm8B JMP memmove_long_emit_remainder_encodeBlockAsm8B one_byte_emit_remainder_encodeBlockAsm8B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -5888,73 +5893,73 @@ memmove_emit_remainder_encodeBlockAsm8B: JMP emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBlockAsm8B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBlockAsm8B memmove_long_emit_remainder_encodeBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back: MOVOU (SI), X4 @@ -5968,961 +5973,962 @@ emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBlockAsm8B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBetterBlockAsm(dst []byte, src []byte) int +// func encodeBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBetterBlockAsm(SB), $589848-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00001200, CX - LEAQ 24(SP), DX +TEXT ·encodeBetterBlockAsm(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00001200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBetterBlockAsm: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBetterBlockAsm MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -6(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -6(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeBetterBlockAsm: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x07, BX - CMPL BX, $0x63 + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x07, SI + CMPL SI, $0x63 JBE check_maxskip_ok_encodeBetterBlockAsm - LEAL 100(CX), BX + LEAL 100(DX), SI JMP check_maxskip_cont_encodeBetterBlockAsm check_maxskip_ok_encodeBetterBlockAsm: - LEAL 1(CX)(BX*1), BX + LEAL 1(DX)(SI*1), SI check_maxskip_cont_encodeBetterBlockAsm: - CMPL BX, 8(SP) + CMPL SI, 8(SP) JAE emit_remainder_encodeBetterBlockAsm - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x00cf1bbcdcbfa563, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 524312(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 524312(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x00cf1bbcdcbfa563, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL 524288(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 524288(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeBetterBlockAsm - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeBetterBlockAsm - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeBetterBlockAsm no_short_found_encodeBetterBlockAsm: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeBetterBlockAsm - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeBetterBlockAsm - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBetterBlockAsm candidateS_match_encodeBetterBlockAsm: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBetterBlockAsm - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeBetterBlockAsm: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBetterBlockAsm match_extend_back_loop_encodeBetterBlockAsm: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBetterBlockAsm - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBetterBlockAsm - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBetterBlockAsm JMP match_extend_back_loop_encodeBetterBlockAsm match_extend_back_end_encodeBetterBlockAsm: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 5(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 5(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBetterBlockAsm: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeBetterBlockAsm: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeBetterBlockAsm - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm matchlen_bsf_16match_nolit_encodeBetterBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeBetterBlockAsm matchlen_match8_match_nolit_encodeBetterBlockAsm: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeBetterBlockAsm matchlen_bsf_8_match_nolit_encodeBetterBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeBetterBlockAsm matchlen_match4_match_nolit_encodeBetterBlockAsm: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeBetterBlockAsm - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeBetterBlockAsm: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeBetterBlockAsm JB match_nolit_end_encodeBetterBlockAsm - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeBetterBlockAsm - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeBetterBlockAsm matchlen_match1_match_nolit_encodeBetterBlockAsm: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeBetterBlockAsm - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeBetterBlockAsm: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL 16(SP), DI + CMPL 16(SP), R8 JEQ match_is_repeat_encodeBetterBlockAsm - CMPL R11, $0x01 + CMPL R12, $0x01 JA match_length_ok_encodeBetterBlockAsm - CMPL DI, $0x0000ffff + CMPL R8, $0x0000ffff JBE match_length_ok_encodeBetterBlockAsm - MOVL 20(SP), CX - INCL CX + MOVL 20(SP), DX + INCL DX JMP search_loop_encodeBetterBlockAsm match_length_ok_encodeBetterBlockAsm: - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeBetterBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeBetterBlockAsm - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeBetterBlockAsm - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_match_emit_encodeBetterBlockAsm - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_match_emit_encodeBetterBlockAsm - MOVB $0xfc, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP memmove_long_match_emit_encodeBetterBlockAsm four_bytes_match_emit_encodeBetterBlockAsm: - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeBetterBlockAsm three_bytes_match_emit_encodeBetterBlockAsm: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBetterBlockAsm two_bytes_match_emit_encodeBetterBlockAsm: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeBetterBlockAsm JMP memmove_long_match_emit_encodeBetterBlockAsm one_byte_match_emit_encodeBetterBlockAsm: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBetterBlockAsm: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeBetterBlockAsm memmove_long_match_emit_encodeBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeBetterBlockAsm: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB two_byte_offset_match_nolit_encodeBetterBlockAsm - CMPL R11, $0x40 + CMPL R12, $0x40 JBE four_bytes_remain_match_nolit_encodeBetterBlockAsm - MOVB $0xff, (AX) - MOVL DI, 1(AX) - LEAL -64(R11), R11 - ADDQ $0x05, AX - CMPL R11, $0x04 + MOVB $0xff, (CX) + MOVL R8, 1(CX) + LEAL -64(R12), R12 + ADDQ $0x05, CX + CMPL R12, $0x04 JB four_bytes_remain_match_nolit_encodeBetterBlockAsm // emitRepeat emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy: - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy - CMPL R11, $0x0100ffff + CMPL R12, $0x0100ffff JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy - LEAL -16842747(R11), R11 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R12), R12 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy: - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm four_bytes_remain_match_nolit_encodeBetterBlockAsm: - TESTL R11, R11 + TESTL R12, R12 JZ match_nolit_emitcopy_end_encodeBetterBlockAsm - XORL BX, BX - LEAL -1(BX)(R11*4), R11 - MOVB R11, (AX) - MOVL DI, 1(AX) - ADDQ $0x05, AX + XORL SI, SI + LEAL -1(SI)(R12*4), R12 + MOVB R12, (CX) + MOVL R8, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm two_byte_offset_match_nolit_encodeBetterBlockAsm: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE long_offset_short_match_nolit_encodeBetterBlockAsm - MOVL $0x00000001, BX - LEAL 16(BX), BX - MOVB DI, 1(AX) - MOVL DI, R8 - SHRL $0x08, R8 - SHLL $0x05, R8 - ORL R8, BX - MOVB BL, (AX) - ADDQ $0x02, AX - SUBL $0x08, R11 + MOVL $0x00000001, SI + LEAL 16(SI), SI + MOVB R8, 1(CX) + MOVL R8, R9 + SHRL $0x08, R9 + SHLL $0x05, R9 + ORL R9, SI + MOVB SI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R12 // emitRepeat - LEAL -4(R11), R11 + LEAL -4(R12), R12 JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b - CMPL R11, $0x0100ffff + CMPL R12, $0x0100ffff JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b - LEAL -16842747(R11), R11 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R12), R12 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm long_offset_short_match_nolit_encodeBetterBlockAsm: - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX // emitRepeat emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short: - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short - CMPL R11, $0x0100ffff + CMPL R12, $0x0100ffff JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short - LEAL -16842747(R11), R11 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R12), R12 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short: - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm two_byte_offset_short_match_nolit_encodeBetterBlockAsm: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeBetterBlockAsm - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeBetterBlockAsm - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm emit_copy_three_match_nolit_encodeBetterBlockAsm: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm match_is_repeat_encodeBetterBlockAsm: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_repeat_encodeBetterBlockAsm - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_repeat_encodeBetterBlockAsm - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_match_emit_repeat_encodeBetterBlockAsm - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_match_emit_repeat_encodeBetterBlockAsm - MOVB $0xfc, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm four_bytes_match_emit_repeat_encodeBetterBlockAsm: - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm three_bytes_match_emit_repeat_encodeBetterBlockAsm: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm two_bytes_match_emit_repeat_encodeBetterBlockAsm: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_repeat_encodeBetterBlockAsm JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm one_byte_match_emit_repeat_encodeBetterBlockAsm: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_repeat_encodeBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_33through64 emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm memmove_long_match_emit_repeat_encodeBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_big_loop_back emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_repeat_encodeBetterBlockAsm: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitRepeat emit_repeat_again_match_nolit_repeat_encodeBetterBlockAsm: - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_repeat_encodeBetterBlockAsm - CMPL R11, $0x0100ffff + CMPL R12, $0x0100ffff JB repeat_five_match_nolit_repeat_encodeBetterBlockAsm - LEAL -16842747(R11), R11 - MOVL $0xfffb001d, (AX) - MOVB $0xff, 4(AX) - ADDQ $0x05, AX + LEAL -16842747(R12), R12 + MOVL $0xfffb001d, (CX) + MOVB $0xff, 4(CX) + ADDQ $0x05, CX JMP emit_repeat_again_match_nolit_repeat_encodeBetterBlockAsm repeat_five_match_nolit_repeat_encodeBetterBlockAsm: - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_four_match_nolit_repeat_encodeBetterBlockAsm: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_three_match_nolit_repeat_encodeBetterBlockAsm: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_match_nolit_repeat_encodeBetterBlockAsm: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX match_nolit_emitcopy_end_encodeBetterBlockAsm: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBetterBlockAsm - CMPQ AX, (SP) - JB match_nolit_dst_ok_encodeBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) - RET - -match_nolit_dst_ok_encodeBetterBlockAsm: - MOVQ $0x00cf1bbcdcbfa563, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x32, R10 - SHLQ $0x08, R11 - IMULQ BX, R11 - SHRQ $0x2f, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x32, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 524312(SP)(R10*4) - MOVL R13, 524312(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + CMPQ CX, (SP) + JB match_nolit_dst_ok_encodeBetterBlockAsm + MOVQ $0x00000000, ret+56(FP) + RET + +match_nolit_dst_ok_encodeBetterBlockAsm: + MOVQ $0x00cf1bbcdcbfa563, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x08, R10 + IMULQ SI, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x32, R11 + SHLQ $0x08, R12 + IMULQ SI, R12 + SHRQ $0x2f, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x32, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 524288(AX)(R11*4) + MOVL R14, 524288(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeBetterBlockAsm: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeBetterBlockAsm - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x08, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x2f, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x08, R11 + IMULQ SI, R11 + SHRQ $0x2f, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeBetterBlockAsm emit_remainder_encodeBetterBlockAsm: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 5(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 5(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBetterBlockAsm: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBetterBlockAsm @@ -6932,41 +6938,41 @@ emit_remainder_ok_encodeBetterBlockAsm: JB three_bytes_emit_remainder_encodeBetterBlockAsm CMPL DX, $0x01000000 JB four_bytes_emit_remainder_encodeBetterBlockAsm - MOVB $0xfc, (AX) - MOVL DX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL DX, 1(CX) + ADDQ $0x05, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm four_bytes_emit_remainder_encodeBetterBlockAsm: MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm three_bytes_emit_remainder_encodeBetterBlockAsm: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm two_bytes_emit_remainder_encodeBetterBlockAsm: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBetterBlockAsm JMP memmove_long_emit_remainder_encodeBetterBlockAsm one_byte_emit_remainder_encodeBetterBlockAsm: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBetterBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -6982,73 +6988,73 @@ memmove_emit_remainder_encodeBetterBlockAsm: JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBetterBlockAsm: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm memmove_long_emit_remainder_encodeBetterBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back: MOVOU (SI), X4 @@ -7062,903 +7068,904 @@ emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBetterBlockAsm: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBetterBlockAsm4MB(dst []byte, src []byte) int +// func encodeBetterBlockAsm4MB(dst []byte, src []byte, tmp *[589824]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBetterBlockAsm4MB(SB), $589848-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00001200, CX - LEAQ 24(SP), DX +TEXT ·encodeBetterBlockAsm4MB(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00001200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBetterBlockAsm4MB: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBetterBlockAsm4MB MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -6(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -6(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeBetterBlockAsm4MB: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x07, BX - CMPL BX, $0x63 + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x07, SI + CMPL SI, $0x63 JBE check_maxskip_ok_encodeBetterBlockAsm4MB - LEAL 100(CX), BX + LEAL 100(DX), SI JMP check_maxskip_cont_encodeBetterBlockAsm4MB check_maxskip_ok_encodeBetterBlockAsm4MB: - LEAL 1(CX)(BX*1), BX + LEAL 1(DX)(SI*1), SI check_maxskip_cont_encodeBetterBlockAsm4MB: - CMPL BX, 8(SP) + CMPL SI, 8(SP) JAE emit_remainder_encodeBetterBlockAsm4MB - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x00cf1bbcdcbfa563, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 524312(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 524312(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x00cf1bbcdcbfa563, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL 524288(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 524288(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeBetterBlockAsm4MB - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeBetterBlockAsm4MB - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeBetterBlockAsm4MB no_short_found_encodeBetterBlockAsm4MB: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeBetterBlockAsm4MB - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeBetterBlockAsm4MB - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBetterBlockAsm4MB candidateS_match_encodeBetterBlockAsm4MB: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBetterBlockAsm4MB - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeBetterBlockAsm4MB: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBetterBlockAsm4MB match_extend_back_loop_encodeBetterBlockAsm4MB: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBetterBlockAsm4MB - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBetterBlockAsm4MB - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBetterBlockAsm4MB JMP match_extend_back_loop_encodeBetterBlockAsm4MB match_extend_back_end_encodeBetterBlockAsm4MB: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 4(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 4(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBetterBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBetterBlockAsm4MB: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeBetterBlockAsm4MB - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeBetterBlockAsm4MB matchlen_match8_match_nolit_encodeBetterBlockAsm4MB: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm4MB - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeBetterBlockAsm4MB matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeBetterBlockAsm4MB matchlen_match4_match_nolit_encodeBetterBlockAsm4MB: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm4MB - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeBetterBlockAsm4MB - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeBetterBlockAsm4MB: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeBetterBlockAsm4MB JB match_nolit_end_encodeBetterBlockAsm4MB - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeBetterBlockAsm4MB - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeBetterBlockAsm4MB matchlen_match1_match_nolit_encodeBetterBlockAsm4MB: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeBetterBlockAsm4MB - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeBetterBlockAsm4MB: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL 16(SP), DI + CMPL 16(SP), R8 JEQ match_is_repeat_encodeBetterBlockAsm4MB - CMPL R11, $0x01 + CMPL R12, $0x01 JA match_length_ok_encodeBetterBlockAsm4MB - CMPL DI, $0x0000ffff + CMPL R8, $0x0000ffff JBE match_length_ok_encodeBetterBlockAsm4MB - MOVL 20(SP), CX - INCL CX + MOVL 20(SP), DX + INCL DX JMP search_loop_encodeBetterBlockAsm4MB match_length_ok_encodeBetterBlockAsm4MB: - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeBetterBlockAsm4MB - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeBetterBlockAsm4MB - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeBetterBlockAsm4MB - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_match_emit_encodeBetterBlockAsm4MB - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeBetterBlockAsm4MB three_bytes_match_emit_encodeBetterBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBetterBlockAsm4MB two_bytes_match_emit_encodeBetterBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeBetterBlockAsm4MB JMP memmove_long_match_emit_encodeBetterBlockAsm4MB one_byte_match_emit_encodeBetterBlockAsm4MB: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBetterBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBetterBlockAsm4MB: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeBetterBlockAsm4MB memmove_long_match_emit_encodeBetterBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeBetterBlockAsm4MB: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB two_byte_offset_match_nolit_encodeBetterBlockAsm4MB - CMPL R11, $0x40 + CMPL R12, $0x40 JBE four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB - MOVB $0xff, (AX) - MOVL DI, 1(AX) - LEAL -64(R11), R11 - ADDQ $0x05, AX - CMPL R11, $0x04 + MOVB $0xff, (CX) + MOVL R8, 1(CX) + LEAL -64(R12), R12 + ADDQ $0x05, CX + CMPL R12, $0x04 JB four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB: - TESTL R11, R11 + TESTL R12, R12 JZ match_nolit_emitcopy_end_encodeBetterBlockAsm4MB - XORL BX, BX - LEAL -1(BX)(R11*4), R11 - MOVB R11, (AX) - MOVL DI, 1(AX) - ADDQ $0x05, AX + XORL SI, SI + LEAL -1(SI)(R12*4), R12 + MOVB R12, (CX) + MOVL R8, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB two_byte_offset_match_nolit_encodeBetterBlockAsm4MB: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm4MB - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE long_offset_short_match_nolit_encodeBetterBlockAsm4MB - MOVL $0x00000001, BX - LEAL 16(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX - SUBL $0x08, R11 + MOVL $0x00000001, SI + LEAL 16(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R12 // emitRepeat - LEAL -4(R11), R11 + LEAL -4(R12), R12 JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB long_offset_short_match_nolit_encodeBetterBlockAsm4MB: - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB two_byte_offset_short_match_nolit_encodeBetterBlockAsm4MB: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeBetterBlockAsm4MB - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeBetterBlockAsm4MB - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB emit_copy_three_match_nolit_encodeBetterBlockAsm4MB: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB match_is_repeat_encodeBetterBlockAsm4MB: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_repeat_encodeBetterBlockAsm4MB - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_match_emit_repeat_encodeBetterBlockAsm4MB - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB three_bytes_match_emit_repeat_encodeBetterBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_repeat_encodeBetterBlockAsm4MB JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB one_byte_match_emit_repeat_encodeBetterBlockAsm4MB: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_repeat_encodeBetterBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_17through32 JMP emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm4MB - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm4MB - CMPL R11, $0x00010100 + CMPL R12, $0x00010100 JB repeat_four_match_nolit_repeat_encodeBetterBlockAsm4MB - LEAL -65536(R11), R11 - MOVL R11, DI - MOVW $0x001d, (AX) - MOVW R11, 2(AX) - SARL $0x10, DI - MOVB DI, 4(AX) - ADDQ $0x05, AX + LEAL -65536(R12), R12 + MOVL R12, R8 + MOVW $0x001d, (CX) + MOVW R12, 2(CX) + SARL $0x10, R8 + MOVB R8, 4(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_four_match_nolit_repeat_encodeBetterBlockAsm4MB: - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_three_match_nolit_repeat_encodeBetterBlockAsm4MB: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_match_nolit_repeat_encodeBetterBlockAsm4MB: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX match_nolit_emitcopy_end_encodeBetterBlockAsm4MB: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBetterBlockAsm4MB - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBetterBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBetterBlockAsm4MB: - MOVQ $0x00cf1bbcdcbfa563, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x32, R10 - SHLQ $0x08, R11 - IMULQ BX, R11 - SHRQ $0x2f, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x32, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 524312(SP)(R10*4) - MOVL R13, 524312(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x00cf1bbcdcbfa563, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x08, R10 + IMULQ SI, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x32, R11 + SHLQ $0x08, R12 + IMULQ SI, R12 + SHRQ $0x2f, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x32, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 524288(AX)(R11*4) + MOVL R14, 524288(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeBetterBlockAsm4MB: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeBetterBlockAsm4MB - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x08, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x2f, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x08, R11 + IMULQ SI, R11 + SHRQ $0x2f, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeBetterBlockAsm4MB emit_remainder_encodeBetterBlockAsm4MB: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 4(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 4(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBetterBlockAsm4MB - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBetterBlockAsm4MB: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBetterBlockAsm4MB @@ -7968,33 +7975,33 @@ emit_remainder_ok_encodeBetterBlockAsm4MB: JB three_bytes_emit_remainder_encodeBetterBlockAsm4MB MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB three_bytes_emit_remainder_encodeBetterBlockAsm4MB: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB two_bytes_emit_remainder_encodeBetterBlockAsm4MB: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBetterBlockAsm4MB JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB one_byte_emit_remainder_encodeBetterBlockAsm4MB: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBetterBlockAsm4MB: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -8010,73 +8017,73 @@ memmove_emit_remainder_encodeBetterBlockAsm4MB: JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB memmove_long_emit_remainder_encodeBetterBlockAsm4MB: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back: MOVOU (SI), X4 @@ -8090,756 +8097,757 @@ emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBetterBlockAsm12B(dst []byte, src []byte) int +// func encodeBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBetterBlockAsm12B(SB), $81944-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000280, CX - LEAQ 24(SP), DX +TEXT ·encodeBetterBlockAsm12B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000280, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBetterBlockAsm12B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBetterBlockAsm12B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -6(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -6(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeBetterBlockAsm12B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBetterBlockAsm12B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x34, R10 - MOVL 24(SP)(R9*4), BX - MOVL 65560(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 65560(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x34, R11 + MOVL (AX)(R10*4), SI + MOVL 65536(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 65536(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeBetterBlockAsm12B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeBetterBlockAsm12B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeBetterBlockAsm12B no_short_found_encodeBetterBlockAsm12B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeBetterBlockAsm12B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeBetterBlockAsm12B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBetterBlockAsm12B candidateS_match_encodeBetterBlockAsm12B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBetterBlockAsm12B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeBetterBlockAsm12B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBetterBlockAsm12B match_extend_back_loop_encodeBetterBlockAsm12B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBetterBlockAsm12B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBetterBlockAsm12B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBetterBlockAsm12B JMP match_extend_back_loop_encodeBetterBlockAsm12B match_extend_back_end_encodeBetterBlockAsm12B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBetterBlockAsm12B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeBetterBlockAsm12B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeBetterBlockAsm12B matchlen_match8_match_nolit_encodeBetterBlockAsm12B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm12B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeBetterBlockAsm12B matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeBetterBlockAsm12B matchlen_match4_match_nolit_encodeBetterBlockAsm12B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm12B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeBetterBlockAsm12B - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeBetterBlockAsm12B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeBetterBlockAsm12B JB match_nolit_end_encodeBetterBlockAsm12B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeBetterBlockAsm12B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeBetterBlockAsm12B matchlen_match1_match_nolit_encodeBetterBlockAsm12B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeBetterBlockAsm12B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeBetterBlockAsm12B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL 16(SP), DI + CMPL 16(SP), R8 JEQ match_is_repeat_encodeBetterBlockAsm12B - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeBetterBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeBetterBlockAsm12B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeBetterBlockAsm12B JB three_bytes_match_emit_encodeBetterBlockAsm12B three_bytes_match_emit_encodeBetterBlockAsm12B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBetterBlockAsm12B two_bytes_match_emit_encodeBetterBlockAsm12B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeBetterBlockAsm12B JMP memmove_long_match_emit_encodeBetterBlockAsm12B one_byte_match_emit_encodeBetterBlockAsm12B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBetterBlockAsm12B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeBetterBlockAsm12B memmove_long_match_emit_encodeBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeBetterBlockAsm12B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm12B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE long_offset_short_match_nolit_encodeBetterBlockAsm12B - MOVL $0x00000001, BX - LEAL 16(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX - SUBL $0x08, R11 + MOVL $0x00000001, SI + LEAL 16(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R12 // emitRepeat - LEAL -4(R11), R11 + LEAL -4(R12), R12 JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B long_offset_short_match_nolit_encodeBetterBlockAsm12B: - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B two_byte_offset_short_match_nolit_encodeBetterBlockAsm12B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeBetterBlockAsm12B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeBetterBlockAsm12B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B emit_copy_three_match_nolit_encodeBetterBlockAsm12B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B match_is_repeat_encodeBetterBlockAsm12B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_repeat_encodeBetterBlockAsm12B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_repeat_encodeBetterBlockAsm12B JB three_bytes_match_emit_repeat_encodeBetterBlockAsm12B three_bytes_match_emit_repeat_encodeBetterBlockAsm12B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm12B two_bytes_match_emit_repeat_encodeBetterBlockAsm12B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_repeat_encodeBetterBlockAsm12B JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm12B one_byte_match_emit_repeat_encodeBetterBlockAsm12B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_repeat_encodeBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_33through64 emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B memmove_long_match_emit_repeat_encodeBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm12B - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm12B - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_three_match_nolit_repeat_encodeBetterBlockAsm12B: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_match_nolit_repeat_encodeBetterBlockAsm12B: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX match_nolit_emitcopy_end_encodeBetterBlockAsm12B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBetterBlockAsm12B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBetterBlockAsm12B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x32, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x34, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x32, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x34, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 65560(SP)(R10*4) - MOVL R13, 65560(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x32, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x34, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x32, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x34, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 65536(AX)(R11*4) + MOVL R14, 65536(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeBetterBlockAsm12B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeBetterBlockAsm12B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x32, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x32, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeBetterBlockAsm12B emit_remainder_encodeBetterBlockAsm12B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBetterBlockAsm12B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm12B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBetterBlockAsm12B @@ -8848,26 +8856,26 @@ emit_remainder_ok_encodeBetterBlockAsm12B: JB three_bytes_emit_remainder_encodeBetterBlockAsm12B three_bytes_emit_remainder_encodeBetterBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm12B two_bytes_emit_remainder_encodeBetterBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBetterBlockAsm12B JMP memmove_long_emit_remainder_encodeBetterBlockAsm12B one_byte_emit_remainder_encodeBetterBlockAsm12B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBetterBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -8883,73 +8891,73 @@ memmove_emit_remainder_encodeBetterBlockAsm12B: JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm12B memmove_long_emit_remainder_encodeBetterBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back: MOVOU (SI), X4 @@ -8963,756 +8971,757 @@ emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 - JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_forward_sse_loop_32 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBetterBlockAsm12B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBetterBlockAsm10B(dst []byte, src []byte) int +// func encodeBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBetterBlockAsm10B(SB), $20504-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x000000a0, CX - LEAQ 24(SP), DX +TEXT ·encodeBetterBlockAsm10B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x000000a0, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBetterBlockAsm10B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBetterBlockAsm10B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -6(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -6(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeBetterBlockAsm10B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBetterBlockAsm10B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x36, R10 - MOVL 24(SP)(R9*4), BX - MOVL 16408(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 16408(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x36, R11 + MOVL (AX)(R10*4), SI + MOVL 16384(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 16384(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeBetterBlockAsm10B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeBetterBlockAsm10B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeBetterBlockAsm10B no_short_found_encodeBetterBlockAsm10B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeBetterBlockAsm10B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeBetterBlockAsm10B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBetterBlockAsm10B candidateS_match_encodeBetterBlockAsm10B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBetterBlockAsm10B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeBetterBlockAsm10B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBetterBlockAsm10B match_extend_back_loop_encodeBetterBlockAsm10B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBetterBlockAsm10B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBetterBlockAsm10B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBetterBlockAsm10B JMP match_extend_back_loop_encodeBetterBlockAsm10B match_extend_back_end_encodeBetterBlockAsm10B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBetterBlockAsm10B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeBetterBlockAsm10B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeBetterBlockAsm10B matchlen_match8_match_nolit_encodeBetterBlockAsm10B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm10B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeBetterBlockAsm10B matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeBetterBlockAsm10B matchlen_match4_match_nolit_encodeBetterBlockAsm10B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm10B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeBetterBlockAsm10B - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeBetterBlockAsm10B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeBetterBlockAsm10B JB match_nolit_end_encodeBetterBlockAsm10B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeBetterBlockAsm10B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeBetterBlockAsm10B matchlen_match1_match_nolit_encodeBetterBlockAsm10B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeBetterBlockAsm10B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeBetterBlockAsm10B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL 16(SP), DI + CMPL 16(SP), R8 JEQ match_is_repeat_encodeBetterBlockAsm10B - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeBetterBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeBetterBlockAsm10B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeBetterBlockAsm10B JB three_bytes_match_emit_encodeBetterBlockAsm10B three_bytes_match_emit_encodeBetterBlockAsm10B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBetterBlockAsm10B two_bytes_match_emit_encodeBetterBlockAsm10B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeBetterBlockAsm10B JMP memmove_long_match_emit_encodeBetterBlockAsm10B one_byte_match_emit_encodeBetterBlockAsm10B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBetterBlockAsm10B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeBetterBlockAsm10B memmove_long_match_emit_encodeBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeBetterBlockAsm10B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm10B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE long_offset_short_match_nolit_encodeBetterBlockAsm10B - MOVL $0x00000001, BX - LEAL 16(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX - SUBL $0x08, R11 + MOVL $0x00000001, SI + LEAL 16(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R12 // emitRepeat - LEAL -4(R11), R11 + LEAL -4(R12), R12 JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B long_offset_short_match_nolit_encodeBetterBlockAsm10B: - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B two_byte_offset_short_match_nolit_encodeBetterBlockAsm10B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeBetterBlockAsm10B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeBetterBlockAsm10B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B emit_copy_three_match_nolit_encodeBetterBlockAsm10B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B match_is_repeat_encodeBetterBlockAsm10B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_repeat_encodeBetterBlockAsm10B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_repeat_encodeBetterBlockAsm10B JB three_bytes_match_emit_repeat_encodeBetterBlockAsm10B three_bytes_match_emit_repeat_encodeBetterBlockAsm10B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm10B two_bytes_match_emit_repeat_encodeBetterBlockAsm10B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_repeat_encodeBetterBlockAsm10B JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm10B one_byte_match_emit_repeat_encodeBetterBlockAsm10B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_repeat_encodeBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_33through64 emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B memmove_long_match_emit_repeat_encodeBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm10B - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm10B - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_three_match_nolit_repeat_encodeBetterBlockAsm10B: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_match_nolit_repeat_encodeBetterBlockAsm10B: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B: - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX match_nolit_emitcopy_end_encodeBetterBlockAsm10B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBetterBlockAsm10B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBetterBlockAsm10B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x34, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x36, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x34, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x36, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 16408(SP)(R10*4) - MOVL R13, 16408(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x34, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x36, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x34, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x36, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 16384(AX)(R11*4) + MOVL R14, 16384(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeBetterBlockAsm10B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeBetterBlockAsm10B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x34, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x34, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x34, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeBetterBlockAsm10B emit_remainder_encodeBetterBlockAsm10B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBetterBlockAsm10B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm10B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBetterBlockAsm10B @@ -9721,26 +9730,26 @@ emit_remainder_ok_encodeBetterBlockAsm10B: JB three_bytes_emit_remainder_encodeBetterBlockAsm10B three_bytes_emit_remainder_encodeBetterBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm10B two_bytes_emit_remainder_encodeBetterBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBetterBlockAsm10B JMP memmove_long_emit_remainder_encodeBetterBlockAsm10B one_byte_emit_remainder_encodeBetterBlockAsm10B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBetterBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -9756,73 +9765,73 @@ memmove_emit_remainder_encodeBetterBlockAsm10B: JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm10B memmove_long_emit_remainder_encodeBetterBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back: MOVOU (SI), X4 @@ -9836,742 +9845,743 @@ emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBetterBlockAsm10B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeBetterBlockAsm8B(dst []byte, src []byte) int +// func encodeBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int // Requires: BMI, SSE2 -TEXT ·encodeBetterBlockAsm8B(SB), $5144-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000028, CX - LEAQ 24(SP), DX +TEXT ·encodeBetterBlockAsm8B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000028, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeBetterBlockAsm8B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeBetterBlockAsm8B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -6(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -6(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeBetterBlockAsm8B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x04, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x04, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeBetterBlockAsm8B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x38, R10 - MOVL 24(SP)(R9*4), BX - MOVL 4120(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 4120(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x38, R11 + MOVL (AX)(R10*4), SI + MOVL 4096(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 4096(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeBetterBlockAsm8B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeBetterBlockAsm8B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeBetterBlockAsm8B no_short_found_encodeBetterBlockAsm8B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeBetterBlockAsm8B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeBetterBlockAsm8B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeBetterBlockAsm8B candidateS_match_encodeBetterBlockAsm8B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeBetterBlockAsm8B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeBetterBlockAsm8B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeBetterBlockAsm8B match_extend_back_loop_encodeBetterBlockAsm8B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeBetterBlockAsm8B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeBetterBlockAsm8B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeBetterBlockAsm8B JMP match_extend_back_loop_encodeBetterBlockAsm8B match_extend_back_end_encodeBetterBlockAsm8B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeBetterBlockAsm8B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeBetterBlockAsm8B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeBetterBlockAsm8B matchlen_match8_match_nolit_encodeBetterBlockAsm8B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeBetterBlockAsm8B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeBetterBlockAsm8B matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeBetterBlockAsm8B matchlen_match4_match_nolit_encodeBetterBlockAsm8B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeBetterBlockAsm8B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeBetterBlockAsm8B - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeBetterBlockAsm8B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeBetterBlockAsm8B JB match_nolit_end_encodeBetterBlockAsm8B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeBetterBlockAsm8B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeBetterBlockAsm8B matchlen_match1_match_nolit_encodeBetterBlockAsm8B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeBetterBlockAsm8B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeBetterBlockAsm8B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL 16(SP), DI + CMPL 16(SP), R8 JEQ match_is_repeat_encodeBetterBlockAsm8B - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeBetterBlockAsm8B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeBetterBlockAsm8B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeBetterBlockAsm8B JB three_bytes_match_emit_encodeBetterBlockAsm8B three_bytes_match_emit_encodeBetterBlockAsm8B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeBetterBlockAsm8B two_bytes_match_emit_encodeBetterBlockAsm8B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeBetterBlockAsm8B JMP memmove_long_match_emit_encodeBetterBlockAsm8B one_byte_match_emit_encodeBetterBlockAsm8B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeBetterBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x04 + CMPQ R9, $0x04 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4 - CMPQ R8, $0x08 + CMPQ R9, $0x08 JB emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4: - MOVL (R9), R10 - MOVL R10, (AX) + MOVL (R10), R11 + MOVL R11, (CX) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7: - MOVL (R9), R10 - MOVL -4(R9)(R8*1), R9 - MOVL R10, (AX) - MOVL R9, -4(AX)(R8*1) + MOVL (R10), R11 + MOVL -4(R10)(R9*1), R10 + MOVL R11, (CX) + MOVL R10, -4(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeBetterBlockAsm8B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeBetterBlockAsm8B memmove_long_match_emit_encodeBetterBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeBetterBlockAsm8B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm8B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE long_offset_short_match_nolit_encodeBetterBlockAsm8B - MOVL $0x00000001, BX - LEAL 16(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX - SUBL $0x08, R11 + MOVL $0x00000001, SI + LEAL 16(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX + SUBL $0x08, R12 // emitRepeat - LEAL -4(R11), R11 + LEAL -4(R12), R12 JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B long_offset_short_match_nolit_encodeBetterBlockAsm8B: - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B -repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX - JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX +repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short: + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX + JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B two_byte_offset_short_match_nolit_encodeBetterBlockAsm8B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeBetterBlockAsm8B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B emit_copy_three_match_nolit_encodeBetterBlockAsm8B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B match_is_repeat_encodeBetterBlockAsm8B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_match_emit_repeat_encodeBetterBlockAsm8B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_repeat_encodeBetterBlockAsm8B JB three_bytes_match_emit_repeat_encodeBetterBlockAsm8B three_bytes_match_emit_repeat_encodeBetterBlockAsm8B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm8B two_bytes_match_emit_repeat_encodeBetterBlockAsm8B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_repeat_encodeBetterBlockAsm8B JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm8B one_byte_match_emit_repeat_encodeBetterBlockAsm8B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_repeat_encodeBetterBlockAsm8B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x04 + CMPQ R8, $0x04 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4 - CMPQ DI, $0x08 + CMPQ R8, $0x08 JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_33through64 emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4: - MOVL (R8), R9 - MOVL R9, (AX) + MOVL (R9), R10 + MOVL R10, (CX) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7: - MOVL (R8), R9 - MOVL -4(R8)(DI*1), R8 - MOVL R9, (AX) - MOVL R8, -4(AX)(DI*1) + MOVL (R9), R10 + MOVL -4(R9)(R8*1), R9 + MOVL R10, (CX) + MOVL R9, -4(CX)(R8*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B memmove_long_match_emit_repeat_encodeBetterBlockAsm8B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R12 - SUBQ R9, R12 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R13 + SUBQ R10, R13 + DECQ R11 JA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(R8)(R12*1), R9 - LEAQ -32(AX)(R12*1), R13 + LEAQ -32(R9)(R13*1), R10 + LEAQ -32(CX)(R13*1), R14 emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R13) - MOVOA X5, 16(R13) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R14) + MOVOA X5, 16(R14) + ADDQ $0x20, R14 + ADDQ $0x20, R10 ADDQ $0x20, R13 - ADDQ $0x20, R9 - ADDQ $0x20, R12 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(R8)(R12*1), X4 - MOVOU -16(R8)(R12*1), X5 - MOVOA X4, -32(AX)(R12*1) - MOVOA X5, -16(AX)(R12*1) - ADDQ $0x20, R12 - CMPQ DI, R12 + MOVOU -32(R9)(R13*1), X4 + MOVOU -16(R9)(R13*1), X5 + MOVOA X4, -32(CX)(R13*1) + MOVOA X5, -16(CX)(R13*1) + ADDQ $0x20, R13 + CMPQ R8, R13 JAE emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitRepeat - MOVL R11, BX - LEAL -4(R11), R11 - CMPL BX, $0x08 + MOVL R12, SI + LEAL -4(R12), R12 + CMPL SI, $0x08 JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm8B - CMPL BX, $0x0c + CMPL SI, $0x0c JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B: - CMPL R11, $0x00000104 + CMPL R12, $0x00000104 JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm8B - LEAL -256(R11), R11 - MOVW $0x0019, (AX) - MOVW R11, 2(AX) - ADDQ $0x04, AX + LEAL -256(R12), R12 + MOVW $0x0019, (CX) + MOVW R12, 2(CX) + ADDQ $0x04, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B repeat_three_match_nolit_repeat_encodeBetterBlockAsm8B: - LEAL -4(R11), R11 - MOVW $0x0015, (AX) - MOVB R11, 2(AX) - ADDQ $0x03, AX + LEAL -4(R12), R12 + MOVW $0x0015, (CX) + MOVB R12, 2(CX) + ADDQ $0x03, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B repeat_two_match_nolit_repeat_encodeBetterBlockAsm8B: - SHLL $0x02, R11 - ORL $0x01, R11 - MOVW R11, (AX) - ADDQ $0x02, AX + SHLL $0x02, R12 + ORL $0x01, R12 + MOVW R12, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B - XORQ BX, BX - LEAL 1(BX)(R11*4), R11 - MOVB DI, 1(AX) - SARL $0x08, DI - SHLL $0x05, DI - ORL DI, R11 - MOVB R11, (AX) - ADDQ $0x02, AX + XORQ SI, SI + LEAL 1(SI)(R12*4), R12 + MOVB R8, 1(CX) + SARL $0x08, R8 + SHLL $0x05, R8 + ORL R8, R12 + MOVB R12, (CX) + ADDQ $0x02, CX match_nolit_emitcopy_end_encodeBetterBlockAsm8B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeBetterBlockAsm8B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeBetterBlockAsm8B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x36, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x38, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x36, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x38, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 4120(SP)(R10*4) - MOVL R13, 4120(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x36, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x38, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x36, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x38, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 4096(AX)(R11*4) + MOVL R14, 4096(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeBetterBlockAsm8B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeBetterBlockAsm8B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x36, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x36, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x36, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeBetterBlockAsm8B emit_remainder_encodeBetterBlockAsm8B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeBetterBlockAsm8B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm8B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeBetterBlockAsm8B @@ -10580,26 +10590,26 @@ emit_remainder_ok_encodeBetterBlockAsm8B: JB three_bytes_emit_remainder_encodeBetterBlockAsm8B three_bytes_emit_remainder_encodeBetterBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeBetterBlockAsm8B two_bytes_emit_remainder_encodeBetterBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeBetterBlockAsm8B JMP memmove_long_emit_remainder_encodeBetterBlockAsm8B one_byte_emit_remainder_encodeBetterBlockAsm8B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeBetterBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -10615,73 +10625,73 @@ memmove_emit_remainder_encodeBetterBlockAsm8B: JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm8B memmove_long_emit_remainder_encodeBetterBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back: MOVOU (SI), X4 @@ -10695,798 +10705,799 @@ emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeBetterBlockAsm8B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBlockAsm(dst []byte, src []byte) int +// func encodeSnappyBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBlockAsm(SB), $65560-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000200, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBlockAsm(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBlockAsm: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBlockAsm MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBlockAsm: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x10, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x10, R11 + IMULQ R9, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeSnappyBlockAsm - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_encodeSnappyBlockAsm repeat_extend_back_loop_encodeSnappyBlockAsm: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_encodeSnappyBlockAsm - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeSnappyBlockAsm - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_encodeSnappyBlockAsm repeat_extend_back_end_encodeSnappyBlockAsm: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 5(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 5(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeSnappyBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeSnappyBlockAsm: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeSnappyBlockAsm - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeSnappyBlockAsm - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_repeat_emit_encodeSnappyBlockAsm - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_repeat_emit_encodeSnappyBlockAsm - MOVB $0xfc, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm four_bytes_repeat_emit_encodeSnappyBlockAsm: - MOVL BX, R9 - SHRL $0x10, R9 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R9, 3(AX) - ADDQ $0x04, AX + MOVL SI, R10 + SHRL $0x10, R10 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R10, 3(CX) + ADDQ $0x04, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm three_bytes_repeat_emit_encodeSnappyBlockAsm: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm two_bytes_repeat_emit_encodeSnappyBlockAsm: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeSnappyBlockAsm JMP memmove_long_repeat_emit_encodeSnappyBlockAsm one_byte_repeat_emit_encodeSnappyBlockAsm: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeSnappyBlockAsm: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x08 + CMPQ R8, $0x08 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8: - MOVQ (R8), R9 - MOVQ R9, (AX) + MOVQ (R9), R10 + MOVQ R10, (CX) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_repeat_emit_encodeSnappyBlockAsm: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm memmove_long_repeat_emit_encodeSnappyBlockAsm: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(R8)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(R9)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(R8)(R11*1), X4 - MOVOU -16(R8)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ DI, R11 + MOVOU -32(R9)(R12*1), X4 + MOVOU -16(R9)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R8, R12 JAE emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeSnappyBlockAsm: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm matchlen_match8_repeat_extend_encodeSnappyBlockAsm: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm matchlen_match4_repeat_extend_encodeSnappyBlockAsm: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_encodeSnappyBlockAsm: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm JB repeat_extend_forward_end_encodeSnappyBlockAsm - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_encodeSnappyBlockAsm matchlen_match1_repeat_extend_encodeSnappyBlockAsm: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_encodeSnappyBlockAsm - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_encodeSnappyBlockAsm: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy - CMPL SI, $0x00010000 + CMPL DI, $0x00010000 JB two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm four_bytes_loop_back_repeat_as_copy_encodeSnappyBlockAsm: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm - MOVB $0xff, (AX) - MOVL SI, 1(AX) - LEAL -64(BX), BX - ADDQ $0x05, AX - CMPL BX, $0x04 + MOVB $0xff, (CX) + MOVL DI, 1(CX) + LEAL -64(SI), SI + ADDQ $0x05, CX + CMPL SI, $0x04 JB four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm JMP four_bytes_loop_back_repeat_as_copy_encodeSnappyBlockAsm four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm: - TESTL BX, BX + TESTL SI, SI JZ repeat_end_emit_encodeSnappyBlockAsm - XORL DI, DI - LEAL -1(DI)(BX*4), BX - MOVB BL, (AX) - MOVL SI, 1(AX) - ADDQ $0x05, AX + XORL R8, R8 + LEAL -1(R8)(SI*4), SI + MOVB SI, (CX) + MOVL DI, 1(CX) + ADDQ $0x05, CX JMP repeat_end_emit_encodeSnappyBlockAsm two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeSnappyBlockAsm emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeSnappyBlockAsm: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeSnappyBlockAsm no_repeat_found_encodeSnappyBlockAsm: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBlockAsm - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeSnappyBlockAsm - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeSnappyBlockAsm - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBlockAsm candidate3_match_encodeSnappyBlockAsm: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeSnappyBlockAsm candidate2_match_encodeSnappyBlockAsm: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeSnappyBlockAsm: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBlockAsm match_extend_back_loop_encodeSnappyBlockAsm: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBlockAsm - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBlockAsm - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBlockAsm JMP match_extend_back_loop_encodeSnappyBlockAsm match_extend_back_end_encodeSnappyBlockAsm: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 5(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 5(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBlockAsm: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeSnappyBlockAsm - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeSnappyBlockAsm - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB three_bytes_match_emit_encodeSnappyBlockAsm - CMPL DI, $0x01000000 + CMPL R8, $0x01000000 JB four_bytes_match_emit_encodeSnappyBlockAsm - MOVB $0xfc, (AX) - MOVL DI, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL R8, 1(CX) + ADDQ $0x05, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm four_bytes_match_emit_encodeSnappyBlockAsm: - MOVL DI, R9 - SHRL $0x10, R9 - MOVB $0xf8, (AX) - MOVW DI, 1(AX) - MOVB R9, 3(AX) - ADDQ $0x04, AX + MOVL R8, R10 + SHRL $0x10, R10 + MOVB $0xf8, (CX) + MOVW R8, 1(CX) + MOVB R10, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm three_bytes_match_emit_encodeSnappyBlockAsm: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm two_bytes_match_emit_encodeSnappyBlockAsm: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeSnappyBlockAsm JMP memmove_long_match_emit_encodeSnappyBlockAsm one_byte_match_emit_encodeSnappyBlockAsm: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBlockAsm: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBlockAsm: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeSnappyBlockAsm memmove_long_match_emit_encodeSnappyBlockAsm: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeSnappyBlockAsm: match_nolit_loop_encodeSnappyBlockAsm: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBlockAsm - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm matchlen_bsf_16match_nolit_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm matchlen_match8_match_nolit_encodeSnappyBlockAsm: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm matchlen_match4_match_nolit_encodeSnappyBlockAsm: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeSnappyBlockAsm: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBlockAsm JB match_nolit_end_encodeSnappyBlockAsm - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeSnappyBlockAsm matchlen_match1_match_nolit_encodeSnappyBlockAsm: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeSnappyBlockAsm - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeSnappyBlockAsm: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB two_byte_offset_match_nolit_encodeSnappyBlockAsm four_bytes_loop_back_match_nolit_encodeSnappyBlockAsm: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE four_bytes_remain_match_nolit_encodeSnappyBlockAsm - MOVB $0xff, (AX) - MOVL BX, 1(AX) - LEAL -64(R9), R9 - ADDQ $0x05, AX - CMPL R9, $0x04 + MOVB $0xff, (CX) + MOVL SI, 1(CX) + LEAL -64(R10), R10 + ADDQ $0x05, CX + CMPL R10, $0x04 JB four_bytes_remain_match_nolit_encodeSnappyBlockAsm JMP four_bytes_loop_back_match_nolit_encodeSnappyBlockAsm four_bytes_remain_match_nolit_encodeSnappyBlockAsm: - TESTL R9, R9 + TESTL R10, R10 JZ match_nolit_emitcopy_end_encodeSnappyBlockAsm - XORL SI, SI - LEAL -1(SI)(R9*4), R9 - MOVB R9, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + XORL DI, DI + LEAL -1(DI)(R10*4), R10 + MOVB R10, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm two_byte_offset_match_nolit_encodeSnappyBlockAsm: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm two_byte_offset_short_match_nolit_encodeSnappyBlockAsm: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm emit_copy_three_match_nolit_encodeSnappyBlockAsm: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBlockAsm: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBlockAsm: - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x10, DI - IMULQ R8, DI - SHRQ $0x32, DI - SHLQ $0x10, BX - IMULQ R8, BX - SHRQ $0x32, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x10, R8 + IMULQ R9, R8 + SHRQ $0x32, R8 + SHLQ $0x10, SI + IMULQ R9, SI + SHRQ $0x32, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeSnappyBlockAsm - INCL CX + INCL DX JMP search_loop_encodeSnappyBlockAsm emit_remainder_encodeSnappyBlockAsm: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 5(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 5(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBlockAsm: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBlockAsm @@ -11496,41 +11507,41 @@ emit_remainder_ok_encodeSnappyBlockAsm: JB three_bytes_emit_remainder_encodeSnappyBlockAsm CMPL DX, $0x01000000 JB four_bytes_emit_remainder_encodeSnappyBlockAsm - MOVB $0xfc, (AX) - MOVL DX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL DX, 1(CX) + ADDQ $0x05, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm four_bytes_emit_remainder_encodeSnappyBlockAsm: MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm three_bytes_emit_remainder_encodeSnappyBlockAsm: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm two_bytes_emit_remainder_encodeSnappyBlockAsm: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBlockAsm JMP memmove_long_emit_remainder_encodeSnappyBlockAsm one_byte_emit_remainder_encodeSnappyBlockAsm: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -11546,73 +11557,73 @@ memmove_emit_remainder_encodeSnappyBlockAsm: JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBlockAsm: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm memmove_long_emit_remainder_encodeSnappyBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back: MOVOU (SI), X4 @@ -11626,718 +11637,719 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBlockAsm: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBlockAsm64K(dst []byte, src []byte) int +// func encodeSnappyBlockAsm64K(dst []byte, src []byte, tmp *[65536]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBlockAsm64K(SB), $65560-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000200, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBlockAsm64K(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBlockAsm64K: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBlockAsm64K MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBlockAsm64K: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm64K - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x10, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x10, R11 + IMULQ R9, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeSnappyBlockAsm64K - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_encodeSnappyBlockAsm64K repeat_extend_back_loop_encodeSnappyBlockAsm64K: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_encodeSnappyBlockAsm64K - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeSnappyBlockAsm64K - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_encodeSnappyBlockAsm64K repeat_extend_back_end_encodeSnappyBlockAsm64K: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeSnappyBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeSnappyBlockAsm64K: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeSnappyBlockAsm64K - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeSnappyBlockAsm64K JB three_bytes_repeat_emit_encodeSnappyBlockAsm64K three_bytes_repeat_emit_encodeSnappyBlockAsm64K: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm64K two_bytes_repeat_emit_encodeSnappyBlockAsm64K: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeSnappyBlockAsm64K JMP memmove_long_repeat_emit_encodeSnappyBlockAsm64K one_byte_repeat_emit_encodeSnappyBlockAsm64K: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeSnappyBlockAsm64K: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x08 + CMPQ R8, $0x08 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8: - MOVQ (R8), R9 - MOVQ R9, (AX) + MOVQ (R9), R10 + MOVQ R10, (CX) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K memmove_long_repeat_emit_encodeSnappyBlockAsm64K: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - LEAQ -32(R8)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(R9)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32: - MOVOU -32(R8)(R11*1), X4 - MOVOU -16(R8)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ DI, R11 + MOVOU -32(R9)(R12*1), X4 + MOVOU -16(R9)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R8, R12 JAE emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K JB repeat_extend_forward_end_encodeSnappyBlockAsm64K - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_encodeSnappyBlockAsm64K matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_encodeSnappyBlockAsm64K - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_encodeSnappyBlockAsm64K: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm64K: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm64K - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm64K two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm64K: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeSnappyBlockAsm64K emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeSnappyBlockAsm64K: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeSnappyBlockAsm64K no_repeat_found_encodeSnappyBlockAsm64K: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBlockAsm64K - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeSnappyBlockAsm64K - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeSnappyBlockAsm64K - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBlockAsm64K candidate3_match_encodeSnappyBlockAsm64K: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeSnappyBlockAsm64K candidate2_match_encodeSnappyBlockAsm64K: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeSnappyBlockAsm64K: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBlockAsm64K match_extend_back_loop_encodeSnappyBlockAsm64K: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBlockAsm64K - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBlockAsm64K - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBlockAsm64K JMP match_extend_back_loop_encodeSnappyBlockAsm64K match_extend_back_end_encodeSnappyBlockAsm64K: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBlockAsm64K: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm64K - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeSnappyBlockAsm64K - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeSnappyBlockAsm64K JB three_bytes_match_emit_encodeSnappyBlockAsm64K three_bytes_match_emit_encodeSnappyBlockAsm64K: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm64K two_bytes_match_emit_encodeSnappyBlockAsm64K: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeSnappyBlockAsm64K JMP memmove_long_match_emit_encodeSnappyBlockAsm64K one_byte_match_emit_encodeSnappyBlockAsm64K: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBlockAsm64K: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBlockAsm64K: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeSnappyBlockAsm64K memmove_long_match_emit_encodeSnappyBlockAsm64K: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeSnappyBlockAsm64K: match_nolit_loop_encodeSnappyBlockAsm64K: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBlockAsm64K - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm64K matchlen_match8_match_nolit_encodeSnappyBlockAsm64K: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm64K - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm64K matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm64K matchlen_match4_match_nolit_encodeSnappyBlockAsm64K: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm64K - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm64K - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeSnappyBlockAsm64K: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBlockAsm64K JB match_nolit_end_encodeSnappyBlockAsm64K - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm64K - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeSnappyBlockAsm64K matchlen_match1_match_nolit_encodeSnappyBlockAsm64K: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeSnappyBlockAsm64K - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeSnappyBlockAsm64K: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBlockAsm64K: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm64K - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm64K two_byte_offset_short_match_nolit_encodeSnappyBlockAsm64K: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm64K - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm64K - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm64K emit_copy_three_match_nolit_encodeSnappyBlockAsm64K: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBlockAsm64K: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm64K - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBlockAsm64K: - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x10, DI - IMULQ R8, DI - SHRQ $0x32, DI - SHLQ $0x10, BX - IMULQ R8, BX - SHRQ $0x32, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x10, R8 + IMULQ R9, R8 + SHRQ $0x32, R8 + SHLQ $0x10, SI + IMULQ R9, SI + SHRQ $0x32, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeSnappyBlockAsm64K - INCL CX + INCL DX JMP search_loop_encodeSnappyBlockAsm64K emit_remainder_encodeSnappyBlockAsm64K: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBlockAsm64K: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBlockAsm64K @@ -12346,26 +12358,26 @@ emit_remainder_ok_encodeSnappyBlockAsm64K: JB three_bytes_emit_remainder_encodeSnappyBlockAsm64K three_bytes_emit_remainder_encodeSnappyBlockAsm64K: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm64K two_bytes_emit_remainder_encodeSnappyBlockAsm64K: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBlockAsm64K JMP memmove_long_emit_remainder_encodeSnappyBlockAsm64K one_byte_emit_remainder_encodeSnappyBlockAsm64K: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBlockAsm64K: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -12381,73 +12393,73 @@ memmove_emit_remainder_encodeSnappyBlockAsm64K: JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K -emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) +emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_4through7: + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K memmove_long_emit_remainder_encodeSnappyBlockAsm64K: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back: MOVOU (SI), X4 @@ -12461,718 +12473,719 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBlockAsm12B(dst []byte, src []byte) int +// func encodeSnappyBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBlockAsm12B(SB), $16408-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000080, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBlockAsm12B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000080, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBlockAsm12B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBlockAsm12B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBlockAsm12B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm12B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x000000cf1bbcdcbb, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x18, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x000000cf1bbcdcbb, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x18, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x34, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x18, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x18, R11 + IMULQ R9, R11 + SHRQ $0x34, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x18, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeSnappyBlockAsm12B - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_encodeSnappyBlockAsm12B repeat_extend_back_loop_encodeSnappyBlockAsm12B: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_encodeSnappyBlockAsm12B - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeSnappyBlockAsm12B - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_encodeSnappyBlockAsm12B repeat_extend_back_end_encodeSnappyBlockAsm12B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeSnappyBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeSnappyBlockAsm12B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeSnappyBlockAsm12B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeSnappyBlockAsm12B JB three_bytes_repeat_emit_encodeSnappyBlockAsm12B three_bytes_repeat_emit_encodeSnappyBlockAsm12B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm12B two_bytes_repeat_emit_encodeSnappyBlockAsm12B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeSnappyBlockAsm12B JMP memmove_long_repeat_emit_encodeSnappyBlockAsm12B one_byte_repeat_emit_encodeSnappyBlockAsm12B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeSnappyBlockAsm12B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x08 + CMPQ R8, $0x08 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8: - MOVQ (R8), R9 - MOVQ R9, (AX) + MOVQ (R9), R10 + MOVQ R10, (CX) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B memmove_long_repeat_emit_encodeSnappyBlockAsm12B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(R8)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(R9)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(R8)(R11*1), X4 - MOVOU -16(R8)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ DI, R11 + MOVOU -32(R9)(R12*1), X4 + MOVOU -16(R9)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R8, R12 JAE emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B JB repeat_extend_forward_end_encodeSnappyBlockAsm12B - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_encodeSnappyBlockAsm12B matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_encodeSnappyBlockAsm12B - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_encodeSnappyBlockAsm12B: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm12B: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm12B - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm12B two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm12B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeSnappyBlockAsm12B emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeSnappyBlockAsm12B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeSnappyBlockAsm12B no_repeat_found_encodeSnappyBlockAsm12B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBlockAsm12B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeSnappyBlockAsm12B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeSnappyBlockAsm12B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBlockAsm12B candidate3_match_encodeSnappyBlockAsm12B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeSnappyBlockAsm12B candidate2_match_encodeSnappyBlockAsm12B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeSnappyBlockAsm12B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBlockAsm12B match_extend_back_loop_encodeSnappyBlockAsm12B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBlockAsm12B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBlockAsm12B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBlockAsm12B JMP match_extend_back_loop_encodeSnappyBlockAsm12B match_extend_back_end_encodeSnappyBlockAsm12B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBlockAsm12B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeSnappyBlockAsm12B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeSnappyBlockAsm12B JB three_bytes_match_emit_encodeSnappyBlockAsm12B three_bytes_match_emit_encodeSnappyBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm12B two_bytes_match_emit_encodeSnappyBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeSnappyBlockAsm12B JMP memmove_long_match_emit_encodeSnappyBlockAsm12B one_byte_match_emit_encodeSnappyBlockAsm12B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBlockAsm12B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBlockAsm12B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeSnappyBlockAsm12B memmove_long_match_emit_encodeSnappyBlockAsm12B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeSnappyBlockAsm12B: match_nolit_loop_encodeSnappyBlockAsm12B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBlockAsm12B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm12B matchlen_match8_match_nolit_encodeSnappyBlockAsm12B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm12B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm12B matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm12B matchlen_match4_match_nolit_encodeSnappyBlockAsm12B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm12B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm12B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeSnappyBlockAsm12B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBlockAsm12B JB match_nolit_end_encodeSnappyBlockAsm12B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm12B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeSnappyBlockAsm12B matchlen_match1_match_nolit_encodeSnappyBlockAsm12B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeSnappyBlockAsm12B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeSnappyBlockAsm12B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBlockAsm12B: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm12B - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm12B two_byte_offset_short_match_nolit_encodeSnappyBlockAsm12B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm12B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm12B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm12B emit_copy_three_match_nolit_encodeSnappyBlockAsm12B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBlockAsm12B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm12B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBlockAsm12B: - MOVQ $0x000000cf1bbcdcbb, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x18, DI - IMULQ R8, DI - SHRQ $0x34, DI - SHLQ $0x18, BX - IMULQ R8, BX - SHRQ $0x34, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x000000cf1bbcdcbb, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x18, R8 + IMULQ R9, R8 + SHRQ $0x34, R8 + SHLQ $0x18, SI + IMULQ R9, SI + SHRQ $0x34, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeSnappyBlockAsm12B - INCL CX + INCL DX JMP search_loop_encodeSnappyBlockAsm12B emit_remainder_encodeSnappyBlockAsm12B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBlockAsm12B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBlockAsm12B @@ -13181,26 +13194,26 @@ emit_remainder_ok_encodeSnappyBlockAsm12B: JB three_bytes_emit_remainder_encodeSnappyBlockAsm12B three_bytes_emit_remainder_encodeSnappyBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm12B two_bytes_emit_remainder_encodeSnappyBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBlockAsm12B JMP memmove_long_emit_remainder_encodeSnappyBlockAsm12B one_byte_emit_remainder_encodeSnappyBlockAsm12B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -13216,73 +13229,73 @@ memmove_emit_remainder_encodeSnappyBlockAsm12B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B memmove_long_emit_remainder_encodeSnappyBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back: MOVOU (SI), X4 @@ -13296,718 +13309,719 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBlockAsm10B(dst []byte, src []byte) int +// func encodeSnappyBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBlockAsm10B(SB), $4120-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000020, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBlockAsm10B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000020, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBlockAsm10B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBlockAsm10B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBlockAsm10B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm10B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x9e3779b1, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x9e3779b1, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x20, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x36, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x20, R11 + IMULQ R9, R11 + SHRQ $0x36, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x20, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeSnappyBlockAsm10B - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_encodeSnappyBlockAsm10B repeat_extend_back_loop_encodeSnappyBlockAsm10B: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_encodeSnappyBlockAsm10B - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeSnappyBlockAsm10B - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_encodeSnappyBlockAsm10B repeat_extend_back_end_encodeSnappyBlockAsm10B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeSnappyBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeSnappyBlockAsm10B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeSnappyBlockAsm10B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeSnappyBlockAsm10B JB three_bytes_repeat_emit_encodeSnappyBlockAsm10B three_bytes_repeat_emit_encodeSnappyBlockAsm10B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm10B two_bytes_repeat_emit_encodeSnappyBlockAsm10B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeSnappyBlockAsm10B JMP memmove_long_repeat_emit_encodeSnappyBlockAsm10B one_byte_repeat_emit_encodeSnappyBlockAsm10B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeSnappyBlockAsm10B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x08 + CMPQ R8, $0x08 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8: - MOVQ (R8), R9 - MOVQ R9, (AX) + MOVQ (R9), R10 + MOVQ R10, (CX) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B memmove_long_repeat_emit_encodeSnappyBlockAsm10B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(R8)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(R9)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(R8)(R11*1), X4 - MOVOU -16(R8)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ DI, R11 + MOVOU -32(R9)(R12*1), X4 + MOVOU -16(R9)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R8, R12 JAE emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B JB repeat_extend_forward_end_encodeSnappyBlockAsm10B - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_encodeSnappyBlockAsm10B matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_encodeSnappyBlockAsm10B - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_encodeSnappyBlockAsm10B: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm10B: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm10B - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm10B two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm10B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeSnappyBlockAsm10B emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeSnappyBlockAsm10B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeSnappyBlockAsm10B no_repeat_found_encodeSnappyBlockAsm10B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBlockAsm10B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeSnappyBlockAsm10B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeSnappyBlockAsm10B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBlockAsm10B candidate3_match_encodeSnappyBlockAsm10B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeSnappyBlockAsm10B candidate2_match_encodeSnappyBlockAsm10B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeSnappyBlockAsm10B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBlockAsm10B match_extend_back_loop_encodeSnappyBlockAsm10B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBlockAsm10B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBlockAsm10B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBlockAsm10B JMP match_extend_back_loop_encodeSnappyBlockAsm10B match_extend_back_end_encodeSnappyBlockAsm10B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBlockAsm10B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeSnappyBlockAsm10B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeSnappyBlockAsm10B JB three_bytes_match_emit_encodeSnappyBlockAsm10B three_bytes_match_emit_encodeSnappyBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm10B two_bytes_match_emit_encodeSnappyBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeSnappyBlockAsm10B JMP memmove_long_match_emit_encodeSnappyBlockAsm10B one_byte_match_emit_encodeSnappyBlockAsm10B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBlockAsm10B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBlockAsm10B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeSnappyBlockAsm10B memmove_long_match_emit_encodeSnappyBlockAsm10B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeSnappyBlockAsm10B: match_nolit_loop_encodeSnappyBlockAsm10B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBlockAsm10B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm10B matchlen_match8_match_nolit_encodeSnappyBlockAsm10B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm10B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm10B matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm10B matchlen_match4_match_nolit_encodeSnappyBlockAsm10B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm10B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm10B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeSnappyBlockAsm10B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBlockAsm10B JB match_nolit_end_encodeSnappyBlockAsm10B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm10B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeSnappyBlockAsm10B matchlen_match1_match_nolit_encodeSnappyBlockAsm10B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeSnappyBlockAsm10B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeSnappyBlockAsm10B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBlockAsm10B: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm10B - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm10B two_byte_offset_short_match_nolit_encodeSnappyBlockAsm10B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm10B - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm10B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm10B emit_copy_three_match_nolit_encodeSnappyBlockAsm10B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBlockAsm10B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm10B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBlockAsm10B: - MOVQ $0x9e3779b1, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x20, DI - IMULQ R8, DI - SHRQ $0x36, DI - SHLQ $0x20, BX - IMULQ R8, BX - SHRQ $0x36, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x9e3779b1, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x20, R8 + IMULQ R9, R8 + SHRQ $0x36, R8 + SHLQ $0x20, SI + IMULQ R9, SI + SHRQ $0x36, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeSnappyBlockAsm10B - INCL CX + INCL DX JMP search_loop_encodeSnappyBlockAsm10B emit_remainder_encodeSnappyBlockAsm10B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBlockAsm10B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBlockAsm10B @@ -14016,26 +14030,26 @@ emit_remainder_ok_encodeSnappyBlockAsm10B: JB three_bytes_emit_remainder_encodeSnappyBlockAsm10B three_bytes_emit_remainder_encodeSnappyBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm10B two_bytes_emit_remainder_encodeSnappyBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBlockAsm10B JMP memmove_long_emit_remainder_encodeSnappyBlockAsm10B one_byte_emit_remainder_encodeSnappyBlockAsm10B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -14051,73 +14065,73 @@ memmove_emit_remainder_encodeSnappyBlockAsm10B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B memmove_long_emit_remainder_encodeSnappyBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back: MOVOU (SI), X4 @@ -14131,714 +14145,715 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBlockAsm8B(dst []byte, src []byte) int +// func encodeSnappyBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBlockAsm8B(SB), $1048-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000008, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBlockAsm8B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000008, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBlockAsm8B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBlockAsm8B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBlockAsm8B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x04, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x04, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm8B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x9e3779b1, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x38, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x9e3779b1, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x20, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x38, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x38, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x20, R11 + IMULQ R9, R11 + SHRQ $0x38, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x20, R10 + IMULQ R9, R10 + SHRQ $0x38, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_encodeSnappyBlockAsm8B - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_encodeSnappyBlockAsm8B repeat_extend_back_loop_encodeSnappyBlockAsm8B: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_encodeSnappyBlockAsm8B - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_encodeSnappyBlockAsm8B - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_encodeSnappyBlockAsm8B repeat_extend_back_end_encodeSnappyBlockAsm8B: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_encodeSnappyBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET repeat_dst_size_check_encodeSnappyBlockAsm8B: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_encodeSnappyBlockAsm8B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_encodeSnappyBlockAsm8B JB three_bytes_repeat_emit_encodeSnappyBlockAsm8B three_bytes_repeat_emit_encodeSnappyBlockAsm8B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_repeat_emit_encodeSnappyBlockAsm8B two_bytes_repeat_emit_encodeSnappyBlockAsm8B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_encodeSnappyBlockAsm8B JMP memmove_long_repeat_emit_encodeSnappyBlockAsm8B one_byte_repeat_emit_encodeSnappyBlockAsm8B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_repeat_emit_encodeSnappyBlockAsm8B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveShort - CMPQ DI, $0x08 + CMPQ R8, $0x08 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8 - CMPQ DI, $0x10 + CMPQ R8, $0x10 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16 - CMPQ DI, $0x20 + CMPQ R8, $0x20 JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_33through64 emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8: - MOVQ (R8), R9 - MOVQ R9, (AX) + MOVQ (R9), R10 + MOVQ R10, (CX) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16: - MOVQ (R8), R9 - MOVQ -8(R8)(DI*1), R8 - MOVQ R9, (AX) - MOVQ R8, -8(AX)(DI*1) + MOVQ (R9), R10 + MOVQ -8(R9)(R8*1), R9 + MOVQ R10, (CX) + MOVQ R9, -8(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_17through32: - MOVOU (R8), X0 - MOVOU -16(R8)(DI*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU -16(R9)(R8*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R8*1) JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_33through64: - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B memmove_long_repeat_emit_encodeSnappyBlockAsm8B: - LEAQ (AX)(DI*1), BX + LEAQ (CX)(R8*1), SI // genMemMoveLong - MOVOU (R8), X0 - MOVOU 16(R8), X1 - MOVOU -32(R8)(DI*1), X2 - MOVOU -16(R8)(DI*1), X3 - MOVQ DI, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (R9), X0 + MOVOU 16(R9), X1 + MOVOU -32(R9)(R8*1), X2 + MOVOU -16(R9)(R8*1), X3 + MOVQ R8, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(R8)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(R9)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(R8)(R11*1), X4 - MOVOU -16(R8)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ DI, R11 + MOVOU -32(R9)(R12*1), X4 + MOVOU -16(R9)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R8, R12 JAE emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(DI*1) - MOVOU X3, -16(AX)(DI*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R8*1) + MOVOU X3, -16(CX)(R8*1) + MOVQ SI, CX emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B JB repeat_extend_forward_end_encodeSnappyBlockAsm8B - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_encodeSnappyBlockAsm8B matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_encodeSnappyBlockAsm8B - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_encodeSnappyBlockAsm8B: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm8B: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm8B - MOVB $0xee, (AX) - MOVW SI, 1(AX) - LEAL -60(BX), BX - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW DI, 1(CX) + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm8B two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm8B: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm8B - LEAL -15(DI), DI - MOVB SI, 1(AX) - SHRL $0x08, SI - SHLL $0x05, SI - ORL SI, DI - MOVB DI, (AX) - ADDQ $0x02, AX + LEAL -15(R8), R8 + MOVB DI, 1(CX) + SHRL $0x08, DI + SHLL $0x05, DI + ORL DI, R8 + MOVB R8, (CX) + ADDQ $0x02, CX JMP repeat_end_emit_encodeSnappyBlockAsm8B emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm8B: - LEAL -2(DI), DI - MOVB DI, (AX) - MOVW SI, 1(AX) - ADDQ $0x03, AX + LEAL -2(R8), R8 + MOVB R8, (CX) + MOVW DI, 1(CX) + ADDQ $0x03, CX repeat_end_emit_encodeSnappyBlockAsm8B: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_encodeSnappyBlockAsm8B no_repeat_found_encodeSnappyBlockAsm8B: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBlockAsm8B - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_encodeSnappyBlockAsm8B - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_encodeSnappyBlockAsm8B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBlockAsm8B candidate3_match_encodeSnappyBlockAsm8B: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_encodeSnappyBlockAsm8B candidate2_match_encodeSnappyBlockAsm8B: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_encodeSnappyBlockAsm8B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBlockAsm8B match_extend_back_loop_encodeSnappyBlockAsm8B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBlockAsm8B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBlockAsm8B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBlockAsm8B JMP match_extend_back_loop_encodeSnappyBlockAsm8B match_extend_back_end_encodeSnappyBlockAsm8B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBlockAsm8B: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm8B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), DI - CMPL DI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), R8 + CMPL R8, $0x3c JB one_byte_match_emit_encodeSnappyBlockAsm8B - CMPL DI, $0x00000100 + CMPL R8, $0x00000100 JB two_bytes_match_emit_encodeSnappyBlockAsm8B JB three_bytes_match_emit_encodeSnappyBlockAsm8B three_bytes_match_emit_encodeSnappyBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBlockAsm8B two_bytes_match_emit_encodeSnappyBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DI, 1(AX) - ADDQ $0x02, AX - CMPL DI, $0x40 + MOVB $0xf0, (CX) + MOVB R8, 1(CX) + ADDQ $0x02, CX + CMPL R8, $0x40 JB memmove_match_emit_encodeSnappyBlockAsm8B JMP memmove_long_match_emit_encodeSnappyBlockAsm8B one_byte_match_emit_encodeSnappyBlockAsm8B: - SHLB $0x02, DI - MOVB DI, (AX) - ADDQ $0x01, AX + SHLB $0x02, R8 + MOVB R8, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBlockAsm8B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8: - MOVQ (SI), R9 - MOVQ R9, (AX) + MOVQ (DI), R10 + MOVQ R10, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16: - MOVQ (SI), R9 - MOVQ -8(SI)(R8*1), SI - MOVQ R9, (AX) - MOVQ SI, -8(AX)(R8*1) + MOVQ (DI), R10 + MOVQ -8(DI)(R9*1), DI + MOVQ R10, (CX) + MOVQ DI, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_17through32: - MOVOU (SI), X0 - MOVOU -16(SI)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU -16(DI)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_33through64: - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBlockAsm8B: - MOVQ DI, AX + MOVQ R8, CX JMP emit_literal_done_match_emit_encodeSnappyBlockAsm8B memmove_long_match_emit_encodeSnappyBlockAsm8B: - LEAQ (AX)(R8*1), DI + LEAQ (CX)(R9*1), R8 // genMemMoveLong - MOVOU (SI), X0 - MOVOU 16(SI), X1 - MOVOU -32(SI)(R8*1), X2 - MOVOU -16(SI)(R8*1), X3 - MOVQ R8, R10 - SHRQ $0x05, R10 - MOVQ AX, R9 - ANDL $0x0000001f, R9 - MOVQ $0x00000040, R11 - SUBQ R9, R11 - DECQ R10 + MOVOU (DI), X0 + MOVOU 16(DI), X1 + MOVOU -32(DI)(R9*1), X2 + MOVOU -16(DI)(R9*1), X3 + MOVQ R9, R11 + SHRQ $0x05, R11 + MOVQ CX, R10 + ANDL $0x0000001f, R10 + MOVQ $0x00000040, R12 + SUBQ R10, R12 + DECQ R11 JA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(SI)(R11*1), R9 - LEAQ -32(AX)(R11*1), R12 + LEAQ -32(DI)(R12*1), R10 + LEAQ -32(CX)(R12*1), R13 emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_big_loop_back: - MOVOU (R9), X4 - MOVOU 16(R9), X5 - MOVOA X4, (R12) - MOVOA X5, 16(R12) + MOVOU (R10), X4 + MOVOU 16(R10), X5 + MOVOA X4, (R13) + MOVOA X5, 16(R13) + ADDQ $0x20, R13 + ADDQ $0x20, R10 ADDQ $0x20, R12 - ADDQ $0x20, R9 - ADDQ $0x20, R11 - DECQ R10 + DECQ R11 JNA emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(SI)(R11*1), X4 - MOVOU -16(SI)(R11*1), X5 - MOVOA X4, -32(AX)(R11*1) - MOVOA X5, -16(AX)(R11*1) - ADDQ $0x20, R11 - CMPQ R8, R11 + MOVOU -32(DI)(R12*1), X4 + MOVOU -16(DI)(R12*1), X5 + MOVOA X4, -32(CX)(R12*1) + MOVOA X5, -16(CX)(R12*1) + ADDQ $0x20, R12 + CMPQ R9, R12 JAE emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ DI, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ R8, CX emit_literal_done_match_emit_encodeSnappyBlockAsm8B: match_nolit_loop_encodeSnappyBlockAsm8B: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBlockAsm8B - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm8B matchlen_match8_match_nolit_encodeSnappyBlockAsm8B: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBlockAsm8B - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm8B matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_encodeSnappyBlockAsm8B matchlen_match4_match_nolit_encodeSnappyBlockAsm8B: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBlockAsm8B - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm8B - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_encodeSnappyBlockAsm8B: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBlockAsm8B JB match_nolit_end_encodeSnappyBlockAsm8B - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm8B - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_encodeSnappyBlockAsm8B matchlen_match1_match_nolit_encodeSnappyBlockAsm8B: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_encodeSnappyBlockAsm8B - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_encodeSnappyBlockAsm8B: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBlockAsm8B: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm8B - MOVB $0xee, (AX) - MOVW BX, 1(AX) - LEAL -60(R9), R9 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW SI, 1(CX) + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm8B two_byte_offset_short_match_nolit_encodeSnappyBlockAsm8B: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm8B - LEAL -15(SI), SI - MOVB BL, 1(AX) - SHRL $0x08, BX - SHLL $0x05, BX - ORL BX, SI - MOVB SI, (AX) - ADDQ $0x02, AX + LEAL -15(DI), DI + MOVB SI, 1(CX) + SHRL $0x08, SI + SHLL $0x05, SI + ORL SI, DI + MOVB DI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm8B emit_copy_three_match_nolit_encodeSnappyBlockAsm8B: - LEAL -2(SI), SI - MOVB SI, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + LEAL -2(DI), DI + MOVB DI, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBlockAsm8B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBlockAsm8B - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBlockAsm8B: - MOVQ $0x9e3779b1, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x20, DI - IMULQ R8, DI - SHRQ $0x38, DI - SHLQ $0x20, BX - IMULQ R8, BX - SHRQ $0x38, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x9e3779b1, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x20, R8 + IMULQ R9, R8 + SHRQ $0x38, R8 + SHLQ $0x20, SI + IMULQ R9, SI + SHRQ $0x38, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_encodeSnappyBlockAsm8B - INCL CX + INCL DX JMP search_loop_encodeSnappyBlockAsm8B emit_remainder_encodeSnappyBlockAsm8B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBlockAsm8B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBlockAsm8B @@ -14847,26 +14862,26 @@ emit_remainder_ok_encodeSnappyBlockAsm8B: JB three_bytes_emit_remainder_encodeSnappyBlockAsm8B three_bytes_emit_remainder_encodeSnappyBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBlockAsm8B two_bytes_emit_remainder_encodeSnappyBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBlockAsm8B JMP memmove_long_emit_remainder_encodeSnappyBlockAsm8B one_byte_emit_remainder_encodeSnappyBlockAsm8B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -14882,73 +14897,73 @@ memmove_emit_remainder_encodeSnappyBlockAsm8B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B memmove_long_emit_remainder_encodeSnappyBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back: MOVOU (SI), X4 @@ -14962,520 +14977,521 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back: JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBetterBlockAsm(dst []byte, src []byte) int +// func encodeSnappyBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBetterBlockAsm(SB), $589848-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00001200, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBetterBlockAsm(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00001200, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBetterBlockAsm: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBetterBlockAsm MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBetterBlockAsm: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x07, BX - CMPL BX, $0x63 + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x07, SI + CMPL SI, $0x63 JBE check_maxskip_ok_encodeSnappyBetterBlockAsm - LEAL 100(CX), BX + LEAL 100(DX), SI JMP check_maxskip_cont_encodeSnappyBetterBlockAsm check_maxskip_ok_encodeSnappyBetterBlockAsm: - LEAL 1(CX)(BX*1), BX + LEAL 1(DX)(SI*1), SI check_maxskip_cont_encodeSnappyBetterBlockAsm: - CMPL BX, 8(SP) + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x00cf1bbcdcbfa563, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 524312(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 524312(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x00cf1bbcdcbfa563, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x32, R11 + MOVL (AX)(R10*4), SI + MOVL 524288(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 524288(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeSnappyBetterBlockAsm - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeSnappyBetterBlockAsm no_short_found_encodeSnappyBetterBlockAsm: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeSnappyBetterBlockAsm - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBetterBlockAsm candidateS_match_encodeSnappyBetterBlockAsm: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x2f, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x2f, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBetterBlockAsm - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeSnappyBetterBlockAsm: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm match_extend_back_loop_encodeSnappyBetterBlockAsm: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBetterBlockAsm - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBetterBlockAsm - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm JMP match_extend_back_loop_encodeSnappyBetterBlockAsm match_extend_back_end_encodeSnappyBetterBlockAsm: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 5(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 5(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBetterBlockAsm: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm JB match_nolit_end_encodeSnappyBetterBlockAsm - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeSnappyBetterBlockAsm matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeSnappyBetterBlockAsm - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeSnappyBetterBlockAsm: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - CMPL R11, $0x01 + CMPL R12, $0x01 JA match_length_ok_encodeSnappyBetterBlockAsm - CMPL DI, $0x0000ffff + CMPL R8, $0x0000ffff JBE match_length_ok_encodeSnappyBetterBlockAsm - MOVL 20(SP), CX - INCL CX + MOVL 20(SP), DX + INCL DX JMP search_loop_encodeSnappyBetterBlockAsm match_length_ok_encodeSnappyBetterBlockAsm: - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeSnappyBetterBlockAsm - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeSnappyBetterBlockAsm - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_match_emit_encodeSnappyBetterBlockAsm - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_match_emit_encodeSnappyBetterBlockAsm - MOVB $0xfc, (AX) - MOVL BX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL SI, 1(CX) + ADDQ $0x05, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm four_bytes_match_emit_encodeSnappyBetterBlockAsm: - MOVL BX, R10 - SHRL $0x10, R10 - MOVB $0xf8, (AX) - MOVW BX, 1(AX) - MOVB R10, 3(AX) - ADDQ $0x04, AX + MOVL SI, R11 + SHRL $0x10, R11 + MOVB $0xf8, (CX) + MOVW SI, 1(CX) + MOVB R11, 3(CX) + ADDQ $0x04, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm three_bytes_match_emit_encodeSnappyBetterBlockAsm: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm two_bytes_match_emit_encodeSnappyBetterBlockAsm: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeSnappyBetterBlockAsm JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm one_byte_match_emit_encodeSnappyBetterBlockAsm: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm memmove_long_match_emit_encodeSnappyBetterBlockAsm: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeSnappyBetterBlockAsm: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy - CMPL DI, $0x00010000 + CMPL R8, $0x00010000 JB two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm four_bytes_loop_back_match_nolit_encodeSnappyBetterBlockAsm: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm - MOVB $0xff, (AX) - MOVL DI, 1(AX) - LEAL -64(R11), R11 - ADDQ $0x05, AX - CMPL R11, $0x04 + MOVB $0xff, (CX) + MOVL R8, 1(CX) + LEAL -64(R12), R12 + ADDQ $0x05, CX + CMPL R12, $0x04 JB four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm JMP four_bytes_loop_back_match_nolit_encodeSnappyBetterBlockAsm four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm: - TESTL R11, R11 + TESTL R12, R12 JZ match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm - XORL BX, BX - LEAL -1(BX)(R11*4), R11 - MOVB R11, (AX) - MOVL DI, 1(AX) - ADDQ $0x05, AX + XORL SI, SI + LEAL -1(SI)(R12*4), R12 + MOVB R12, (CX) + MOVL R8, 1(CX) + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBetterBlockAsm: - MOVQ $0x00cf1bbcdcbfa563, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x32, R10 - SHLQ $0x08, R11 - IMULQ BX, R11 - SHRQ $0x2f, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x32, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 524312(SP)(R10*4) - MOVL R13, 524312(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x00cf1bbcdcbfa563, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x08, R10 + IMULQ SI, R10 + SHRQ $0x2f, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x32, R11 + SHLQ $0x08, R12 + IMULQ SI, R12 + SHRQ $0x2f, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x32, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 524288(AX)(R11*4) + MOVL R14, 524288(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeSnappyBetterBlockAsm: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeSnappyBetterBlockAsm - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x2f, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x08, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x2f, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x08, R11 + IMULQ SI, R11 + SHRQ $0x2f, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeSnappyBetterBlockAsm emit_remainder_encodeSnappyBetterBlockAsm: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 5(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 5(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBetterBlockAsm - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBetterBlockAsm: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBetterBlockAsm @@ -15485,41 +15501,41 @@ emit_remainder_ok_encodeSnappyBetterBlockAsm: JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm CMPL DX, $0x01000000 JB four_bytes_emit_remainder_encodeSnappyBetterBlockAsm - MOVB $0xfc, (AX) - MOVL DX, 1(AX) - ADDQ $0x05, AX + MOVB $0xfc, (CX) + MOVL DX, 1(CX) + ADDQ $0x05, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm four_bytes_emit_remainder_encodeSnappyBetterBlockAsm: MOVL DX, BX SHRL $0x10, BX - MOVB $0xf8, (AX) - MOVW DX, 1(AX) - MOVB BL, 3(AX) - ADDQ $0x04, AX + MOVB $0xf8, (CX) + MOVW DX, 1(CX) + MOVB BL, 3(CX) + ADDQ $0x04, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm three_bytes_emit_remainder_encodeSnappyBetterBlockAsm: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm two_bytes_emit_remainder_encodeSnappyBetterBlockAsm: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBetterBlockAsm JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm one_byte_emit_remainder_encodeSnappyBetterBlockAsm: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBetterBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -15535,73 +15551,73 @@ memmove_emit_remainder_encodeSnappyBetterBlockAsm: JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm memmove_long_emit_remainder_encodeSnappyBetterBlockAsm: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back: MOVOU (SI), X4 @@ -15615,463 +15631,464 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_ba JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte) int +// func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte, tmp *[294912]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBetterBlockAsm64K(SB), $327704-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000a00, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBetterBlockAsm64K(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000900, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBetterBlockAsm64K: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBetterBlockAsm64K MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBetterBlockAsm64K: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x07, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x07, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm64K - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x00cf1bbcdcbfa563, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x30, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x32, R10 - MOVL 24(SP)(R9*4), BX - MOVL 262168(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 262168(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x00cf1bbcdcbfa563, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x30, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x33, R11 + MOVL (AX)(R10*4), SI + MOVL 262144(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 262144(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm64K - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeSnappyBetterBlockAsm64K - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeSnappyBetterBlockAsm64K no_short_found_encodeSnappyBetterBlockAsm64K: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm64K - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeSnappyBetterBlockAsm64K - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBetterBlockAsm64K candidateS_match_encodeSnappyBetterBlockAsm64K: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x08, R9 - IMULQ R8, R9 - SHRQ $0x30, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x08, R10 + IMULQ R9, R10 + SHRQ $0x30, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBetterBlockAsm64K - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeSnappyBetterBlockAsm64K: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm64K match_extend_back_loop_encodeSnappyBetterBlockAsm64K: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBetterBlockAsm64K - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBetterBlockAsm64K - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm64K JMP match_extend_back_loop_encodeSnappyBetterBlockAsm64K match_extend_back_end_encodeSnappyBetterBlockAsm64K: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBetterBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBetterBlockAsm64K: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm64K matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm64K matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K JB match_nolit_end_encodeSnappyBetterBlockAsm64K - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeSnappyBetterBlockAsm64K matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeSnappyBetterBlockAsm64K - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeSnappyBetterBlockAsm64K: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeSnappyBetterBlockAsm64K - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeSnappyBetterBlockAsm64K JB three_bytes_match_emit_encodeSnappyBetterBlockAsm64K three_bytes_match_emit_encodeSnappyBetterBlockAsm64K: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm64K two_bytes_match_emit_encodeSnappyBetterBlockAsm64K: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeSnappyBetterBlockAsm64K JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm64K one_byte_match_emit_encodeSnappyBetterBlockAsm64K: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBetterBlockAsm64K: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K memmove_long_match_emit_encodeSnappyBetterBlockAsm64K: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_big_loop_back - -emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + +emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32: + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm64K: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm64K - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm64K two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm64K: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm64K emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm64K: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm64K - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K: - MOVQ $0x00cf1bbcdcbfa563, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x30, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x32, R10 - SHLQ $0x08, R11 - IMULQ BX, R11 - SHRQ $0x30, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x32, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 262168(SP)(R10*4) - MOVL R13, 262168(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x00cf1bbcdcbfa563, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x08, R10 + IMULQ SI, R10 + SHRQ $0x30, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x33, R11 + SHLQ $0x08, R12 + IMULQ SI, R12 + SHRQ $0x30, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x33, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 262144(AX)(R11*4) + MOVL R14, 262144(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeSnappyBetterBlockAsm64K: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeSnappyBetterBlockAsm64K - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x08, R9 - IMULQ BX, R9 - SHRQ $0x30, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x08, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x30, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x08, R11 + IMULQ SI, R11 + SHRQ $0x30, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeSnappyBetterBlockAsm64K emit_remainder_encodeSnappyBetterBlockAsm64K: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBetterBlockAsm64K - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBetterBlockAsm64K: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBetterBlockAsm64K @@ -16080,26 +16097,26 @@ emit_remainder_ok_encodeSnappyBetterBlockAsm64K: JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K two_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBetterBlockAsm64K JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K one_byte_emit_remainder_encodeSnappyBetterBlockAsm64K: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBetterBlockAsm64K: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -16115,73 +16132,73 @@ memmove_emit_remainder_encodeSnappyBetterBlockAsm64K: JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back: MOVOU (SI), X4 @@ -16195,463 +16212,464 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte) int +// func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBetterBlockAsm12B(SB), $81944-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000280, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBetterBlockAsm12B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000280, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBetterBlockAsm12B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBetterBlockAsm12B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBetterBlockAsm12B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x06, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x06, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm12B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x34, R10 - MOVL 24(SP)(R9*4), BX - MOVL 65560(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 65560(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x34, R11 + MOVL (AX)(R10*4), SI + MOVL 65536(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 65536(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm12B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeSnappyBetterBlockAsm12B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeSnappyBetterBlockAsm12B no_short_found_encodeSnappyBetterBlockAsm12B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm12B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeSnappyBetterBlockAsm12B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBetterBlockAsm12B candidateS_match_encodeSnappyBetterBlockAsm12B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x32, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x32, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBetterBlockAsm12B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeSnappyBetterBlockAsm12B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm12B match_extend_back_loop_encodeSnappyBetterBlockAsm12B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBetterBlockAsm12B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBetterBlockAsm12B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm12B JMP match_extend_back_loop_encodeSnappyBetterBlockAsm12B match_extend_back_end_encodeSnappyBetterBlockAsm12B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBetterBlockAsm12B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm12B matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm12B matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B JB match_nolit_end_encodeSnappyBetterBlockAsm12B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeSnappyBetterBlockAsm12B matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeSnappyBetterBlockAsm12B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeSnappyBetterBlockAsm12B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeSnappyBetterBlockAsm12B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeSnappyBetterBlockAsm12B JB three_bytes_match_emit_encodeSnappyBetterBlockAsm12B three_bytes_match_emit_encodeSnappyBetterBlockAsm12B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm12B two_bytes_match_emit_encodeSnappyBetterBlockAsm12B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeSnappyBetterBlockAsm12B JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm12B one_byte_match_emit_encodeSnappyBetterBlockAsm12B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B memmove_long_match_emit_encodeSnappyBetterBlockAsm12B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm12B: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm12B - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm12B two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm12B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm12B emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm12B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm12B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x32, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x34, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x32, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x34, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 65560(SP)(R10*4) - MOVL R13, 65560(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x32, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x34, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x32, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x34, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 65536(AX)(R11*4) + MOVL R14, 65536(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeSnappyBetterBlockAsm12B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeSnappyBetterBlockAsm12B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x32, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x32, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x32, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeSnappyBetterBlockAsm12B emit_remainder_encodeSnappyBetterBlockAsm12B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBetterBlockAsm12B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBetterBlockAsm12B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBetterBlockAsm12B @@ -16660,26 +16678,26 @@ emit_remainder_ok_encodeSnappyBetterBlockAsm12B: JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B two_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBetterBlockAsm12B JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B one_byte_emit_remainder_encodeSnappyBetterBlockAsm12B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBetterBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -16695,73 +16713,73 @@ memmove_emit_remainder_encodeSnappyBetterBlockAsm12B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) - JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B - -emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) + JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B + +emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_33through64: + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back: MOVOU (SI), X4 @@ -16775,463 +16793,464 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte) int +// func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBetterBlockAsm10B(SB), $20504-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x000000a0, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBetterBlockAsm10B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x000000a0, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBetterBlockAsm10B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBetterBlockAsm10B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBetterBlockAsm10B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm10B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x36, R10 - MOVL 24(SP)(R9*4), BX - MOVL 16408(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 16408(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x36, R11 + MOVL (AX)(R10*4), SI + MOVL 16384(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 16384(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm10B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeSnappyBetterBlockAsm10B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeSnappyBetterBlockAsm10B no_short_found_encodeSnappyBetterBlockAsm10B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm10B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeSnappyBetterBlockAsm10B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBetterBlockAsm10B candidateS_match_encodeSnappyBetterBlockAsm10B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x34, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x34, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBetterBlockAsm10B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeSnappyBetterBlockAsm10B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm10B match_extend_back_loop_encodeSnappyBetterBlockAsm10B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBetterBlockAsm10B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBetterBlockAsm10B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm10B JMP match_extend_back_loop_encodeSnappyBetterBlockAsm10B match_extend_back_end_encodeSnappyBetterBlockAsm10B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBetterBlockAsm10B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm10B matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm10B matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B - LEAL -4(DI), DI - LEAL 4(R11), R11 + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B JB match_nolit_end_encodeSnappyBetterBlockAsm10B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeSnappyBetterBlockAsm10B matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeSnappyBetterBlockAsm10B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeSnappyBetterBlockAsm10B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeSnappyBetterBlockAsm10B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeSnappyBetterBlockAsm10B JB three_bytes_match_emit_encodeSnappyBetterBlockAsm10B three_bytes_match_emit_encodeSnappyBetterBlockAsm10B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm10B two_bytes_match_emit_encodeSnappyBetterBlockAsm10B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeSnappyBetterBlockAsm10B JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm10B one_byte_match_emit_encodeSnappyBetterBlockAsm10B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B memmove_long_match_emit_encodeSnappyBetterBlockAsm10B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm10B: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm10B - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm10B two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm10B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B - CMPL DI, $0x00000800 + CMPL R8, $0x00000800 JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm10B emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm10B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm10B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x34, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x36, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x34, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x36, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 16408(SP)(R10*4) - MOVL R13, 16408(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x34, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x36, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x34, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x36, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 16384(AX)(R11*4) + MOVL R14, 16384(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeSnappyBetterBlockAsm10B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeSnappyBetterBlockAsm10B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x34, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x34, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x34, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeSnappyBetterBlockAsm10B emit_remainder_encodeSnappyBetterBlockAsm10B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBetterBlockAsm10B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBetterBlockAsm10B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBetterBlockAsm10B @@ -17240,26 +17259,26 @@ emit_remainder_ok_encodeSnappyBetterBlockAsm10B: JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B two_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBetterBlockAsm10B JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B one_byte_emit_remainder_encodeSnappyBetterBlockAsm10B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBetterBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -17275,73 +17294,73 @@ memmove_emit_remainder_encodeSnappyBetterBlockAsm10B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back: MOVOU (SI), X4 @@ -17355,461 +17374,462 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte) int +// func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int // Requires: BMI, SSE2 -TEXT ·encodeSnappyBetterBlockAsm8B(SB), $5144-56 - MOVQ dst_base+0(FP), AX - MOVQ $0x00000028, CX - LEAQ 24(SP), DX +TEXT ·encodeSnappyBetterBlockAsm8B(SB), $24-64 + MOVQ tmp+48(FP), AX + MOVQ dst_base+0(FP), CX + MOVQ $0x00000028, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_encodeSnappyBetterBlockAsm8B: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_encodeSnappyBetterBlockAsm8B MOVL $0x00000000, 12(SP) - MOVQ src_len+32(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX + MOVQ src_len+32(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX MOVL $0x00000000, 16(SP) - MOVQ src_base+24(FP), DX + MOVQ src_base+24(FP), BX search_loop_encodeSnappyBetterBlockAsm8B: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x04, BX - LEAL 1(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x04, SI + LEAL 1(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm8B - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ $0x9e3779b1, BX - MOVQ SI, R9 - MOVQ SI, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - SHLQ $0x20, R10 - IMULQ BX, R10 - SHRQ $0x38, R10 - MOVL 24(SP)(R9*4), BX - MOVL 4120(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - MOVL CX, 4120(SP)(R10*4) - MOVQ (DX)(BX*1), R9 - MOVQ (DX)(DI*1), R10 - CMPQ R9, SI + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ $0x9e3779b1, SI + MOVQ DI, R10 + MOVQ DI, R11 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + SHLQ $0x20, R11 + IMULQ SI, R11 + SHRQ $0x38, R11 + MOVL (AX)(R10*4), SI + MOVL 4096(AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + MOVL DX, 4096(AX)(R11*4) + MOVQ (BX)(SI*1), R10 + MOVQ (BX)(R8*1), R11 + CMPQ R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm8B - CMPQ R10, SI + CMPQ R11, DI JNE no_short_found_encodeSnappyBetterBlockAsm8B - MOVL DI, BX + MOVL R8, SI JMP candidate_match_encodeSnappyBetterBlockAsm8B no_short_found_encodeSnappyBetterBlockAsm8B: - CMPL R9, SI + CMPL R10, DI JEQ candidate_match_encodeSnappyBetterBlockAsm8B - CMPL R10, SI + CMPL R11, DI JEQ candidateS_match_encodeSnappyBetterBlockAsm8B - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_encodeSnappyBetterBlockAsm8B candidateS_match_encodeSnappyBetterBlockAsm8B: - SHRQ $0x08, SI - MOVQ SI, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x36, R9 - MOVL 24(SP)(R9*4), BX - INCL CX - MOVL CX, 24(SP)(R9*4) - CMPL (DX)(BX*1), SI + SHRQ $0x08, DI + MOVQ DI, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x36, R10 + MOVL (AX)(R10*4), SI + INCL DX + MOVL DX, (AX)(R10*4) + CMPL (BX)(SI*1), DI JEQ candidate_match_encodeSnappyBetterBlockAsm8B - DECL CX - MOVL DI, BX + DECL DX + MOVL R8, SI candidate_match_encodeSnappyBetterBlockAsm8B: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm8B match_extend_back_loop_encodeSnappyBetterBlockAsm8B: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_encodeSnappyBetterBlockAsm8B - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_encodeSnappyBetterBlockAsm8B - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_encodeSnappyBetterBlockAsm8B JMP match_extend_back_loop_encodeSnappyBetterBlockAsm8B match_extend_back_end_encodeSnappyBetterBlockAsm8B: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_encodeSnappyBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_dst_size_check_encodeSnappyBetterBlockAsm8B: - MOVL CX, SI - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+32(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), R9 + MOVL DX, DI + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+32(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), R10 // matchLen - XORL R11, R11 + XORL R12, R12 matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B - MOVQ (R8)(R11*1), R10 - MOVQ 8(R8)(R11*1), R12 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + MOVQ 8(R9)(R12*1), R13 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B - XORQ 8(R9)(R11*1), R12 + XORQ 8(R10)(R12*1), R13 JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B - LEAL -16(DI), DI - LEAL 16(R11), R11 + LEAL -16(R8), R8 + LEAL 16(R12), R12 JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R12, R12 + TZCNTQ R13, R13 #else - BSFQ R12, R12 + BSFQ R13, R13 #endif - SARQ $0x03, R12 - LEAL 8(R11)(R12*1), R11 + SARQ $0x03, R13 + LEAL 8(R12)(R13*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm8B matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B - MOVQ (R8)(R11*1), R10 - XORQ (R9)(R11*1), R10 + MOVQ (R9)(R12*1), R11 + XORQ (R10)(R12*1), R11 JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B - LEAL -8(DI), DI - LEAL 8(R11), R11 + LEAL -8(R8), R8 + LEAL 8(R12), R12 JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL (R11)(R10*1), R11 + SARQ $0x03, R11 + LEAL (R12)(R11*1), R12 JMP match_nolit_end_encodeSnappyBetterBlockAsm8B matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B - MOVL (R8)(R11*1), R10 - CMPL (R9)(R11*1), R10 - JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B - LEAL -4(DI), DI - LEAL 4(R11), R11 + MOVL (R9)(R12*1), R11 + CMPL (R10)(R12*1), R11 + JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B + LEAL -4(R8), R8 + LEAL 4(R12), R12 matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B JB match_nolit_end_encodeSnappyBetterBlockAsm8B - MOVW (R8)(R11*1), R10 - CMPW (R9)(R11*1), R10 + MOVW (R9)(R12*1), R11 + CMPW (R10)(R12*1), R11 JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B - LEAL 2(R11), R11 - SUBL $0x02, DI + LEAL 2(R12), R12 + SUBL $0x02, R8 JZ match_nolit_end_encodeSnappyBetterBlockAsm8B matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B: - MOVB (R8)(R11*1), R10 - CMPB (R9)(R11*1), R10 + MOVB (R9)(R12*1), R11 + CMPB (R10)(R12*1), R11 JNE match_nolit_end_encodeSnappyBetterBlockAsm8B - LEAL 1(R11), R11 + LEAL 1(R12), R12 match_nolit_end_encodeSnappyBetterBlockAsm8B: - MOVL CX, DI - SUBL BX, DI + MOVL DX, R8 + SUBL SI, R8 // Check if repeat - MOVL DI, 16(SP) - MOVL 12(SP), BX - CMPL BX, SI + MOVL R8, 16(SP) + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R9 - SUBL BX, R8 - LEAL -1(R8), BX - CMPL BX, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R10 + SUBL SI, R9 + LEAL -1(R9), SI + CMPL SI, $0x3c JB one_byte_match_emit_encodeSnappyBetterBlockAsm8B - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_match_emit_encodeSnappyBetterBlockAsm8B JB three_bytes_match_emit_encodeSnappyBetterBlockAsm8B three_bytes_match_emit_encodeSnappyBetterBlockAsm8B: - MOVB $0xf4, (AX) - MOVW BX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW SI, 1(CX) + ADDQ $0x03, CX JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm8B two_bytes_match_emit_encodeSnappyBetterBlockAsm8B: - MOVB $0xf0, (AX) - MOVB BL, 1(AX) - ADDQ $0x02, AX - CMPL BX, $0x40 + MOVB $0xf0, (CX) + MOVB SI, 1(CX) + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_match_emit_encodeSnappyBetterBlockAsm8B JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm8B one_byte_match_emit_encodeSnappyBetterBlockAsm8B: - SHLB $0x02, BL - MOVB BL, (AX) - ADDQ $0x01, AX + SHLB $0x02, SI + MOVB SI, (CX) + ADDQ $0x01, CX memmove_match_emit_encodeSnappyBetterBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveShort - CMPQ R8, $0x08 + CMPQ R9, $0x08 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8 - CMPQ R8, $0x10 + CMPQ R9, $0x10 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16 - CMPQ R8, $0x20 + CMPQ R9, $0x20 JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_17through32 JMP emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_33through64 emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8: - MOVQ (R9), R10 - MOVQ R10, (AX) + MOVQ (R10), R11 + MOVQ R11, (CX) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16: - MOVQ (R9), R10 - MOVQ -8(R9)(R8*1), R9 - MOVQ R10, (AX) - MOVQ R9, -8(AX)(R8*1) + MOVQ (R10), R11 + MOVQ -8(R10)(R9*1), R10 + MOVQ R11, (CX) + MOVQ R10, -8(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_17through32: - MOVOU (R9), X0 - MOVOU -16(R9)(R8*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU -16(R10)(R9*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(R9*1) JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_33through64: - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B: - MOVQ BX, AX + MOVQ SI, CX JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B memmove_long_match_emit_encodeSnappyBetterBlockAsm8B: - LEAQ (AX)(R8*1), BX + LEAQ (CX)(R9*1), SI // genMemMoveLong - MOVOU (R9), X0 - MOVOU 16(R9), X1 - MOVOU -32(R9)(R8*1), X2 - MOVOU -16(R9)(R8*1), X3 - MOVQ R8, R12 - SHRQ $0x05, R12 - MOVQ AX, R10 - ANDL $0x0000001f, R10 - MOVQ $0x00000040, R13 - SUBQ R10, R13 - DECQ R12 + MOVOU (R10), X0 + MOVOU 16(R10), X1 + MOVOU -32(R10)(R9*1), X2 + MOVOU -16(R10)(R9*1), X3 + MOVQ R9, R13 + SHRQ $0x05, R13 + MOVQ CX, R11 + ANDL $0x0000001f, R11 + MOVQ $0x00000040, R14 + SUBQ R11, R14 + DECQ R13 JA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(R9)(R13*1), R10 - LEAQ -32(AX)(R13*1), R14 + LEAQ -32(R10)(R14*1), R11 + LEAQ -32(CX)(R14*1), R15 emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_big_loop_back: - MOVOU (R10), X4 - MOVOU 16(R10), X5 - MOVOA X4, (R14) - MOVOA X5, 16(R14) + MOVOU (R11), X4 + MOVOU 16(R11), X5 + MOVOA X4, (R15) + MOVOA X5, 16(R15) + ADDQ $0x20, R15 + ADDQ $0x20, R11 ADDQ $0x20, R14 - ADDQ $0x20, R10 - ADDQ $0x20, R13 - DECQ R12 + DECQ R13 JNA emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(R9)(R13*1), X4 - MOVOU -16(R9)(R13*1), X5 - MOVOA X4, -32(AX)(R13*1) - MOVOA X5, -16(AX)(R13*1) - ADDQ $0x20, R13 - CMPQ R8, R13 + MOVOU -32(R10)(R14*1), X4 + MOVOU -16(R10)(R14*1), X5 + MOVOA X4, -32(CX)(R14*1) + MOVOA X5, -16(CX)(R14*1) + ADDQ $0x20, R14 + CMPQ R9, R14 JAE emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(R8*1) - MOVOU X3, -16(AX)(R8*1) - MOVQ BX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(R9*1) + MOVOU X3, -16(CX)(R9*1) + MOVQ SI, CX emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B: - ADDL R11, CX - ADDL $0x04, R11 - MOVL CX, 12(SP) + ADDL R12, DX + ADDL $0x04, R12 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm8B: - CMPL R11, $0x40 + CMPL R12, $0x40 JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm8B - MOVB $0xee, (AX) - MOVW DI, 1(AX) - LEAL -60(R11), R11 - ADDQ $0x03, AX + MOVB $0xee, (CX) + MOVW R8, 1(CX) + LEAL -60(R12), R12 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm8B two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm8B: - MOVL R11, BX - SHLL $0x02, BX - CMPL R11, $0x0c + MOVL R12, SI + SHLL $0x02, SI + CMPL R12, $0x0c JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm8B - LEAL -15(BX), BX - MOVB DI, 1(AX) - SHRL $0x08, DI - SHLL $0x05, DI - ORL DI, BX - MOVB BL, (AX) - ADDQ $0x02, AX + LEAL -15(SI), SI + MOVB R8, 1(CX) + SHRL $0x08, R8 + SHLL $0x05, R8 + ORL R8, SI + MOVB SI, (CX) + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm8B emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm8B: - LEAL -2(BX), BX - MOVB BL, (AX) - MOVW DI, 1(AX) - ADDQ $0x03, AX + LEAL -2(SI), SI + MOVB SI, (CX) + MOVW R8, 1(CX) + ADDQ $0x03, CX match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm8B: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_encodeSnappyBetterBlockAsm8B - CMPQ AX, (SP) + CMPQ CX, (SP) JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B: - MOVQ $0x0000cf1bbcdcbf9b, BX - MOVQ $0x9e3779b1, DI - LEAQ 1(SI), SI - LEAQ -2(CX), R8 - MOVQ (DX)(SI*1), R9 - MOVQ 1(DX)(SI*1), R10 - MOVQ (DX)(R8*1), R11 - MOVQ 1(DX)(R8*1), R12 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x36, R9 - SHLQ $0x20, R10 - IMULQ DI, R10 - SHRQ $0x38, R10 - SHLQ $0x10, R11 - IMULQ BX, R11 - SHRQ $0x36, R11 - SHLQ $0x20, R12 - IMULQ DI, R12 - SHRQ $0x38, R12 - LEAQ 1(SI), DI - LEAQ 1(R8), R13 - MOVL SI, 24(SP)(R9*4) - MOVL R8, 24(SP)(R11*4) - MOVL DI, 4120(SP)(R10*4) - MOVL R13, 4120(SP)(R12*4) - LEAQ 1(R8)(SI*1), DI - SHRQ $0x01, DI - ADDQ $0x01, SI - SUBQ $0x01, R8 + MOVQ $0x0000cf1bbcdcbf9b, SI + MOVQ $0x9e3779b1, R8 + LEAQ 1(DI), DI + LEAQ -2(DX), R9 + MOVQ (BX)(DI*1), R10 + MOVQ 1(BX)(DI*1), R11 + MOVQ (BX)(R9*1), R12 + MOVQ 1(BX)(R9*1), R13 + SHLQ $0x10, R10 + IMULQ SI, R10 + SHRQ $0x36, R10 + SHLQ $0x20, R11 + IMULQ R8, R11 + SHRQ $0x38, R11 + SHLQ $0x10, R12 + IMULQ SI, R12 + SHRQ $0x36, R12 + SHLQ $0x20, R13 + IMULQ R8, R13 + SHRQ $0x38, R13 + LEAQ 1(DI), R8 + LEAQ 1(R9), R14 + MOVL DI, (AX)(R10*4) + MOVL R9, (AX)(R12*4) + MOVL R8, 4096(AX)(R11*4) + MOVL R14, 4096(AX)(R13*4) + LEAQ 1(R9)(DI*1), R8 + SHRQ $0x01, R8 + ADDQ $0x01, DI + SUBQ $0x01, R9 index_loop_encodeSnappyBetterBlockAsm8B: - CMPQ DI, R8 + CMPQ R8, R9 JAE search_loop_encodeSnappyBetterBlockAsm8B - MOVQ (DX)(SI*1), R9 - MOVQ (DX)(DI*1), R10 - SHLQ $0x10, R9 - IMULQ BX, R9 - SHRQ $0x36, R9 + MOVQ (BX)(DI*1), R10 + MOVQ (BX)(R8*1), R11 SHLQ $0x10, R10 - IMULQ BX, R10 + IMULQ SI, R10 SHRQ $0x36, R10 - MOVL SI, 24(SP)(R9*4) - MOVL DI, 24(SP)(R10*4) - ADDQ $0x02, SI + SHLQ $0x10, R11 + IMULQ SI, R11 + SHRQ $0x36, R11 + MOVL DI, (AX)(R10*4) + MOVL R8, (AX)(R11*4) ADDQ $0x02, DI + ADDQ $0x02, R8 JMP index_loop_encodeSnappyBetterBlockAsm8B emit_remainder_encodeSnappyBetterBlockAsm8B: - MOVQ src_len+32(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+32(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_encodeSnappyBetterBlockAsm8B - MOVQ $0x00000000, ret+48(FP) + MOVQ $0x00000000, ret+56(FP) RET emit_remainder_ok_encodeSnappyBetterBlockAsm8B: - MOVQ src_len+32(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+32(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI LEAL -1(SI), DX CMPL DX, $0x3c JB one_byte_emit_remainder_encodeSnappyBetterBlockAsm8B @@ -17818,26 +17838,26 @@ emit_remainder_ok_encodeSnappyBetterBlockAsm8B: JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B: - MOVB $0xf4, (AX) - MOVW DX, 1(AX) - ADDQ $0x03, AX + MOVB $0xf4, (CX) + MOVW DX, 1(CX) + ADDQ $0x03, CX JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B two_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B: - MOVB $0xf0, (AX) - MOVB DL, 1(AX) - ADDQ $0x02, AX + MOVB $0xf0, (CX) + MOVB DL, 1(CX) + ADDQ $0x02, CX CMPL DX, $0x40 JB memmove_emit_remainder_encodeSnappyBetterBlockAsm8B JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B one_byte_emit_remainder_encodeSnappyBetterBlockAsm8B: SHLB $0x02, DL - MOVB DL, (AX) - ADDQ $0x01, AX + MOVB DL, (CX) + ADDQ $0x01, CX memmove_emit_remainder_encodeSnappyBetterBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveShort @@ -17853,73 +17873,73 @@ memmove_emit_remainder_encodeSnappyBetterBlockAsm8B: JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_33through64 emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_1or2: - MOVB (CX), SI - MOVB -1(CX)(BX*1), CL - MOVB SI, (AX) - MOVB CL, -1(AX)(BX*1) + MOVB (AX), SI + MOVB -1(AX)(BX*1), AL + MOVB SI, (CX) + MOVB AL, -1(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_3: - MOVW (CX), SI - MOVB 2(CX), CL - MOVW SI, (AX) - MOVB CL, 2(AX) + MOVW (AX), SI + MOVB 2(AX), AL + MOVW SI, (CX) + MOVB AL, 2(CX) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_4through7: - MOVL (CX), SI - MOVL -4(CX)(BX*1), CX - MOVL SI, (AX) - MOVL CX, -4(AX)(BX*1) + MOVL (AX), SI + MOVL -4(AX)(BX*1), AX + MOVL SI, (CX) + MOVL AX, -4(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_8through16: - MOVQ (CX), SI - MOVQ -8(CX)(BX*1), CX - MOVQ SI, (AX) - MOVQ CX, -8(AX)(BX*1) + MOVQ (AX), SI + MOVQ -8(AX)(BX*1), AX + MOVQ SI, (CX) + MOVQ AX, -8(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_17through32: - MOVOU (CX), X0 - MOVOU -16(CX)(BX*1), X1 - MOVOU X0, (AX) - MOVOU X1, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU -16(AX)(BX*1), X1 + MOVOU X0, (CX) + MOVOU X1, -16(CX)(BX*1) JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_33through64: - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B: - MOVQ DX, AX + MOVQ DX, CX JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B: - LEAQ (AX)(SI*1), DX + LEAQ (CX)(SI*1), DX MOVL SI, BX // genMemMoveLong - MOVOU (CX), X0 - MOVOU 16(CX), X1 - MOVOU -32(CX)(BX*1), X2 - MOVOU -16(CX)(BX*1), X3 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU -32(AX)(BX*1), X2 + MOVOU -16(AX)(BX*1), X3 MOVQ BX, DI SHRQ $0x05, DI - MOVQ AX, SI + MOVQ CX, SI ANDL $0x0000001f, SI MOVQ $0x00000040, R8 SUBQ SI, R8 DECQ DI JA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32 - LEAQ -32(CX)(R8*1), SI - LEAQ -32(AX)(R8*1), R9 + LEAQ -32(AX)(R8*1), SI + LEAQ -32(CX)(R8*1), R9 emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back: MOVOU (SI), X4 @@ -17933,1136 +17953,1142 @@ emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_ JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32: - MOVOU -32(CX)(R8*1), X4 - MOVOU -16(CX)(R8*1), X5 - MOVOA X4, -32(AX)(R8*1) - MOVOA X5, -16(AX)(R8*1) + MOVOU -32(AX)(R8*1), X4 + MOVOU -16(AX)(R8*1), X5 + MOVOA X4, -32(CX)(R8*1) + MOVOA X5, -16(CX)(R8*1) ADDQ $0x20, R8 CMPQ BX, R8 JAE emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32 - MOVOU X0, (AX) - MOVOU X1, 16(AX) - MOVOU X2, -32(AX)(BX*1) - MOVOU X3, -16(AX)(BX*1) - MOVQ DX, AX + MOVOU X0, (CX) + MOVOU X1, 16(CX) + MOVOU X2, -32(CX)(BX*1) + MOVOU X3, -16(CX)(BX*1) + MOVQ DX, CX emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B: - MOVQ dst_base+0(FP), CX - SUBQ CX, AX - MOVQ AX, ret+48(FP) + MOVQ dst_base+0(FP), AX + SUBQ AX, CX + MOVQ CX, ret+56(FP) RET -// func calcBlockSize(src []byte) int +// func calcBlockSize(src []byte, tmp *[32768]byte) int // Requires: BMI, SSE2 -TEXT ·calcBlockSize(SB), $32792-32 - XORQ AX, AX - MOVQ $0x00000100, CX - LEAQ 24(SP), DX +TEXT ·calcBlockSize(SB), $24-40 + MOVQ tmp+24(FP), AX + XORQ CX, CX + MOVQ $0x00000100, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_calcBlockSize: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_calcBlockSize MOVL $0x00000000, 12(SP) - MOVQ src_len+8(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+0(FP), DX + MOVQ src_len+8(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+0(FP), BX search_loop_calcBlockSize: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x05, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x05, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_calcBlockSize - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x33, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x10, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x33, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x10, R9 - IMULQ R8, R9 - SHRQ $0x33, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x10, R11 + IMULQ R9, R11 + SHRQ $0x33, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x10, R10 + IMULQ R9, R10 + SHRQ $0x33, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_calcBlockSize - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_calcBlockSize repeat_extend_back_loop_calcBlockSize: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_calcBlockSize - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_calcBlockSize - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_calcBlockSize repeat_extend_back_end_calcBlockSize: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 5(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 5(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_calcBlockSize - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET repeat_dst_size_check_calcBlockSize: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_calcBlockSize - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_calcBlockSize - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_calcBlockSize - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB three_bytes_repeat_emit_calcBlockSize - CMPL BX, $0x01000000 + CMPL SI, $0x01000000 JB four_bytes_repeat_emit_calcBlockSize - ADDQ $0x05, AX + ADDQ $0x05, CX JMP memmove_long_repeat_emit_calcBlockSize four_bytes_repeat_emit_calcBlockSize: - ADDQ $0x04, AX + ADDQ $0x04, CX JMP memmove_long_repeat_emit_calcBlockSize three_bytes_repeat_emit_calcBlockSize: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_repeat_emit_calcBlockSize two_bytes_repeat_emit_calcBlockSize: - ADDQ $0x02, AX - CMPL BX, $0x40 + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_calcBlockSize JMP memmove_long_repeat_emit_calcBlockSize one_byte_repeat_emit_calcBlockSize: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_repeat_emit_calcBlockSize: - LEAQ (AX)(DI*1), AX + LEAQ (CX)(R8*1), CX JMP emit_literal_done_repeat_emit_calcBlockSize memmove_long_repeat_emit_calcBlockSize: - LEAQ (AX)(DI*1), AX + LEAQ (CX)(R8*1), CX emit_literal_done_repeat_emit_calcBlockSize: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+8(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+8(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_calcBlockSize: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_calcBlockSize - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_calcBlockSize - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_calcBlockSize - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_calcBlockSize matchlen_bsf_16repeat_extend_calcBlockSize: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_calcBlockSize matchlen_match8_repeat_extend_calcBlockSize: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_calcBlockSize - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_calcBlockSize - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_calcBlockSize matchlen_bsf_8_repeat_extend_calcBlockSize: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_calcBlockSize matchlen_match4_repeat_extend_calcBlockSize: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_calcBlockSize - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_calcBlockSize - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_calcBlockSize: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_calcBlockSize JB repeat_extend_forward_end_calcBlockSize - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_calcBlockSize - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_calcBlockSize matchlen_match1_repeat_extend_calcBlockSize: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_calcBlockSize - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_calcBlockSize: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy - CMPL SI, $0x00010000 + CMPL DI, $0x00010000 JB two_byte_offset_repeat_as_copy_calcBlockSize four_bytes_loop_back_repeat_as_copy_calcBlockSize: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE four_bytes_remain_repeat_as_copy_calcBlockSize - LEAL -64(BX), BX - ADDQ $0x05, AX - CMPL BX, $0x04 + LEAL -64(SI), SI + ADDQ $0x05, CX + CMPL SI, $0x04 JB four_bytes_remain_repeat_as_copy_calcBlockSize JMP four_bytes_loop_back_repeat_as_copy_calcBlockSize four_bytes_remain_repeat_as_copy_calcBlockSize: - TESTL BX, BX + TESTL SI, SI JZ repeat_end_emit_calcBlockSize - XORL BX, BX - ADDQ $0x05, AX + XORL SI, SI + ADDQ $0x05, CX JMP repeat_end_emit_calcBlockSize two_byte_offset_repeat_as_copy_calcBlockSize: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_calcBlockSize - LEAL -60(BX), BX - ADDQ $0x03, AX + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_calcBlockSize two_byte_offset_short_repeat_as_copy_calcBlockSize: - MOVL BX, DI - SHLL $0x02, DI - CMPL BX, $0x0c + MOVL SI, R8 + SHLL $0x02, R8 + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_calcBlockSize - CMPL SI, $0x00000800 + CMPL DI, $0x00000800 JAE emit_copy_three_repeat_as_copy_calcBlockSize - ADDQ $0x02, AX + ADDQ $0x02, CX JMP repeat_end_emit_calcBlockSize emit_copy_three_repeat_as_copy_calcBlockSize: - ADDQ $0x03, AX + ADDQ $0x03, CX repeat_end_emit_calcBlockSize: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_calcBlockSize no_repeat_found_calcBlockSize: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_calcBlockSize - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_calcBlockSize - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_calcBlockSize - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_calcBlockSize candidate3_match_calcBlockSize: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_calcBlockSize candidate2_match_calcBlockSize: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_calcBlockSize: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_calcBlockSize match_extend_back_loop_calcBlockSize: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_calcBlockSize - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_calcBlockSize - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_calcBlockSize JMP match_extend_back_loop_calcBlockSize match_extend_back_end_calcBlockSize: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 5(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 5(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_calcBlockSize - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET match_dst_size_check_calcBlockSize: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_calcBlockSize - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), SI - CMPL SI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), DI + CMPL DI, $0x3c JB one_byte_match_emit_calcBlockSize - CMPL SI, $0x00000100 + CMPL DI, $0x00000100 JB two_bytes_match_emit_calcBlockSize - CMPL SI, $0x00010000 + CMPL DI, $0x00010000 JB three_bytes_match_emit_calcBlockSize - CMPL SI, $0x01000000 + CMPL DI, $0x01000000 JB four_bytes_match_emit_calcBlockSize - ADDQ $0x05, AX + ADDQ $0x05, CX JMP memmove_long_match_emit_calcBlockSize four_bytes_match_emit_calcBlockSize: - ADDQ $0x04, AX + ADDQ $0x04, CX JMP memmove_long_match_emit_calcBlockSize three_bytes_match_emit_calcBlockSize: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_match_emit_calcBlockSize two_bytes_match_emit_calcBlockSize: - ADDQ $0x02, AX - CMPL SI, $0x40 + ADDQ $0x02, CX + CMPL DI, $0x40 JB memmove_match_emit_calcBlockSize JMP memmove_long_match_emit_calcBlockSize one_byte_match_emit_calcBlockSize: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_match_emit_calcBlockSize: - LEAQ (AX)(R8*1), AX + LEAQ (CX)(R9*1), CX JMP emit_literal_done_match_emit_calcBlockSize memmove_long_match_emit_calcBlockSize: - LEAQ (AX)(R8*1), AX + LEAQ (CX)(R9*1), CX emit_literal_done_match_emit_calcBlockSize: match_nolit_loop_calcBlockSize: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+8(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+8(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_calcBlockSize: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_calcBlockSize - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_calcBlockSize - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_calcBlockSize - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_calcBlockSize matchlen_bsf_16match_nolit_calcBlockSize: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_calcBlockSize matchlen_match8_match_nolit_calcBlockSize: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_calcBlockSize - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_calcBlockSize - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_calcBlockSize matchlen_bsf_8_match_nolit_calcBlockSize: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_calcBlockSize matchlen_match4_match_nolit_calcBlockSize: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_calcBlockSize - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_calcBlockSize - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_calcBlockSize: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_calcBlockSize JB match_nolit_end_calcBlockSize - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_calcBlockSize - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_calcBlockSize matchlen_match1_match_nolit_calcBlockSize: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_calcBlockSize - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_calcBlockSize: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy - CMPL BX, $0x00010000 + CMPL SI, $0x00010000 JB two_byte_offset_match_nolit_calcBlockSize four_bytes_loop_back_match_nolit_calcBlockSize: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE four_bytes_remain_match_nolit_calcBlockSize - LEAL -64(R9), R9 - ADDQ $0x05, AX - CMPL R9, $0x04 + LEAL -64(R10), R10 + ADDQ $0x05, CX + CMPL R10, $0x04 JB four_bytes_remain_match_nolit_calcBlockSize JMP four_bytes_loop_back_match_nolit_calcBlockSize four_bytes_remain_match_nolit_calcBlockSize: - TESTL R9, R9 + TESTL R10, R10 JZ match_nolit_emitcopy_end_calcBlockSize - XORL BX, BX - ADDQ $0x05, AX + XORL SI, SI + ADDQ $0x05, CX JMP match_nolit_emitcopy_end_calcBlockSize two_byte_offset_match_nolit_calcBlockSize: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_calcBlockSize - LEAL -60(R9), R9 - ADDQ $0x03, AX + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_calcBlockSize two_byte_offset_short_match_nolit_calcBlockSize: - MOVL R9, SI - SHLL $0x02, SI - CMPL R9, $0x0c + MOVL R10, DI + SHLL $0x02, DI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_calcBlockSize - CMPL BX, $0x00000800 + CMPL SI, $0x00000800 JAE emit_copy_three_match_nolit_calcBlockSize - ADDQ $0x02, AX + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_calcBlockSize emit_copy_three_match_nolit_calcBlockSize: - ADDQ $0x03, AX + ADDQ $0x03, CX match_nolit_emitcopy_end_calcBlockSize: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_calcBlockSize - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_calcBlockSize - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET match_nolit_dst_ok_calcBlockSize: - MOVQ $0x0000cf1bbcdcbf9b, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x10, DI - IMULQ R8, DI - SHRQ $0x33, DI - SHLQ $0x10, BX - IMULQ R8, BX - SHRQ $0x33, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x0000cf1bbcdcbf9b, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x10, R8 + IMULQ R9, R8 + SHRQ $0x33, R8 + SHLQ $0x10, SI + IMULQ R9, SI + SHRQ $0x33, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_calcBlockSize - INCL CX + INCL DX JMP search_loop_calcBlockSize emit_remainder_calcBlockSize: - MOVQ src_len+8(FP), CX - SUBL 12(SP), CX - LEAQ 5(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+8(FP), AX + SUBL 12(SP), AX + LEAQ 5(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_calcBlockSize - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET emit_remainder_ok_calcBlockSize: - MOVQ src_len+8(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+8(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_calcBlockSize - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI - LEAL -1(SI), CX - CMPL CX, $0x3c + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI + LEAL -1(SI), AX + CMPL AX, $0x3c JB one_byte_emit_remainder_calcBlockSize - CMPL CX, $0x00000100 + CMPL AX, $0x00000100 JB two_bytes_emit_remainder_calcBlockSize - CMPL CX, $0x00010000 + CMPL AX, $0x00010000 JB three_bytes_emit_remainder_calcBlockSize - CMPL CX, $0x01000000 + CMPL AX, $0x01000000 JB four_bytes_emit_remainder_calcBlockSize - ADDQ $0x05, AX + ADDQ $0x05, CX JMP memmove_long_emit_remainder_calcBlockSize four_bytes_emit_remainder_calcBlockSize: - ADDQ $0x04, AX + ADDQ $0x04, CX JMP memmove_long_emit_remainder_calcBlockSize three_bytes_emit_remainder_calcBlockSize: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_emit_remainder_calcBlockSize two_bytes_emit_remainder_calcBlockSize: - ADDQ $0x02, AX - CMPL CX, $0x40 + ADDQ $0x02, CX + CMPL AX, $0x40 JB memmove_emit_remainder_calcBlockSize JMP memmove_long_emit_remainder_calcBlockSize one_byte_emit_remainder_calcBlockSize: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_emit_remainder_calcBlockSize: - LEAQ (AX)(SI*1), AX + LEAQ (CX)(SI*1), AX + MOVQ AX, CX JMP emit_literal_done_emit_remainder_calcBlockSize memmove_long_emit_remainder_calcBlockSize: - LEAQ (AX)(SI*1), AX + LEAQ (CX)(SI*1), AX + MOVQ AX, CX emit_literal_done_emit_remainder_calcBlockSize: - MOVQ AX, ret+24(FP) + MOVQ CX, ret+32(FP) RET -// func calcBlockSizeSmall(src []byte) int +// func calcBlockSizeSmall(src []byte, tmp *[2048]byte) int // Requires: BMI, SSE2 -TEXT ·calcBlockSizeSmall(SB), $2072-32 - XORQ AX, AX - MOVQ $0x00000010, CX - LEAQ 24(SP), DX +TEXT ·calcBlockSizeSmall(SB), $24-40 + MOVQ tmp+24(FP), AX + XORQ CX, CX + MOVQ $0x00000010, DX + MOVQ AX, BX PXOR X0, X0 zero_loop_calcBlockSizeSmall: - MOVOU X0, (DX) - MOVOU X0, 16(DX) - MOVOU X0, 32(DX) - MOVOU X0, 48(DX) - MOVOU X0, 64(DX) - MOVOU X0, 80(DX) - MOVOU X0, 96(DX) - MOVOU X0, 112(DX) - ADDQ $0x80, DX - DECQ CX + MOVOU X0, (BX) + MOVOU X0, 16(BX) + MOVOU X0, 32(BX) + MOVOU X0, 48(BX) + MOVOU X0, 64(BX) + MOVOU X0, 80(BX) + MOVOU X0, 96(BX) + MOVOU X0, 112(BX) + ADDQ $0x80, BX + DECQ DX JNZ zero_loop_calcBlockSizeSmall MOVL $0x00000000, 12(SP) - MOVQ src_len+8(FP), CX - LEAQ -9(CX), DX - LEAQ -8(CX), BX - MOVL BX, 8(SP) - SHRQ $0x05, CX - SUBL CX, DX - LEAQ (AX)(DX*1), DX - MOVQ DX, (SP) - MOVL $0x00000001, CX - MOVL CX, 16(SP) - MOVQ src_base+0(FP), DX + MOVQ src_len+8(FP), DX + LEAQ -9(DX), BX + LEAQ -8(DX), SI + MOVL SI, 8(SP) + SHRQ $0x05, DX + SUBL DX, BX + LEAQ (CX)(BX*1), BX + MOVQ BX, (SP) + MOVL $0x00000001, DX + MOVL DX, 16(SP) + MOVQ src_base+0(FP), BX search_loop_calcBlockSizeSmall: - MOVL CX, BX - SUBL 12(SP), BX - SHRL $0x04, BX - LEAL 4(CX)(BX*1), BX - CMPL BX, 8(SP) + MOVL DX, SI + SUBL 12(SP), SI + SHRL $0x04, SI + LEAL 4(DX)(SI*1), SI + CMPL SI, 8(SP) JAE emit_remainder_calcBlockSizeSmall - MOVQ (DX)(CX*1), SI - MOVL BX, 20(SP) - MOVQ $0x9e3779b1, R8 - MOVQ SI, R9 - MOVQ SI, R10 - SHRQ $0x08, R10 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x37, R9 + MOVQ (BX)(DX*1), DI + MOVL SI, 20(SP) + MOVQ $0x9e3779b1, R9 + MOVQ DI, R10 + MOVQ DI, R11 + SHRQ $0x08, R11 SHLQ $0x20, R10 - IMULQ R8, R10 + IMULQ R9, R10 SHRQ $0x37, R10 - MOVL 24(SP)(R9*4), BX - MOVL 24(SP)(R10*4), DI - MOVL CX, 24(SP)(R9*4) - LEAL 1(CX), R9 - MOVL R9, 24(SP)(R10*4) - MOVQ SI, R9 - SHRQ $0x10, R9 - SHLQ $0x20, R9 - IMULQ R8, R9 - SHRQ $0x37, R9 - MOVL CX, R8 - SUBL 16(SP), R8 - MOVL 1(DX)(R8*1), R10 - MOVQ SI, R8 - SHRQ $0x08, R8 - CMPL R8, R10 + SHLQ $0x20, R11 + IMULQ R9, R11 + SHRQ $0x37, R11 + MOVL (AX)(R10*4), SI + MOVL (AX)(R11*4), R8 + MOVL DX, (AX)(R10*4) + LEAL 1(DX), R10 + MOVL R10, (AX)(R11*4) + MOVQ DI, R10 + SHRQ $0x10, R10 + SHLQ $0x20, R10 + IMULQ R9, R10 + SHRQ $0x37, R10 + MOVL DX, R9 + SUBL 16(SP), R9 + MOVL 1(BX)(R9*1), R11 + MOVQ DI, R9 + SHRQ $0x08, R9 + CMPL R9, R11 JNE no_repeat_found_calcBlockSizeSmall - LEAL 1(CX), SI - MOVL 12(SP), BX - MOVL SI, DI - SUBL 16(SP), DI + LEAL 1(DX), DI + MOVL 12(SP), SI + MOVL DI, R8 + SUBL 16(SP), R8 JZ repeat_extend_back_end_calcBlockSizeSmall repeat_extend_back_loop_calcBlockSizeSmall: - CMPL SI, BX + CMPL DI, SI JBE repeat_extend_back_end_calcBlockSizeSmall - MOVB -1(DX)(DI*1), R8 - MOVB -1(DX)(SI*1), R9 - CMPB R8, R9 + MOVB -1(BX)(R8*1), R9 + MOVB -1(BX)(DI*1), R10 + CMPB R9, R10 JNE repeat_extend_back_end_calcBlockSizeSmall - LEAL -1(SI), SI - DECL DI + LEAL -1(DI), DI + DECL R8 JNZ repeat_extend_back_loop_calcBlockSizeSmall repeat_extend_back_end_calcBlockSizeSmall: - MOVL SI, BX - SUBL 12(SP), BX - LEAQ 3(AX)(BX*1), BX - CMPQ BX, (SP) + MOVL DI, SI + SUBL 12(SP), SI + LEAQ 3(CX)(SI*1), SI + CMPQ SI, (SP) JB repeat_dst_size_check_calcBlockSizeSmall - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET repeat_dst_size_check_calcBlockSizeSmall: - MOVL 12(SP), BX - CMPL BX, SI + MOVL 12(SP), SI + CMPL SI, DI JEQ emit_literal_done_repeat_emit_calcBlockSizeSmall - MOVL SI, DI - MOVL SI, 12(SP) - LEAQ (DX)(BX*1), R8 - SUBL BX, DI - LEAL -1(DI), BX - CMPL BX, $0x3c + MOVL DI, R8 + MOVL DI, 12(SP) + LEAQ (BX)(SI*1), R9 + SUBL SI, R8 + LEAL -1(R8), SI + CMPL SI, $0x3c JB one_byte_repeat_emit_calcBlockSizeSmall - CMPL BX, $0x00000100 + CMPL SI, $0x00000100 JB two_bytes_repeat_emit_calcBlockSizeSmall JB three_bytes_repeat_emit_calcBlockSizeSmall three_bytes_repeat_emit_calcBlockSizeSmall: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_repeat_emit_calcBlockSizeSmall two_bytes_repeat_emit_calcBlockSizeSmall: - ADDQ $0x02, AX - CMPL BX, $0x40 + ADDQ $0x02, CX + CMPL SI, $0x40 JB memmove_repeat_emit_calcBlockSizeSmall JMP memmove_long_repeat_emit_calcBlockSizeSmall one_byte_repeat_emit_calcBlockSizeSmall: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_repeat_emit_calcBlockSizeSmall: - LEAQ (AX)(DI*1), AX + LEAQ (CX)(R8*1), CX JMP emit_literal_done_repeat_emit_calcBlockSizeSmall memmove_long_repeat_emit_calcBlockSizeSmall: - LEAQ (AX)(DI*1), AX + LEAQ (CX)(R8*1), CX emit_literal_done_repeat_emit_calcBlockSizeSmall: - ADDL $0x05, CX - MOVL CX, BX - SUBL 16(SP), BX - MOVQ src_len+8(FP), DI - SUBL CX, DI - LEAQ (DX)(CX*1), R8 - LEAQ (DX)(BX*1), BX + ADDL $0x05, DX + MOVL DX, SI + SUBL 16(SP), SI + MOVQ src_len+8(FP), R8 + SUBL DX, R8 + LEAQ (BX)(DX*1), R9 + LEAQ (BX)(SI*1), SI // matchLen - XORL R10, R10 + XORL R11, R11 matchlen_loopback_16_repeat_extend_calcBlockSizeSmall: - CMPL DI, $0x10 + CMPL R8, $0x10 JB matchlen_match8_repeat_extend_calcBlockSizeSmall - MOVQ (R8)(R10*1), R9 - MOVQ 8(R8)(R10*1), R11 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + MOVQ 8(R9)(R11*1), R12 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_calcBlockSizeSmall - XORQ 8(BX)(R10*1), R11 + XORQ 8(SI)(R11*1), R12 JNZ matchlen_bsf_16repeat_extend_calcBlockSizeSmall - LEAL -16(DI), DI - LEAL 16(R10), R10 + LEAL -16(R8), R8 + LEAL 16(R11), R11 JMP matchlen_loopback_16_repeat_extend_calcBlockSizeSmall matchlen_bsf_16repeat_extend_calcBlockSizeSmall: #ifdef GOAMD64_v3 - TZCNTQ R11, R11 + TZCNTQ R12, R12 #else - BSFQ R11, R11 + BSFQ R12, R12 #endif - SARQ $0x03, R11 - LEAL 8(R10)(R11*1), R10 + SARQ $0x03, R12 + LEAL 8(R11)(R12*1), R11 JMP repeat_extend_forward_end_calcBlockSizeSmall matchlen_match8_repeat_extend_calcBlockSizeSmall: - CMPL DI, $0x08 + CMPL R8, $0x08 JB matchlen_match4_repeat_extend_calcBlockSizeSmall - MOVQ (R8)(R10*1), R9 - XORQ (BX)(R10*1), R9 + MOVQ (R9)(R11*1), R10 + XORQ (SI)(R11*1), R10 JNZ matchlen_bsf_8_repeat_extend_calcBlockSizeSmall - LEAL -8(DI), DI - LEAL 8(R10), R10 + LEAL -8(R8), R8 + LEAL 8(R11), R11 JMP matchlen_match4_repeat_extend_calcBlockSizeSmall matchlen_bsf_8_repeat_extend_calcBlockSizeSmall: #ifdef GOAMD64_v3 - TZCNTQ R9, R9 + TZCNTQ R10, R10 #else - BSFQ R9, R9 + BSFQ R10, R10 #endif - SARQ $0x03, R9 - LEAL (R10)(R9*1), R10 + SARQ $0x03, R10 + LEAL (R11)(R10*1), R11 JMP repeat_extend_forward_end_calcBlockSizeSmall matchlen_match4_repeat_extend_calcBlockSizeSmall: - CMPL DI, $0x04 + CMPL R8, $0x04 JB matchlen_match2_repeat_extend_calcBlockSizeSmall - MOVL (R8)(R10*1), R9 - CMPL (BX)(R10*1), R9 + MOVL (R9)(R11*1), R10 + CMPL (SI)(R11*1), R10 JNE matchlen_match2_repeat_extend_calcBlockSizeSmall - LEAL -4(DI), DI - LEAL 4(R10), R10 + LEAL -4(R8), R8 + LEAL 4(R11), R11 matchlen_match2_repeat_extend_calcBlockSizeSmall: - CMPL DI, $0x01 + CMPL R8, $0x01 JE matchlen_match1_repeat_extend_calcBlockSizeSmall JB repeat_extend_forward_end_calcBlockSizeSmall - MOVW (R8)(R10*1), R9 - CMPW (BX)(R10*1), R9 + MOVW (R9)(R11*1), R10 + CMPW (SI)(R11*1), R10 JNE matchlen_match1_repeat_extend_calcBlockSizeSmall - LEAL 2(R10), R10 - SUBL $0x02, DI + LEAL 2(R11), R11 + SUBL $0x02, R8 JZ repeat_extend_forward_end_calcBlockSizeSmall matchlen_match1_repeat_extend_calcBlockSizeSmall: - MOVB (R8)(R10*1), R9 - CMPB (BX)(R10*1), R9 + MOVB (R9)(R11*1), R10 + CMPB (SI)(R11*1), R10 JNE repeat_extend_forward_end_calcBlockSizeSmall - LEAL 1(R10), R10 + LEAL 1(R11), R11 repeat_extend_forward_end_calcBlockSizeSmall: - ADDL R10, CX - MOVL CX, BX - SUBL SI, BX - MOVL 16(SP), SI + ADDL R11, DX + MOVL DX, SI + SUBL DI, SI + MOVL 16(SP), DI // emitCopy two_byte_offset_repeat_as_copy_calcBlockSizeSmall: - CMPL BX, $0x40 + CMPL SI, $0x40 JBE two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall - LEAL -60(BX), BX - ADDQ $0x03, AX + LEAL -60(SI), SI + ADDQ $0x03, CX JMP two_byte_offset_repeat_as_copy_calcBlockSizeSmall two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall: - MOVL BX, SI - SHLL $0x02, SI - CMPL BX, $0x0c + MOVL SI, DI + SHLL $0x02, DI + CMPL SI, $0x0c JAE emit_copy_three_repeat_as_copy_calcBlockSizeSmall - ADDQ $0x02, AX + ADDQ $0x02, CX JMP repeat_end_emit_calcBlockSizeSmall emit_copy_three_repeat_as_copy_calcBlockSizeSmall: - ADDQ $0x03, AX + ADDQ $0x03, CX repeat_end_emit_calcBlockSizeSmall: - MOVL CX, 12(SP) + MOVL DX, 12(SP) JMP search_loop_calcBlockSizeSmall no_repeat_found_calcBlockSizeSmall: - CMPL (DX)(BX*1), SI + CMPL (BX)(SI*1), DI JEQ candidate_match_calcBlockSizeSmall - SHRQ $0x08, SI - MOVL 24(SP)(R9*4), BX - LEAL 2(CX), R8 - CMPL (DX)(DI*1), SI + SHRQ $0x08, DI + MOVL (AX)(R10*4), SI + LEAL 2(DX), R9 + CMPL (BX)(R8*1), DI JEQ candidate2_match_calcBlockSizeSmall - MOVL R8, 24(SP)(R9*4) - SHRQ $0x08, SI - CMPL (DX)(BX*1), SI + MOVL R9, (AX)(R10*4) + SHRQ $0x08, DI + CMPL (BX)(SI*1), DI JEQ candidate3_match_calcBlockSizeSmall - MOVL 20(SP), CX + MOVL 20(SP), DX JMP search_loop_calcBlockSizeSmall candidate3_match_calcBlockSizeSmall: - ADDL $0x02, CX + ADDL $0x02, DX JMP candidate_match_calcBlockSizeSmall candidate2_match_calcBlockSizeSmall: - MOVL R8, 24(SP)(R9*4) - INCL CX - MOVL DI, BX + MOVL R9, (AX)(R10*4) + INCL DX + MOVL R8, SI candidate_match_calcBlockSizeSmall: - MOVL 12(SP), SI - TESTL BX, BX + MOVL 12(SP), DI + TESTL SI, SI JZ match_extend_back_end_calcBlockSizeSmall match_extend_back_loop_calcBlockSizeSmall: - CMPL CX, SI + CMPL DX, DI JBE match_extend_back_end_calcBlockSizeSmall - MOVB -1(DX)(BX*1), DI - MOVB -1(DX)(CX*1), R8 - CMPB DI, R8 + MOVB -1(BX)(SI*1), R8 + MOVB -1(BX)(DX*1), R9 + CMPB R8, R9 JNE match_extend_back_end_calcBlockSizeSmall - LEAL -1(CX), CX - DECL BX + LEAL -1(DX), DX + DECL SI JZ match_extend_back_end_calcBlockSizeSmall JMP match_extend_back_loop_calcBlockSizeSmall match_extend_back_end_calcBlockSizeSmall: - MOVL CX, SI - SUBL 12(SP), SI - LEAQ 3(AX)(SI*1), SI - CMPQ SI, (SP) + MOVL DX, DI + SUBL 12(SP), DI + LEAQ 3(CX)(DI*1), DI + CMPQ DI, (SP) JB match_dst_size_check_calcBlockSizeSmall - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET match_dst_size_check_calcBlockSizeSmall: - MOVL CX, SI - MOVL 12(SP), DI - CMPL DI, SI + MOVL DX, DI + MOVL 12(SP), R8 + CMPL R8, DI JEQ emit_literal_done_match_emit_calcBlockSizeSmall - MOVL SI, R8 - MOVL SI, 12(SP) - LEAQ (DX)(DI*1), SI - SUBL DI, R8 - LEAL -1(R8), SI - CMPL SI, $0x3c + MOVL DI, R9 + MOVL DI, 12(SP) + LEAQ (BX)(R8*1), DI + SUBL R8, R9 + LEAL -1(R9), DI + CMPL DI, $0x3c JB one_byte_match_emit_calcBlockSizeSmall - CMPL SI, $0x00000100 + CMPL DI, $0x00000100 JB two_bytes_match_emit_calcBlockSizeSmall JB three_bytes_match_emit_calcBlockSizeSmall three_bytes_match_emit_calcBlockSizeSmall: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_match_emit_calcBlockSizeSmall two_bytes_match_emit_calcBlockSizeSmall: - ADDQ $0x02, AX - CMPL SI, $0x40 + ADDQ $0x02, CX + CMPL DI, $0x40 JB memmove_match_emit_calcBlockSizeSmall JMP memmove_long_match_emit_calcBlockSizeSmall one_byte_match_emit_calcBlockSizeSmall: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_match_emit_calcBlockSizeSmall: - LEAQ (AX)(R8*1), AX + LEAQ (CX)(R9*1), CX JMP emit_literal_done_match_emit_calcBlockSizeSmall memmove_long_match_emit_calcBlockSizeSmall: - LEAQ (AX)(R8*1), AX + LEAQ (CX)(R9*1), CX emit_literal_done_match_emit_calcBlockSizeSmall: match_nolit_loop_calcBlockSizeSmall: - MOVL CX, SI - SUBL BX, SI - MOVL SI, 16(SP) - ADDL $0x04, CX - ADDL $0x04, BX - MOVQ src_len+8(FP), SI - SUBL CX, SI - LEAQ (DX)(CX*1), DI - LEAQ (DX)(BX*1), BX + MOVL DX, DI + SUBL SI, DI + MOVL DI, 16(SP) + ADDL $0x04, DX + ADDL $0x04, SI + MOVQ src_len+8(FP), DI + SUBL DX, DI + LEAQ (BX)(DX*1), R8 + LEAQ (BX)(SI*1), SI // matchLen - XORL R9, R9 + XORL R10, R10 matchlen_loopback_16_match_nolit_calcBlockSizeSmall: - CMPL SI, $0x10 + CMPL DI, $0x10 JB matchlen_match8_match_nolit_calcBlockSizeSmall - MOVQ (DI)(R9*1), R8 - MOVQ 8(DI)(R9*1), R10 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + MOVQ 8(R8)(R10*1), R11 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_calcBlockSizeSmall - XORQ 8(BX)(R9*1), R10 + XORQ 8(SI)(R10*1), R11 JNZ matchlen_bsf_16match_nolit_calcBlockSizeSmall - LEAL -16(SI), SI - LEAL 16(R9), R9 + LEAL -16(DI), DI + LEAL 16(R10), R10 JMP matchlen_loopback_16_match_nolit_calcBlockSizeSmall matchlen_bsf_16match_nolit_calcBlockSizeSmall: #ifdef GOAMD64_v3 - TZCNTQ R10, R10 + TZCNTQ R11, R11 #else - BSFQ R10, R10 + BSFQ R11, R11 #endif - SARQ $0x03, R10 - LEAL 8(R9)(R10*1), R9 + SARQ $0x03, R11 + LEAL 8(R10)(R11*1), R10 JMP match_nolit_end_calcBlockSizeSmall matchlen_match8_match_nolit_calcBlockSizeSmall: - CMPL SI, $0x08 + CMPL DI, $0x08 JB matchlen_match4_match_nolit_calcBlockSizeSmall - MOVQ (DI)(R9*1), R8 - XORQ (BX)(R9*1), R8 + MOVQ (R8)(R10*1), R9 + XORQ (SI)(R10*1), R9 JNZ matchlen_bsf_8_match_nolit_calcBlockSizeSmall - LEAL -8(SI), SI - LEAL 8(R9), R9 + LEAL -8(DI), DI + LEAL 8(R10), R10 JMP matchlen_match4_match_nolit_calcBlockSizeSmall matchlen_bsf_8_match_nolit_calcBlockSizeSmall: #ifdef GOAMD64_v3 - TZCNTQ R8, R8 + TZCNTQ R9, R9 #else - BSFQ R8, R8 + BSFQ R9, R9 #endif - SARQ $0x03, R8 - LEAL (R9)(R8*1), R9 + SARQ $0x03, R9 + LEAL (R10)(R9*1), R10 JMP match_nolit_end_calcBlockSizeSmall matchlen_match4_match_nolit_calcBlockSizeSmall: - CMPL SI, $0x04 + CMPL DI, $0x04 JB matchlen_match2_match_nolit_calcBlockSizeSmall - MOVL (DI)(R9*1), R8 - CMPL (BX)(R9*1), R8 + MOVL (R8)(R10*1), R9 + CMPL (SI)(R10*1), R9 JNE matchlen_match2_match_nolit_calcBlockSizeSmall - LEAL -4(SI), SI - LEAL 4(R9), R9 + LEAL -4(DI), DI + LEAL 4(R10), R10 matchlen_match2_match_nolit_calcBlockSizeSmall: - CMPL SI, $0x01 + CMPL DI, $0x01 JE matchlen_match1_match_nolit_calcBlockSizeSmall JB match_nolit_end_calcBlockSizeSmall - MOVW (DI)(R9*1), R8 - CMPW (BX)(R9*1), R8 + MOVW (R8)(R10*1), R9 + CMPW (SI)(R10*1), R9 JNE matchlen_match1_match_nolit_calcBlockSizeSmall - LEAL 2(R9), R9 - SUBL $0x02, SI + LEAL 2(R10), R10 + SUBL $0x02, DI JZ match_nolit_end_calcBlockSizeSmall matchlen_match1_match_nolit_calcBlockSizeSmall: - MOVB (DI)(R9*1), R8 - CMPB (BX)(R9*1), R8 + MOVB (R8)(R10*1), R9 + CMPB (SI)(R10*1), R9 JNE match_nolit_end_calcBlockSizeSmall - LEAL 1(R9), R9 + LEAL 1(R10), R10 match_nolit_end_calcBlockSizeSmall: - ADDL R9, CX - MOVL 16(SP), BX - ADDL $0x04, R9 - MOVL CX, 12(SP) + ADDL R10, DX + MOVL 16(SP), SI + ADDL $0x04, R10 + MOVL DX, 12(SP) // emitCopy two_byte_offset_match_nolit_calcBlockSizeSmall: - CMPL R9, $0x40 + CMPL R10, $0x40 JBE two_byte_offset_short_match_nolit_calcBlockSizeSmall - LEAL -60(R9), R9 - ADDQ $0x03, AX + LEAL -60(R10), R10 + ADDQ $0x03, CX JMP two_byte_offset_match_nolit_calcBlockSizeSmall two_byte_offset_short_match_nolit_calcBlockSizeSmall: - MOVL R9, BX - SHLL $0x02, BX - CMPL R9, $0x0c + MOVL R10, SI + SHLL $0x02, SI + CMPL R10, $0x0c JAE emit_copy_three_match_nolit_calcBlockSizeSmall - ADDQ $0x02, AX + ADDQ $0x02, CX JMP match_nolit_emitcopy_end_calcBlockSizeSmall emit_copy_three_match_nolit_calcBlockSizeSmall: - ADDQ $0x03, AX + ADDQ $0x03, CX match_nolit_emitcopy_end_calcBlockSizeSmall: - CMPL CX, 8(SP) + CMPL DX, 8(SP) JAE emit_remainder_calcBlockSizeSmall - MOVQ -2(DX)(CX*1), SI - CMPQ AX, (SP) + MOVQ -2(BX)(DX*1), DI + CMPQ CX, (SP) JB match_nolit_dst_ok_calcBlockSizeSmall - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET match_nolit_dst_ok_calcBlockSizeSmall: - MOVQ $0x9e3779b1, R8 - MOVQ SI, DI - SHRQ $0x10, SI - MOVQ SI, BX - SHLQ $0x20, DI - IMULQ R8, DI - SHRQ $0x37, DI - SHLQ $0x20, BX - IMULQ R8, BX - SHRQ $0x37, BX - LEAL -2(CX), R8 - LEAQ 24(SP)(BX*4), R9 - MOVL (R9), BX - MOVL R8, 24(SP)(DI*4) - MOVL CX, (R9) - CMPL (DX)(BX*1), SI + MOVQ $0x9e3779b1, R9 + MOVQ DI, R8 + SHRQ $0x10, DI + MOVQ DI, SI + SHLQ $0x20, R8 + IMULQ R9, R8 + SHRQ $0x37, R8 + SHLQ $0x20, SI + IMULQ R9, SI + SHRQ $0x37, SI + LEAL -2(DX), R9 + LEAQ (AX)(SI*4), R10 + MOVL (R10), SI + MOVL R9, (AX)(R8*4) + MOVL DX, (R10) + CMPL (BX)(SI*1), DI JEQ match_nolit_loop_calcBlockSizeSmall - INCL CX + INCL DX JMP search_loop_calcBlockSizeSmall emit_remainder_calcBlockSizeSmall: - MOVQ src_len+8(FP), CX - SUBL 12(SP), CX - LEAQ 3(AX)(CX*1), CX - CMPQ CX, (SP) + MOVQ src_len+8(FP), AX + SUBL 12(SP), AX + LEAQ 3(CX)(AX*1), AX + CMPQ AX, (SP) JB emit_remainder_ok_calcBlockSizeSmall - MOVQ $0x00000000, ret+24(FP) + MOVQ $0x00000000, ret+32(FP) RET emit_remainder_ok_calcBlockSizeSmall: - MOVQ src_len+8(FP), CX - MOVL 12(SP), BX - CMPL BX, CX + MOVQ src_len+8(FP), AX + MOVL 12(SP), DX + CMPL DX, AX JEQ emit_literal_done_emit_remainder_calcBlockSizeSmall - MOVL CX, SI - MOVL CX, 12(SP) - LEAQ (DX)(BX*1), CX - SUBL BX, SI - LEAL -1(SI), CX - CMPL CX, $0x3c + MOVL AX, SI + MOVL AX, 12(SP) + LEAQ (BX)(DX*1), AX + SUBL DX, SI + LEAL -1(SI), AX + CMPL AX, $0x3c JB one_byte_emit_remainder_calcBlockSizeSmall - CMPL CX, $0x00000100 + CMPL AX, $0x00000100 JB two_bytes_emit_remainder_calcBlockSizeSmall JB three_bytes_emit_remainder_calcBlockSizeSmall three_bytes_emit_remainder_calcBlockSizeSmall: - ADDQ $0x03, AX + ADDQ $0x03, CX JMP memmove_long_emit_remainder_calcBlockSizeSmall two_bytes_emit_remainder_calcBlockSizeSmall: - ADDQ $0x02, AX - CMPL CX, $0x40 + ADDQ $0x02, CX + CMPL AX, $0x40 JB memmove_emit_remainder_calcBlockSizeSmall JMP memmove_long_emit_remainder_calcBlockSizeSmall one_byte_emit_remainder_calcBlockSizeSmall: - ADDQ $0x01, AX + ADDQ $0x01, CX memmove_emit_remainder_calcBlockSizeSmall: - LEAQ (AX)(SI*1), AX + LEAQ (CX)(SI*1), AX + MOVQ AX, CX JMP emit_literal_done_emit_remainder_calcBlockSizeSmall memmove_long_emit_remainder_calcBlockSizeSmall: - LEAQ (AX)(SI*1), AX + LEAQ (CX)(SI*1), AX + MOVQ AX, CX emit_literal_done_emit_remainder_calcBlockSizeSmall: - MOVQ AX, ret+24(FP) + MOVQ CX, ret+32(FP) RET // func emitLiteral(dst []byte, lit []byte) int @@ -19783,7 +19809,7 @@ TEXT ·cvtLZ4BlockAsm(SB), NOSPLIT, $0-64 MOVQ src_base+24(FP), DX MOVQ src_len+32(FP), BX LEAQ (DX)(BX*1), BX - LEAQ -10(AX)(CX*1), CX + LEAQ -8(AX)(CX*1), CX XORQ DI, DI lz4_s2_loop: @@ -20266,7 +20292,7 @@ TEXT ·cvtLZ4sBlockAsm(SB), NOSPLIT, $0-64 MOVQ src_base+24(FP), DX MOVQ src_len+32(FP), BX LEAQ (DX)(BX*1), BX - LEAQ -10(AX)(CX*1), CX + LEAQ -8(AX)(CX*1), CX XORQ DI, DI lz4s_s2_loop: @@ -20751,7 +20777,7 @@ TEXT ·cvtLZ4BlockSnappyAsm(SB), NOSPLIT, $0-64 MOVQ src_base+24(FP), DX MOVQ src_len+32(FP), BX LEAQ (DX)(BX*1), BX - LEAQ -10(AX)(CX*1), CX + LEAQ -8(AX)(CX*1), CX lz4_snappy_loop: CMPQ DX, BX @@ -21017,7 +21043,7 @@ TEXT ·cvtLZ4sBlockSnappyAsm(SB), NOSPLIT, $0-64 MOVQ src_base+24(FP), DX MOVQ src_len+32(FP), BX LEAQ (DX)(BX*1), BX - LEAQ -10(AX)(CX*1), CX + LEAQ -8(AX)(CX*1), CX lz4s_snappy_loop: CMPQ DX, BX diff --git a/s2/s2_test.go b/s2/s2_test.go index 9fd954ce2f..620060daf8 100644 --- a/s2/s2_test.go +++ b/s2/s2_test.go @@ -2201,3 +2201,51 @@ func TestMatchLen(t *testing.T) { } } } + +func BenchmarkDecodeBlockSingle(b *testing.B) { + for i := range testFiles { + b.Run(fmt.Sprint(i, "-", testFiles[i].label), func(b *testing.B) { + if err := downloadBenchmarkFiles(b, testFiles[i].filename); err != nil { + b.Fatalf("failed to download testdata: %s", err) + } + bDir := filepath.FromSlash(*benchdataDir) + data := readFile(b, filepath.Join(bDir, testFiles[i].filename)) + if testFiles[i].sizeLimit > 0 && len(data) > testFiles[i].sizeLimit { + data = data[:testFiles[i].sizeLimit] + } + benchDecode(b, data) + }) + } +} + +func BenchmarkDecodeBlockParallel(b *testing.B) { + for i := range testFiles { + b.Run(fmt.Sprint(i, "-", testFiles[i].label), func(b *testing.B) { + benchFile(b, i, true) + }) + } +} + +func BenchmarkEncodeBlockSingle(b *testing.B) { + for i := range testFiles { + b.Run(fmt.Sprint(i, "-", testFiles[i].label), func(b *testing.B) { + if err := downloadBenchmarkFiles(b, testFiles[i].filename); err != nil { + b.Fatalf("failed to download testdata: %s", err) + } + bDir := filepath.FromSlash(*benchdataDir) + data := readFile(b, filepath.Join(bDir, testFiles[i].filename)) + if testFiles[i].sizeLimit > 0 && len(data) > testFiles[i].sizeLimit { + data = data[:testFiles[i].sizeLimit] + } + benchEncode(b, data) + }) + } +} + +func BenchmarkEncodeBlockParallel(b *testing.B) { + for i := range testFiles { + b.Run(fmt.Sprint(i, "-", testFiles[i].label), func(b *testing.B) { + benchFile(b, i, false) + }) + } +} diff --git a/s2/testdata/fuzz/block-corpus-enc.zip b/s2/testdata/fuzz/block-corpus-enc.zip index 7f0832c8358136b8f6686c10dc5768df74b086ee..dfb2ea8b0ae42d5d699c6d0e42ce6aca3556e94e 100644 GIT binary patch delta 337928 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

3x#eXRacult^rXSEV@#xJ>eJOV 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

EZyrS{Fyf#7Z@YSlY$etl#*Dtcg$brZG>QE3c+ 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 delta 124 zcmWN^xe Date: Thu, 3 Oct 2024 20:46:02 +0200 Subject: [PATCH 2/2] Fix noasm build --- s2/encode.go | 8 ++++---- s2/encode_go.go | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/s2/encode.go b/s2/encode.go index c1b8b11eab..20b802270a 100644 --- a/s2/encode.go +++ b/s2/encode.go @@ -67,22 +67,22 @@ func EstimateBlockSize(src []byte) (d int) { } if len(src) <= 1024 { const sz, pool = 2048, 0 - tmp, ok := encPools[pool].Get().(*[sz]byte) + tmp, ok := estblockPool[pool].Get().(*[sz]byte) if !ok { tmp = &[sz]byte{} } race.WriteSlice(tmp[:]) - defer encPools[pool].Put(tmp) + defer estblockPool[pool].Put(tmp) d = calcBlockSizeSmall(src, tmp) } else { const sz, pool = 32768, 1 - tmp, ok := encPools[pool].Get().(*[sz]byte) + tmp, ok := estblockPool[pool].Get().(*[sz]byte) if !ok { tmp = &[sz]byte{} } race.WriteSlice(tmp[:]) - defer encPools[pool].Put(tmp) + defer estblockPool[pool].Put(tmp) d = calcBlockSize(src, tmp) } diff --git a/s2/encode_go.go b/s2/encode_go.go index 6b393c34d3..dd1c973ca5 100644 --- a/s2/encode_go.go +++ b/s2/encode_go.go @@ -317,7 +317,7 @@ func matchLen(a []byte, b []byte) int { } // input must be > inputMargin -func calcBlockSize(src []byte) (d int) { +func calcBlockSize(src []byte, _ *[32768]byte) (d int) { // Initialize the hash table. const ( tableBits = 13 @@ -503,7 +503,7 @@ emitRemainder: } // length must be > inputMargin. -func calcBlockSizeSmall(src []byte) (d int) { +func calcBlockSizeSmall(src []byte, _ *[2048]byte) (d int) { // Initialize the hash table. const ( tableBits = 9