The live tests reached one shared bus and assert, read and remove the mesh's own objects by their fixed names, so packages run in parallel deleted what each other read and the suite passed only one package at a time; a red suite read as noise. internal/testbus starts a server per test, linked in at the nats-server release go.mod pins, and a test holds that pin to the catalogue's bus image and to the facts snapshot's bus when there is one, so the tests never run a bus the mesh does not. The waiter test read a timing (the most connections held at one look) and now reads the state it means (the fewest held across the wait). make check runs the packages in parallel under the race detector, with a timeout.
20884 lines
523 KiB
ArmAsm
20884 lines
523 KiB
ArmAsm
// Code generated by command: go run gen.go -out ../encodeblock_amd64.s -stubs ../encodeblock_asm.go -pkg=s2. DO NOT EDIT.
|
|
|
|
//go:build (amd64 || arm64) && !appengine && !noasm && gc && !noasm
|
|
|
|
#include "textflag.h"
|
|
|
|
// func _dummy_()
|
|
TEXT ·_dummy_(SB), $0
|
|
#ifdef GOAMD64_v4
|
|
#ifndef GOAMD64_v3
|
|
#define GOAMD64_v3
|
|
#endif
|
|
#endif
|
|
RET
|
|
|
|
// func encodeBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x06, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm
|
|
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 R9, R10
|
|
SHRQ $0x32, 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(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 DI, R8
|
|
JBE repeat_extend_back_end_encodeBlockAsm
|
|
MOVB -1(BX)(SI*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeBlockAsm
|
|
LEAL -1(DI), DI
|
|
DECL SI
|
|
JNZ repeat_extend_back_loop_encodeBlockAsm
|
|
|
|
repeat_extend_back_end_encodeBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeBlockAsm
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeBlockAsm
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_repeat_emit_encodeBlockAsm
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_repeat_emit_encodeBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL SI, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
four_bytes_repeat_emit_encodeBlockAsm:
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R13*1), R11
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
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(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, (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, 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 R12, R12
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm:
|
|
CMPL R9, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeBlockAsm
|
|
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(SI)(R12*1), R13
|
|
JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm
|
|
LEAL -16(R9), R9
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm:
|
|
CMPL R9, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeBlockAsm
|
|
MOVQ (R10)(R12*1), R11
|
|
XORQ (SI)(R12*1), R11
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm
|
|
LEAL -8(R9), R9
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm:
|
|
CMPL R9, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeBlockAsm
|
|
MOVL (R10)(R12*1), R11
|
|
CMPL (SI)(R12*1), R11
|
|
JNE matchlen_match2_repeat_extend_encodeBlockAsm
|
|
LEAL -4(R9), R9
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm:
|
|
CMPL R9, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeBlockAsm
|
|
JB repeat_extend_forward_end_encodeBlockAsm
|
|
MOVW (R10)(R12*1), R11
|
|
CMPW (SI)(R12*1), R11
|
|
JNE matchlen_match1_repeat_extend_encodeBlockAsm
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R9
|
|
JZ repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm:
|
|
MOVB (R10)(R12*1), R11
|
|
CMPB (SI)(R12*1), R11
|
|
JNE repeat_extend_forward_end_encodeBlockAsm
|
|
LEAL 1(R12), R12
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm:
|
|
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 SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_match_repeat_encodeBlockAsm
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_match_repeat_encodeBlockAsm
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_match_repeat_encodeBlockAsm
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_match_repeat_encodeBlockAsm
|
|
CMPL SI, $0x0100ffff
|
|
JB repeat_five_match_repeat_encodeBlockAsm
|
|
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(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(SI), SI
|
|
MOVW $0x0019, (CX)
|
|
MOVW SI, 2(CX)
|
|
ADDQ $0x04, CX
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm:
|
|
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, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm:
|
|
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 DI, $0x00010000
|
|
JB two_byte_offset_repeat_as_copy_encodeBlockAsm
|
|
CMPL SI, $0x40
|
|
JBE four_bytes_remain_repeat_as_copy_encodeBlockAsm
|
|
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 SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPL SI, $0x0100ffff
|
|
JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
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(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(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(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, 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 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 SI, SI
|
|
JZ repeat_end_emit_encodeBlockAsm
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm
|
|
CMPL DI, $0x00000800
|
|
JAE long_offset_short_repeat_as_copy_encodeBlockAsm
|
|
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(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 SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL SI, $0x0100ffff
|
|
JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
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(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(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(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, 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 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, (CX)
|
|
MOVW DI, 1(CX)
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPL SI, $0x0100ffff
|
|
JB repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
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(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(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(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, 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 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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeBlockAsm:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
no_repeat_found_encodeBlockAsm:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeBlockAsm
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeBlockAsm
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeBlockAsm
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
candidate3_match_encodeBlockAsm:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeBlockAsm
|
|
|
|
candidate2_match_encodeBlockAsm:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBlockAsm:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBlockAsm
|
|
|
|
match_extend_back_loop_encodeBlockAsm:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBlockAsm
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBlockAsm
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBlockAsm
|
|
JMP match_extend_back_loop_encodeBlockAsm
|
|
|
|
match_extend_back_end_encodeBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeBlockAsm
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeBlockAsm
|
|
CMPL R8, $0x00010000
|
|
JB three_bytes_match_emit_encodeBlockAsm
|
|
CMPL R8, $0x01000000
|
|
JB four_bytes_match_emit_encodeBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL R8, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
four_bytes_match_emit_encodeBlockAsm:
|
|
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, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
two_bytes_match_emit_encodeBlockAsm:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBlockAsm:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm
|
|
|
|
memmove_long_match_emit_encodeBlockAsm:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_big_loop_back:
|
|
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_encodeBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBlockAsm
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeBlockAsm
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBlockAsm
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBlockAsm
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeBlockAsm
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBlockAsm
|
|
JB match_nolit_end_encodeBlockAsm
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeBlockAsm
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeBlockAsm
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeBlockAsm:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL SI, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeBlockAsm
|
|
CMPL R10, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeBlockAsm
|
|
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 R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBlockAsm_emit_copy
|
|
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(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(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(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, 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 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 R10, R10
|
|
JZ match_nolit_emitcopy_end_encodeBlockAsm
|
|
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 R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBlockAsm
|
|
CMPL SI, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBlockAsm
|
|
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(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 R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
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(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(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(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, 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 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, (CX)
|
|
MOVW SI, 1(CX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBlockAsm_emit_copy_short
|
|
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(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(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(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, 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 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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBlockAsm
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm:
|
|
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 DX
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
emit_remainder_encodeBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBlockAsm
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBlockAsm
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeBlockAsm
|
|
CMPL DX, $0x01000000
|
|
JB four_bytes_emit_remainder_encodeBlockAsm
|
|
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, (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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm4MB(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x06, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm4MB
|
|
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 R9, R10
|
|
SHRQ $0x32, 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(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 DI, R8
|
|
JBE repeat_extend_back_end_encodeBlockAsm4MB
|
|
MOVB -1(BX)(SI*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeBlockAsm4MB
|
|
LEAL -1(DI), DI
|
|
DECL SI
|
|
JNZ repeat_extend_back_loop_encodeBlockAsm4MB
|
|
|
|
repeat_extend_back_end_encodeBlockAsm4MB:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm4MB:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeBlockAsm4MB
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeBlockAsm4MB
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_repeat_emit_encodeBlockAsm4MB
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm4MB
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm4MB:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm4MB
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R13*1), R11
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
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(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, (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, 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 R12, R12
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB:
|
|
CMPL R9, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeBlockAsm4MB
|
|
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(SI)(R12*1), R13
|
|
JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm4MB
|
|
LEAL -16(R9), R9
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm4MB:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm4MB:
|
|
CMPL R9, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeBlockAsm4MB
|
|
MOVQ (R10)(R12*1), R11
|
|
XORQ (SI)(R12*1), R11
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB
|
|
LEAL -8(R9), R9
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm4MB:
|
|
CMPL R9, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeBlockAsm4MB
|
|
MOVL (R10)(R12*1), R11
|
|
CMPL (SI)(R12*1), R11
|
|
JNE matchlen_match2_repeat_extend_encodeBlockAsm4MB
|
|
LEAL -4(R9), R9
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm4MB:
|
|
CMPL R9, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeBlockAsm4MB
|
|
JB repeat_extend_forward_end_encodeBlockAsm4MB
|
|
MOVW (R10)(R12*1), R11
|
|
CMPW (SI)(R12*1), R11
|
|
JNE matchlen_match1_repeat_extend_encodeBlockAsm4MB
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R9
|
|
JZ repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm4MB:
|
|
MOVB (R10)(R12*1), R11
|
|
CMPB (SI)(R12*1), R11
|
|
JNE repeat_extend_forward_end_encodeBlockAsm4MB
|
|
LEAL 1(R12), R12
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm4MB:
|
|
ADDL R12, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
TESTL R8, R8
|
|
JZ repeat_as_copy_encodeBlockAsm4MB
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_match_repeat_encodeBlockAsm4MB
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_match_repeat_encodeBlockAsm4MB
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_match_repeat_encodeBlockAsm4MB
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_match_repeat_encodeBlockAsm4MB
|
|
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(SI), SI
|
|
MOVW $0x0019, (CX)
|
|
MOVW SI, 2(CX)
|
|
ADDQ $0x04, CX
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm4MB:
|
|
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, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm4MB:
|
|
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 DI, $0x00010000
|
|
JB two_byte_offset_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPL SI, $0x40
|
|
JBE four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB
|
|
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 SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
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(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(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, 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 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 SI, SI
|
|
JZ repeat_end_emit_encodeBlockAsm4MB
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPL DI, $0x00000800
|
|
JAE long_offset_short_repeat_as_copy_encodeBlockAsm4MB
|
|
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(SI), SI
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
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(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(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, 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 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, (CX)
|
|
MOVW DI, 1(CX)
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
CMPL SI, $0x00010100
|
|
JB repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
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(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(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, 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 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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm4MB
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeBlockAsm4MB:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
no_repeat_found_encodeBlockAsm4MB:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeBlockAsm4MB
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeBlockAsm4MB
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeBlockAsm4MB
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
candidate3_match_encodeBlockAsm4MB:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeBlockAsm4MB
|
|
|
|
candidate2_match_encodeBlockAsm4MB:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBlockAsm4MB:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBlockAsm4MB
|
|
|
|
match_extend_back_loop_encodeBlockAsm4MB:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBlockAsm4MB
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBlockAsm4MB
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBlockAsm4MB
|
|
JMP match_extend_back_loop_encodeBlockAsm4MB
|
|
|
|
match_extend_back_end_encodeBlockAsm4MB:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm4MB:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeBlockAsm4MB
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeBlockAsm4MB
|
|
CMPL R8, $0x00010000
|
|
JB three_bytes_match_emit_encodeBlockAsm4MB
|
|
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, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm4MB
|
|
|
|
two_bytes_match_emit_encodeBlockAsm4MB:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm4MB
|
|
|
|
memmove_long_match_emit_encodeBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_big_loop_back:
|
|
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_encodeBlockAsm4MBlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm4MB:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBlockAsm4MB
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeBlockAsm4MB
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm4MB:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm4MB:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBlockAsm4MB
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm4MB
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm4MB:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm4MB:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBlockAsm4MB
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeBlockAsm4MB
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm4MB:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBlockAsm4MB
|
|
JB match_nolit_end_encodeBlockAsm4MB
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeBlockAsm4MB
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm4MB:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeBlockAsm4MB
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeBlockAsm4MB:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL SI, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeBlockAsm4MB
|
|
CMPL R10, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeBlockAsm4MB
|
|
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 R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
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(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(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, 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 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 R10, R10
|
|
JZ match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
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 R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBlockAsm4MB
|
|
CMPL SI, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBlockAsm4MB
|
|
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(R10), R10
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
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(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(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, 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 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, (CX)
|
|
MOVW SI, 1(CX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
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(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(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, 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 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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm4MB
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm4MB
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm4MB:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm4MB
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBlockAsm4MB
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm4MB:
|
|
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 DX
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
emit_remainder_encodeBlockAsm4MB:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm4MB:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBlockAsm4MB
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBlockAsm4MB
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeBlockAsm4MB
|
|
MOVL DX, BX
|
|
SHRL $0x10, BX
|
|
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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm4MB
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm4MB:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBlockAsm4MB:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm4MB
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm4MB:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x05, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm12B
|
|
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 R9, R10
|
|
SHRQ $0x34, 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(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 DI, R8
|
|
JBE repeat_extend_back_end_encodeBlockAsm12B
|
|
MOVB -1(BX)(SI*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeBlockAsm12B
|
|
LEAL -1(DI), DI
|
|
DECL SI
|
|
JNZ repeat_extend_back_loop_encodeBlockAsm12B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm12B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeBlockAsm12B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeBlockAsm12B
|
|
JB three_bytes_repeat_emit_encodeBlockAsm12B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm12B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm12B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm12B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R13*1), R11
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
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(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, (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, 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 R12, R12
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm12B:
|
|
CMPL R9, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeBlockAsm12B
|
|
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(SI)(R12*1), R13
|
|
JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm12B
|
|
LEAL -16(R9), R9
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm12B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm12B:
|
|
CMPL R9, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeBlockAsm12B
|
|
MOVQ (R10)(R12*1), R11
|
|
XORQ (SI)(R12*1), R11
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm12B
|
|
LEAL -8(R9), R9
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm12B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm12B:
|
|
CMPL R9, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeBlockAsm12B
|
|
MOVL (R10)(R12*1), R11
|
|
CMPL (SI)(R12*1), R11
|
|
JNE matchlen_match2_repeat_extend_encodeBlockAsm12B
|
|
LEAL -4(R9), R9
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm12B:
|
|
CMPL R9, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeBlockAsm12B
|
|
JB repeat_extend_forward_end_encodeBlockAsm12B
|
|
MOVW (R10)(R12*1), R11
|
|
CMPW (SI)(R12*1), R11
|
|
JNE matchlen_match1_repeat_extend_encodeBlockAsm12B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R9
|
|
JZ repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm12B:
|
|
MOVB (R10)(R12*1), R11
|
|
CMPB (SI)(R12*1), R11
|
|
JNE repeat_extend_forward_end_encodeBlockAsm12B
|
|
LEAL 1(R12), R12
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm12B:
|
|
ADDL R12, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
TESTL R8, R8
|
|
JZ repeat_as_copy_encodeBlockAsm12B
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_match_repeat_encodeBlockAsm12B
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm12B
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_match_repeat_encodeBlockAsm12B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm12B:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_match_repeat_encodeBlockAsm12B
|
|
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(SI), SI
|
|
MOVW $0x0015, (CX)
|
|
MOVB SI, 2(CX)
|
|
ADDQ $0x03, CX
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm12B:
|
|
SHLL $0x02, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm12B:
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm12B
|
|
CMPL DI, $0x00000800
|
|
JAE long_offset_short_repeat_as_copy_encodeBlockAsm12B
|
|
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(SI), SI
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW DI, 1(CX)
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
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(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, 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 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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm12B
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm12B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeBlockAsm12B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
no_repeat_found_encodeBlockAsm12B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeBlockAsm12B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeBlockAsm12B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeBlockAsm12B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
candidate3_match_encodeBlockAsm12B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeBlockAsm12B
|
|
|
|
candidate2_match_encodeBlockAsm12B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBlockAsm12B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeBlockAsm12B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBlockAsm12B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBlockAsm12B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBlockAsm12B
|
|
JMP match_extend_back_loop_encodeBlockAsm12B
|
|
|
|
match_extend_back_end_encodeBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm12B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeBlockAsm12B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeBlockAsm12B
|
|
JB three_bytes_match_emit_encodeBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm12B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBlockAsm12B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm12B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_big_loop_back:
|
|
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_encodeBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm12B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBlockAsm12B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeBlockAsm12B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm12B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm12B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBlockAsm12B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm12B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm12B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm12B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBlockAsm12B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeBlockAsm12B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm12B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBlockAsm12B
|
|
JB match_nolit_end_encodeBlockAsm12B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeBlockAsm12B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm12B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeBlockAsm12B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeBlockAsm12B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBlockAsm12B
|
|
CMPL SI, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBlockAsm12B
|
|
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(R10), R10
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW SI, 1(CX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
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(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, 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 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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm12B
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm12B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm12B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm12B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm12B:
|
|
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 DX
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
emit_remainder_encodeBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm12B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBlockAsm12B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBlockAsm12B
|
|
JB three_bytes_emit_remainder_encodeBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm12B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x05, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm10B
|
|
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 R9, R10
|
|
SHRQ $0x36, 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(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 DI, R8
|
|
JBE repeat_extend_back_end_encodeBlockAsm10B
|
|
MOVB -1(BX)(SI*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeBlockAsm10B
|
|
LEAL -1(DI), DI
|
|
DECL SI
|
|
JNZ repeat_extend_back_loop_encodeBlockAsm10B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm10B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeBlockAsm10B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeBlockAsm10B
|
|
JB three_bytes_repeat_emit_encodeBlockAsm10B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm10B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm10B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm10B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R13*1), R11
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
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(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, (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, 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 R12, R12
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm10B:
|
|
CMPL R9, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeBlockAsm10B
|
|
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(SI)(R12*1), R13
|
|
JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm10B
|
|
LEAL -16(R9), R9
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm10B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm10B:
|
|
CMPL R9, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeBlockAsm10B
|
|
MOVQ (R10)(R12*1), R11
|
|
XORQ (SI)(R12*1), R11
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm10B
|
|
LEAL -8(R9), R9
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm10B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm10B:
|
|
CMPL R9, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeBlockAsm10B
|
|
MOVL (R10)(R12*1), R11
|
|
CMPL (SI)(R12*1), R11
|
|
JNE matchlen_match2_repeat_extend_encodeBlockAsm10B
|
|
LEAL -4(R9), R9
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm10B:
|
|
CMPL R9, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeBlockAsm10B
|
|
JB repeat_extend_forward_end_encodeBlockAsm10B
|
|
MOVW (R10)(R12*1), R11
|
|
CMPW (SI)(R12*1), R11
|
|
JNE matchlen_match1_repeat_extend_encodeBlockAsm10B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R9
|
|
JZ repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm10B:
|
|
MOVB (R10)(R12*1), R11
|
|
CMPB (SI)(R12*1), R11
|
|
JNE repeat_extend_forward_end_encodeBlockAsm10B
|
|
LEAL 1(R12), R12
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm10B:
|
|
ADDL R12, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
TESTL R8, R8
|
|
JZ repeat_as_copy_encodeBlockAsm10B
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_match_repeat_encodeBlockAsm10B
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm10B
|
|
CMPL DI, $0x00000800
|
|
JB repeat_two_offset_match_repeat_encodeBlockAsm10B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm10B:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_match_repeat_encodeBlockAsm10B
|
|
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(SI), SI
|
|
MOVW $0x0015, (CX)
|
|
MOVB SI, 2(CX)
|
|
ADDQ $0x03, CX
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm10B:
|
|
SHLL $0x02, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm10B:
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm10B
|
|
CMPL DI, $0x00000800
|
|
JAE long_offset_short_repeat_as_copy_encodeBlockAsm10B
|
|
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(SI), SI
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW DI, 1(CX)
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL SI, R8
|
|
LEAL -4(SI), SI
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
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(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, 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 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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm10B
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm10B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeBlockAsm10B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
no_repeat_found_encodeBlockAsm10B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeBlockAsm10B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeBlockAsm10B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeBlockAsm10B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
candidate3_match_encodeBlockAsm10B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeBlockAsm10B
|
|
|
|
candidate2_match_encodeBlockAsm10B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBlockAsm10B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeBlockAsm10B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBlockAsm10B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBlockAsm10B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBlockAsm10B
|
|
JMP match_extend_back_loop_encodeBlockAsm10B
|
|
|
|
match_extend_back_end_encodeBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm10B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeBlockAsm10B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeBlockAsm10B
|
|
JB three_bytes_match_emit_encodeBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm10B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBlockAsm10B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm10B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_big_loop_back:
|
|
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_encodeBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm10B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBlockAsm10B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeBlockAsm10B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm10B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm10B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBlockAsm10B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm10B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm10B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm10B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBlockAsm10B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeBlockAsm10B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm10B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBlockAsm10B
|
|
JB match_nolit_end_encodeBlockAsm10B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeBlockAsm10B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm10B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeBlockAsm10B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeBlockAsm10B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBlockAsm10B
|
|
CMPL SI, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBlockAsm10B
|
|
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(R10), R10
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW SI, 1(CX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R10, DI
|
|
LEAL -4(R10), R10
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
CMPL SI, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
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(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, 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 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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm10B
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm10B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm10B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm10B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm10B:
|
|
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 DX
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
emit_remainder_encodeBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm10B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBlockAsm10B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBlockAsm10B
|
|
JB three_bytes_emit_remainder_encodeBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm10B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x04, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm8B
|
|
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 R9, R10
|
|
SHRQ $0x38, 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_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 DI, R8
|
|
JBE repeat_extend_back_end_encodeBlockAsm8B
|
|
MOVB -1(BX)(SI*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeBlockAsm8B
|
|
LEAL -1(DI), DI
|
|
DECL SI
|
|
JNZ repeat_extend_back_loop_encodeBlockAsm8B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm8B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeBlockAsm8B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeBlockAsm8B
|
|
JB three_bytes_repeat_emit_encodeBlockAsm8B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm8B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm8B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm8B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R13*1), R11
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
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(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, (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, 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 R12, R12
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm8B:
|
|
CMPL R9, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeBlockAsm8B
|
|
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(SI)(R12*1), R13
|
|
JNZ matchlen_bsf_16repeat_extend_encodeBlockAsm8B
|
|
LEAL -16(R9), R9
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm8B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm8B:
|
|
CMPL R9, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeBlockAsm8B
|
|
MOVQ (R10)(R12*1), R11
|
|
XORQ (SI)(R12*1), R11
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeBlockAsm8B
|
|
LEAL -8(R9), R9
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm8B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm8B:
|
|
CMPL R9, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeBlockAsm8B
|
|
MOVL (R10)(R12*1), R11
|
|
CMPL (SI)(R12*1), R11
|
|
JNE matchlen_match2_repeat_extend_encodeBlockAsm8B
|
|
LEAL -4(R9), R9
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm8B:
|
|
CMPL R9, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeBlockAsm8B
|
|
JB repeat_extend_forward_end_encodeBlockAsm8B
|
|
MOVW (R10)(R12*1), R11
|
|
CMPW (SI)(R12*1), R11
|
|
JNE matchlen_match1_repeat_extend_encodeBlockAsm8B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R9
|
|
JZ repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm8B:
|
|
MOVB (R10)(R12*1), R11
|
|
CMPB (SI)(R12*1), R11
|
|
JNE repeat_extend_forward_end_encodeBlockAsm8B
|
|
LEAL 1(R12), R12
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm8B:
|
|
ADDL R12, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
TESTL R8, R8
|
|
JZ repeat_as_copy_encodeBlockAsm8B
|
|
|
|
// emitRepeat
|
|
MOVL SI, DI
|
|
LEAL -4(SI), SI
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_match_repeat_encodeBlockAsm8B
|
|
CMPL DI, $0x0c
|
|
JAE cant_repeat_two_offset_match_repeat_encodeBlockAsm8B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm8B:
|
|
CMPL SI, $0x00000104
|
|
JB repeat_three_match_repeat_encodeBlockAsm8B
|
|
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(SI), SI
|
|
MOVW $0x0015, (CX)
|
|
MOVB SI, 2(CX)
|
|
ADDQ $0x03, CX
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm8B:
|
|
SHLL $0x02, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeBlockAsm8B
|
|
CMPL DI, $0x00000800
|
|
JAE long_offset_short_repeat_as_copy_encodeBlockAsm8B
|
|
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(SI), SI
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
MOVL SI, DI
|
|
LEAL -4(SI), SI
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
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(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, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
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, (CX)
|
|
MOVW DI, 1(CX)
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL SI, DI
|
|
LEAL -4(SI), SI
|
|
CMPL DI, $0x08
|
|
JBE repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short
|
|
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 SI, $0x00000104
|
|
JB repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short
|
|
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(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, SI
|
|
ORL $0x01, SI
|
|
MOVW SI, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeBlockAsm8B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeBlockAsm8B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
no_repeat_found_encodeBlockAsm8B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeBlockAsm8B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeBlockAsm8B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeBlockAsm8B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
candidate3_match_encodeBlockAsm8B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeBlockAsm8B
|
|
|
|
candidate2_match_encodeBlockAsm8B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBlockAsm8B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeBlockAsm8B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBlockAsm8B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBlockAsm8B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBlockAsm8B
|
|
JMP match_extend_back_loop_encodeBlockAsm8B
|
|
|
|
match_extend_back_end_encodeBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm8B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeBlockAsm8B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeBlockAsm8B
|
|
JB three_bytes_match_emit_encodeBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm8B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBlockAsm8B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm8B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_big_loop_back:
|
|
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(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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm8B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBlockAsm8B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeBlockAsm8B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm8B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm8B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBlockAsm8B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBlockAsm8B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm8B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm8B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBlockAsm8B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeBlockAsm8B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm8B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBlockAsm8B
|
|
JB match_nolit_end_encodeBlockAsm8B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeBlockAsm8B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm8B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeBlockAsm8B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeBlockAsm8B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBlockAsm8B
|
|
CMPL SI, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBlockAsm8B
|
|
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(R10), R10
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
MOVL R10, SI
|
|
LEAL -4(R10), R10
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
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(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, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R10, SI
|
|
LEAL -4(R10), R10
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short
|
|
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 R10, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short
|
|
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(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, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBlockAsm8B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm8B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBlockAsm8B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm8B:
|
|
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 DX
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
emit_remainder_encodeBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm8B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBlockAsm8B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBlockAsm8B
|
|
JB three_bytes_emit_remainder_encodeBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm8B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeBetterBlockAsm:
|
|
MOVL DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x07, SI
|
|
CMPL SI, $0x63
|
|
JBE check_maxskip_ok_encodeBetterBlockAsm
|
|
LEAL 100(DX), SI
|
|
JMP check_maxskip_cont_encodeBetterBlockAsm
|
|
|
|
check_maxskip_ok_encodeBetterBlockAsm:
|
|
LEAL 1(DX)(SI*1), SI
|
|
|
|
check_maxskip_cont_encodeBetterBlockAsm:
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm
|
|
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 R11, DI
|
|
JNE no_short_found_encodeBetterBlockAsm
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeBetterBlockAsm
|
|
|
|
no_short_found_encodeBetterBlockAsm:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeBetterBlockAsm
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeBetterBlockAsm
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBetterBlockAsm
|
|
|
|
candidateS_match_encodeBetterBlockAsm:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBetterBlockAsm:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBetterBlockAsm
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBetterBlockAsm
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBetterBlockAsm
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBetterBlockAsm
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBetterBlockAsm
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeBetterBlockAsm
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBetterBlockAsm
|
|
JB match_nolit_end_encodeBetterBlockAsm
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeBetterBlockAsm
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeBetterBlockAsm
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeBetterBlockAsm:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL 16(SP), R8
|
|
JEQ match_is_repeat_encodeBetterBlockAsm
|
|
CMPL R12, $0x01
|
|
JA match_length_ok_encodeBetterBlockAsm
|
|
CMPL R8, $0x0000ffff
|
|
JBE match_length_ok_encodeBetterBlockAsm
|
|
MOVL 20(SP), DX
|
|
INCL DX
|
|
JMP search_loop_encodeBetterBlockAsm
|
|
|
|
match_length_ok_encodeBetterBlockAsm:
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeBetterBlockAsm
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeBetterBlockAsm
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_match_emit_encodeBetterBlockAsm
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_match_emit_encodeBetterBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL SI, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
four_bytes_match_emit_encodeBetterBlockAsm:
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R8, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeBetterBlockAsm
|
|
CMPL R12, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeBetterBlockAsm
|
|
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 R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPL R12, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
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(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(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(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, 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 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 R12, R12
|
|
JZ match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
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 R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm
|
|
CMPL R8, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBetterBlockAsm
|
|
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(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 R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPL R12, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
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(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(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(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, 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 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, (CX)
|
|
MOVW R8, 1(CX)
|
|
LEAL -60(R12), R12
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPL R12, $0x0100ffff
|
|
JB repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
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(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(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(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, 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 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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm
|
|
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(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), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL SI, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
four_bytes_match_emit_repeat_encodeBetterBlockAsm:
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_repeat_encodeBetterBlockAsm:
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPL R12, $0x0100ffff
|
|
JB repeat_five_match_nolit_repeat_encodeBetterBlockAsm
|
|
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(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(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(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, R12
|
|
ORL $0x01, R12
|
|
MOVW R12, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm:
|
|
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 DX, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm
|
|
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 R8, R9
|
|
JAE search_loop_encodeBetterBlockAsm
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x08, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x2f, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 5(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeBetterBlockAsm
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBetterBlockAsm
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeBetterBlockAsm
|
|
CMPL DX, $0x01000000
|
|
JB four_bytes_emit_remainder_encodeBetterBlockAsm
|
|
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, (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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm4MB(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeBetterBlockAsm4MB:
|
|
MOVL DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x07, SI
|
|
CMPL SI, $0x63
|
|
JBE check_maxskip_ok_encodeBetterBlockAsm4MB
|
|
LEAL 100(DX), SI
|
|
JMP check_maxskip_cont_encodeBetterBlockAsm4MB
|
|
|
|
check_maxskip_ok_encodeBetterBlockAsm4MB:
|
|
LEAL 1(DX)(SI*1), SI
|
|
|
|
check_maxskip_cont_encodeBetterBlockAsm4MB:
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm4MB
|
|
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 R11, DI
|
|
JNE no_short_found_encodeBetterBlockAsm4MB
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeBetterBlockAsm4MB
|
|
|
|
no_short_found_encodeBetterBlockAsm4MB:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeBetterBlockAsm4MB
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeBetterBlockAsm4MB
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBetterBlockAsm4MB
|
|
|
|
candidateS_match_encodeBetterBlockAsm4MB:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBetterBlockAsm4MB:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm4MB
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm4MB:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBetterBlockAsm4MB
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBetterBlockAsm4MB
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm4MB
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm4MB
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm4MB:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm4MB:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBetterBlockAsm4MB
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeBetterBlockAsm4MB
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBetterBlockAsm4MB
|
|
JB match_nolit_end_encodeBetterBlockAsm4MB
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeBetterBlockAsm4MB
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm4MB:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeBetterBlockAsm4MB
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeBetterBlockAsm4MB:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL 16(SP), R8
|
|
JEQ match_is_repeat_encodeBetterBlockAsm4MB
|
|
CMPL R12, $0x01
|
|
JA match_length_ok_encodeBetterBlockAsm4MB
|
|
CMPL R8, $0x0000ffff
|
|
JBE match_length_ok_encodeBetterBlockAsm4MB
|
|
MOVL 20(SP), DX
|
|
INCL DX
|
|
JMP search_loop_encodeBetterBlockAsm4MB
|
|
|
|
match_length_ok_encodeBetterBlockAsm4MB:
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeBetterBlockAsm4MB
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeBetterBlockAsm4MB
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_match_emit_encodeBetterBlockAsm4MB
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm4MB:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R8, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPL R12, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB
|
|
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 R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
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(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(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, 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 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 R12, R12
|
|
JZ match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
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 R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPL R8, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBetterBlockAsm4MB
|
|
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(R12), R12
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
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(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(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, 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 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, (CX)
|
|
MOVW R8, 1(CX)
|
|
LEAL -60(R12), R12
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
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(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(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, 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 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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm4MB
|
|
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(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), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPL R12, $0x00010100
|
|
JB repeat_four_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
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(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(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, R12
|
|
ORL $0x01, R12
|
|
MOVW R12, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
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 DX, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm4MB
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBetterBlockAsm4MB
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm4MB:
|
|
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 R8, R9
|
|
JAE search_loop_encodeBetterBlockAsm4MB
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x08, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x2f, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 4(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeBetterBlockAsm4MB
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm4MB:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBetterBlockAsm4MB
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeBetterBlockAsm4MB
|
|
MOVL DX, BX
|
|
SHRL $0x10, BX
|
|
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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm4MB:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm4MB:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeBetterBlockAsm12B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeBetterBlockAsm12B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeBetterBlockAsm12B
|
|
|
|
no_short_found_encodeBetterBlockAsm12B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeBetterBlockAsm12B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeBetterBlockAsm12B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBetterBlockAsm12B
|
|
|
|
candidateS_match_encodeBetterBlockAsm12B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBetterBlockAsm12B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm12B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBetterBlockAsm12B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBetterBlockAsm12B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm12B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm12B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm12B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBetterBlockAsm12B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBetterBlockAsm12B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBetterBlockAsm12B
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeBetterBlockAsm12B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBetterBlockAsm12B
|
|
JB match_nolit_end_encodeBetterBlockAsm12B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeBetterBlockAsm12B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm12B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeBetterBlockAsm12B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeBetterBlockAsm12B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL 16(SP), R8
|
|
JEQ match_is_repeat_encodeBetterBlockAsm12B
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeBetterBlockAsm12B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeBetterBlockAsm12B
|
|
JB three_bytes_match_emit_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm12B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm12B
|
|
CMPL R8, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBetterBlockAsm12B
|
|
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(R12), R12
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW R8, 1(CX)
|
|
LEAL -60(R12), R12
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
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(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, 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 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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm12B
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm12B
|
|
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(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), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_repeat_encodeBetterBlockAsm12B
|
|
JB three_bytes_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
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, (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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
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(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, R12
|
|
ORL $0x01, R12
|
|
MOVW R12, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
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 DX, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm12B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBetterBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm12B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeBetterBlockAsm12B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x32, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeBetterBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm12B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm12B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBetterBlockAsm12B
|
|
JB three_bytes_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm12B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeBetterBlockAsm10B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeBetterBlockAsm10B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeBetterBlockAsm10B
|
|
|
|
no_short_found_encodeBetterBlockAsm10B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeBetterBlockAsm10B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeBetterBlockAsm10B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBetterBlockAsm10B
|
|
|
|
candidateS_match_encodeBetterBlockAsm10B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBetterBlockAsm10B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm10B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBetterBlockAsm10B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBetterBlockAsm10B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm10B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm10B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm10B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBetterBlockAsm10B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBetterBlockAsm10B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBetterBlockAsm10B
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeBetterBlockAsm10B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBetterBlockAsm10B
|
|
JB match_nolit_end_encodeBetterBlockAsm10B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeBetterBlockAsm10B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm10B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeBetterBlockAsm10B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeBetterBlockAsm10B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL 16(SP), R8
|
|
JEQ match_is_repeat_encodeBetterBlockAsm10B
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeBetterBlockAsm10B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeBetterBlockAsm10B
|
|
JB three_bytes_match_emit_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm10B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm10B
|
|
CMPL R8, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBetterBlockAsm10B
|
|
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(R12), R12
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
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(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, 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 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, (CX)
|
|
MOVW R8, 1(CX)
|
|
LEAL -60(R12), R12
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
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(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, 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 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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm10B
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm10B
|
|
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(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), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_repeat_encodeBetterBlockAsm10B
|
|
JB three_bytes_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
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, (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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
CMPL R8, $0x00000800
|
|
JB repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
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(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, R12
|
|
ORL $0x01, R12
|
|
MOVW R12, (CX)
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
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 DX, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm10B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBetterBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm10B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeBetterBlockAsm10B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x34, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeBetterBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm10B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm10B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBetterBlockAsm10B
|
|
JB three_bytes_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm10B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeBetterBlockAsm8B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeBetterBlockAsm8B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeBetterBlockAsm8B
|
|
|
|
no_short_found_encodeBetterBlockAsm8B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeBetterBlockAsm8B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeBetterBlockAsm8B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeBetterBlockAsm8B
|
|
|
|
candidateS_match_encodeBetterBlockAsm8B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeBetterBlockAsm8B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm8B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeBetterBlockAsm8B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeBetterBlockAsm8B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeBetterBlockAsm8B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm8B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm8B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeBetterBlockAsm8B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeBetterBlockAsm8B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeBetterBlockAsm8B
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeBetterBlockAsm8B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeBetterBlockAsm8B
|
|
JB match_nolit_end_encodeBetterBlockAsm8B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeBetterBlockAsm8B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm8B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeBetterBlockAsm8B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeBetterBlockAsm8B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL 16(SP), R8
|
|
JEQ match_is_repeat_encodeBetterBlockAsm8B
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeBetterBlockAsm8B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeBetterBlockAsm8B
|
|
JB three_bytes_match_emit_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm8B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x04
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4
|
|
CMPQ R9, $0x08
|
|
JB emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVL R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeBetterBlockAsm8B
|
|
CMPL R8, $0x00000800
|
|
JAE long_offset_short_match_nolit_encodeBetterBlockAsm8B
|
|
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(R12), R12
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
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(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, 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
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm8B:
|
|
MOVB $0xee, (CX)
|
|
MOVW R8, 1(CX)
|
|
LEAL -60(R12), R12
|
|
ADDQ $0x03, CX
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short
|
|
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 R12, $0x00000104
|
|
JB repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short
|
|
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(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, 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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeBetterBlockAsm8B
|
|
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(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), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_repeat_encodeBetterBlockAsm8B
|
|
JB three_bytes_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
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, (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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x04
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4
|
|
CMPQ R8, $0x08
|
|
JB emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVL R10, (CX)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7:
|
|
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 (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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(R8*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 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(R9)(R13*1), R10
|
|
LEAQ -32(CX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (R10), X4
|
|
MOVOU 16(R10), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R10
|
|
ADDQ $0x20, R13
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitRepeat
|
|
MOVL R12, SI
|
|
LEAL -4(R12), R12
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B:
|
|
CMPL R12, $0x00000104
|
|
JB repeat_three_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
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(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, 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
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm8B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeBetterBlockAsm8B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeBetterBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm8B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeBetterBlockAsm8B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x36, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeBetterBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm8B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm8B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeBetterBlockAsm8B
|
|
JB three_bytes_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm8B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x06, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm
|
|
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 R9, R10
|
|
SHRQ $0x32, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_encodeSnappyBlockAsm
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeSnappyBlockAsm
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_encodeSnappyBlockAsm
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL SI, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_repeat_emit_encodeSnappyBlockAsm:
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(R8*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 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(R9)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
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_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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, 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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm
|
|
JB repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
CMPL DI, $0x00010000
|
|
JB two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm
|
|
|
|
four_bytes_loop_back_repeat_as_copy_encodeSnappyBlockAsm:
|
|
CMPL SI, $0x40
|
|
JBE four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm
|
|
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 SI, SI
|
|
JZ repeat_end_emit_encodeSnappyBlockAsm
|
|
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 SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeSnappyBlockAsm
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeSnappyBlockAsm
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeSnappyBlockAsm
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
candidate3_match_encodeSnappyBlockAsm:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeSnappyBlockAsm
|
|
|
|
candidate2_match_encodeSnappyBlockAsm:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBlockAsm:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBlockAsm
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBlockAsm
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBlockAsm
|
|
CMPL R8, $0x00010000
|
|
JB three_bytes_match_emit_encodeSnappyBlockAsm
|
|
CMPL R8, $0x01000000
|
|
JB four_bytes_match_emit_encodeSnappyBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL R8, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_match_emit_encodeSnappyBlockAsm:
|
|
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, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
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_encodeSnappyBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBlockAsm
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBlockAsm
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBlockAsm
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBlockAsm
|
|
JB match_nolit_end_encodeSnappyBlockAsm
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeSnappyBlockAsm
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL SI, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_loop_back_match_nolit_encodeSnappyBlockAsm:
|
|
CMPL R10, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeSnappyBlockAsm
|
|
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 R10, R10
|
|
JZ match_nolit_emitcopy_end_encodeSnappyBlockAsm
|
|
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 R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBlockAsm
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm:
|
|
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 DX
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
emit_remainder_encodeSnappyBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
CMPL DX, $0x01000000
|
|
JB four_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
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, (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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm64K(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x06, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm64K
|
|
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 R9, R10
|
|
SHRQ $0x32, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_encodeSnappyBlockAsm64K
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeSnappyBlockAsm64K
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_encodeSnappyBlockAsm64K
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm64K:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm64K:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeSnappyBlockAsm64K
|
|
JB three_bytes_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm64K:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm64K:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(R8*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 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(R9)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
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_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32:
|
|
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, (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, 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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K
|
|
JB repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm64K:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm64K:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm64K:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm64K:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeSnappyBlockAsm64K
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeSnappyBlockAsm64K
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeSnappyBlockAsm64K
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
candidate3_match_encodeSnappyBlockAsm64K:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeSnappyBlockAsm64K
|
|
|
|
candidate2_match_encodeSnappyBlockAsm64K:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBlockAsm64K:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm64K
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm64K:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBlockAsm64K
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBlockAsm64K
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm64K
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm64K
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm64K:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm64K:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm64K
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBlockAsm64K
|
|
JB three_bytes_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm64K:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm64K:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
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_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBlockAsm64K
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm64K
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBlockAsm64K
|
|
JB match_nolit_end_encodeSnappyBlockAsm64K
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm64K
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm64K:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeSnappyBlockAsm64K
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm64K:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm64K
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm64K
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm64K
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm64K:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm64K
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBlockAsm64K
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm64K:
|
|
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 DX
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
emit_remainder_encodeSnappyBlockAsm64K:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm64K:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBlockAsm64K
|
|
JB three_bytes_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm64K:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm64K:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x05, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm12B
|
|
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 R9, R10
|
|
SHRQ $0x34, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_encodeSnappyBlockAsm12B
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeSnappyBlockAsm12B
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_encodeSnappyBlockAsm12B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm12B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeSnappyBlockAsm12B
|
|
JB three_bytes_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm12B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(R8*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 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(R9)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
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_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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, 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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B
|
|
JB repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm12B:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm12B:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm12B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm12B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeSnappyBlockAsm12B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeSnappyBlockAsm12B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeSnappyBlockAsm12B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm12B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeSnappyBlockAsm12B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm12B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBlockAsm12B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm12B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBlockAsm12B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBlockAsm12B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm12B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm12B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm12B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm12B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBlockAsm12B
|
|
JB three_bytes_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm12B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
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_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBlockAsm12B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm12B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBlockAsm12B
|
|
JB match_nolit_end_encodeSnappyBlockAsm12B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm12B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm12B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeSnappyBlockAsm12B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm12B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm12B
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm12B
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm12B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm12B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm12B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm12B:
|
|
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 DX
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm12B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBlockAsm12B
|
|
JB three_bytes_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm12B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x05, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm10B
|
|
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 R9, R10
|
|
SHRQ $0x36, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_encodeSnappyBlockAsm10B
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeSnappyBlockAsm10B
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_encodeSnappyBlockAsm10B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm10B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeSnappyBlockAsm10B
|
|
JB three_bytes_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm10B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(R8*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 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(R9)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
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_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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, 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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B
|
|
JB repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm10B:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm10B:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm10B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm10B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeSnappyBlockAsm10B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeSnappyBlockAsm10B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeSnappyBlockAsm10B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm10B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeSnappyBlockAsm10B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm10B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBlockAsm10B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm10B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBlockAsm10B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBlockAsm10B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm10B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm10B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm10B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm10B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBlockAsm10B
|
|
JB three_bytes_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm10B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
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_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBlockAsm10B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm10B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBlockAsm10B
|
|
JB match_nolit_end_encodeSnappyBlockAsm10B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm10B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm10B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeSnappyBlockAsm10B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm10B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm10B
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm10B
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm10B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm10B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm10B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm10B:
|
|
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 DX
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm10B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBlockAsm10B
|
|
JB three_bytes_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm10B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x04, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm8B
|
|
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 R9, R10
|
|
SHRQ $0x38, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_encodeSnappyBlockAsm8B
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_encodeSnappyBlockAsm8B
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_encodeSnappyBlockAsm8B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm8B:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_encodeSnappyBlockAsm8B
|
|
JB three_bytes_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm8B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(R8*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
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 (R9), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(R8*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 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(R9)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
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_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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, 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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B
|
|
JB repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm8B:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm8B:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm8B
|
|
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 SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm8B
|
|
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(R8), R8
|
|
MOVB R8, (CX)
|
|
MOVW DI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm8B:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm8B:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_encodeSnappyBlockAsm8B
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_encodeSnappyBlockAsm8B
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_encodeSnappyBlockAsm8B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm8B:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_encodeSnappyBlockAsm8B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm8B:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBlockAsm8B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm8B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBlockAsm8B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBlockAsm8B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBlockAsm8B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm8B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm8B:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBlockAsm8B
|
|
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 R8, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBlockAsm8B
|
|
JB three_bytes_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm8B:
|
|
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, R8
|
|
MOVB R8, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
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 (DI), R10
|
|
MOVQ R10, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16:
|
|
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 (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 (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 R8, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(R9*1), R8
|
|
|
|
// genMemMoveLong
|
|
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(DI)(R12*1), R10
|
|
LEAQ -32(CX)(R12*1), R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
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_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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 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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBlockAsm8B
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBlockAsm8B
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBlockAsm8B
|
|
JB match_nolit_end_encodeSnappyBlockAsm8B
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBlockAsm8B
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm8B:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_encodeSnappyBlockAsm8B
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm8B:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBlockAsm8B
|
|
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 R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBlockAsm8B
|
|
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(DI), DI
|
|
MOVB DI, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm8B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBlockAsm8B
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm8B:
|
|
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 DX
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm8B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBlockAsm8B
|
|
JB three_bytes_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm8B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm:
|
|
MOVL DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x07, SI
|
|
CMPL SI, $0x63
|
|
JBE check_maxskip_ok_encodeSnappyBetterBlockAsm
|
|
LEAL 100(DX), SI
|
|
JMP check_maxskip_cont_encodeSnappyBetterBlockAsm
|
|
|
|
check_maxskip_ok_encodeSnappyBetterBlockAsm:
|
|
LEAL 1(DX)(SI*1), SI
|
|
|
|
check_maxskip_cont_encodeSnappyBetterBlockAsm:
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm
|
|
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 R11, DI
|
|
JNE no_short_found_encodeSnappyBetterBlockAsm
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeSnappyBetterBlockAsm
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeSnappyBetterBlockAsm
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm
|
|
JB match_nolit_end_encodeSnappyBetterBlockAsm
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeSnappyBetterBlockAsm
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
CMPL R12, $0x01
|
|
JA match_length_ok_encodeSnappyBetterBlockAsm
|
|
CMPL R8, $0x0000ffff
|
|
JBE match_length_ok_encodeSnappyBetterBlockAsm
|
|
MOVL 20(SP), DX
|
|
INCL DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm
|
|
|
|
match_length_ok_encodeSnappyBetterBlockAsm:
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
MOVB $0xfc, (CX)
|
|
MOVL SI, 1(CX)
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_match_emit_encodeSnappyBetterBlockAsm:
|
|
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, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL R8, $0x00010000
|
|
JB two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_loop_back_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPL R12, $0x40
|
|
JBE four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm
|
|
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 R12, R12
|
|
JZ match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm
|
|
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 R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm
|
|
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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm
|
|
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(SI), SI
|
|
MOVB SI, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm:
|
|
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 R8, R9
|
|
JAE search_loop_encodeSnappyBetterBlockAsm
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x08, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x2f, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 5(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeSnappyBetterBlockAsm
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPL DX, $0x00010000
|
|
JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPL DX, $0x01000000
|
|
JB four_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
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, (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, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte, tmp *[294912]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm64K:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeSnappyBetterBlockAsm64K
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm64K
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeSnappyBetterBlockAsm64K
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeSnappyBetterBlockAsm64K
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm64K
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm64K:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm64K:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm64K:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm64K
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm64K:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm64K:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
JB match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm64K:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBetterBlockAsm64K
|
|
JB three_bytes_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
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(SI), SI
|
|
MOVB SI, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm64K:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K:
|
|
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 R8, R9
|
|
JAE search_loop_encodeSnappyBetterBlockAsm64K
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x08, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x30, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeSnappyBetterBlockAsm64K
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm64K:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm12B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeSnappyBetterBlockAsm12B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm12B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeSnappyBetterBlockAsm12B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeSnappyBetterBlockAsm12B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm12B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm12B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm12B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm12B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm12B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm12B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm12B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
JB match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm12B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBetterBlockAsm12B
|
|
JB three_bytes_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
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(SI), SI
|
|
MOVB SI, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm12B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeSnappyBetterBlockAsm12B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x32, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeSnappyBetterBlockAsm12B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm12B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm10B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeSnappyBetterBlockAsm10B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm10B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeSnappyBetterBlockAsm10B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeSnappyBetterBlockAsm10B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm10B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm10B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm10B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm10B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm10B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm10B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm10B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVL (R9)(R12*1), R11
|
|
CMPL (R10)(R12*1), R11
|
|
JNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R12), R12
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
JB match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm10B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBetterBlockAsm10B
|
|
JB three_bytes_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
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(SI), SI
|
|
MOVB SI, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm10B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeSnappyBetterBlockAsm10B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x34, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeSnappyBetterBlockAsm10B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm10B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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), BX
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm8B:
|
|
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 (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 R11, DI
|
|
JNE no_short_found_encodeSnappyBetterBlockAsm8B
|
|
MOVL R8, SI
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm8B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm8B:
|
|
CMPL R10, DI
|
|
JEQ candidate_match_encodeSnappyBetterBlockAsm8B
|
|
CMPL R11, DI
|
|
JEQ candidateS_match_encodeSnappyBetterBlockAsm8B
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_encodeSnappyBetterBlockAsm8B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm8B:
|
|
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 DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm8B:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm8B:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm8B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm8B:
|
|
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+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm8B:
|
|
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 R12, R12
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
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(R10)(R12*1), R13
|
|
JNZ matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R12), R12
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
TZCNTQ R13, R13
|
|
SARQ $0x03, R13
|
|
LEAL 8(R12)(R13*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
MOVQ (R9)(R12*1), R11
|
|
XORQ (R10)(R12*1), R11
|
|
JNZ matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R12), R12
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL (R12)(R11*1), R12
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
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 R8, $0x01
|
|
JE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
JB match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
MOVW (R9)(R12*1), R11
|
|
CMPW (R10)(R12*1), R11
|
|
JNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
LEAL 2(R12), R12
|
|
SUBL $0x02, R8
|
|
JZ match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
MOVB (R9)(R12*1), R11
|
|
CMPB (R10)(R12*1), R11
|
|
JNE match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
LEAL 1(R12), R12
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm8B:
|
|
MOVL DX, R8
|
|
SUBL SI, R8
|
|
|
|
// Check if repeat
|
|
MOVL R8, 16(SP)
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B
|
|
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 SI, $0x00000100
|
|
JB two_bytes_match_emit_encodeSnappyBetterBlockAsm8B
|
|
JB three_bytes_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW SI, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
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, SI
|
|
MOVB SI, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16
|
|
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 (R10), R11
|
|
MOVQ R11, (CX)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16:
|
|
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 (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 (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 SI, CX
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
LEAQ (CX)(R9*1), SI
|
|
|
|
// genMemMoveLong
|
|
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(R10)(R14*1), R11
|
|
LEAQ -32(CX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R14
|
|
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(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, (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 R12, DX
|
|
ADDL $0x04, R12
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPL R12, $0x40
|
|
JBE two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
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 R12, SI
|
|
SHLL $0x02, SI
|
|
CMPL R12, $0x0c
|
|
JAE emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
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(SI), SI
|
|
MOVB SI, (CX)
|
|
MOVW R8, 1(CX)
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm8B:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B:
|
|
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 R8, R9
|
|
JAE search_loop_encodeSnappyBetterBlockAsm8B
|
|
MOVQ (BX)(DI*1), R10
|
|
MOVQ (BX)(R8*1), R11
|
|
SHLQ $0x10, R10
|
|
IMULQ SI, R10
|
|
SHRQ $0x36, R10
|
|
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), AX
|
|
SUBL 12(SP), AX
|
|
LEAQ 3(CX)(AX*1), AX
|
|
CMPQ AX, (SP)
|
|
JB emit_remainder_ok_encodeSnappyBetterBlockAsm8B
|
|
MOVQ $0x00000000, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm8B:
|
|
MOVQ src_len+32(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
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
|
|
CMPL DX, $0x00000100
|
|
JB two_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
JB three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVB $0xf4, (CX)
|
|
MOVW DX, 1(CX)
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
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, (CX)
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveShort
|
|
CMPQ BX, $0x03
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_1or2
|
|
JE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_3
|
|
CMPQ BX, $0x08
|
|
JB emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_4through7
|
|
CMPQ BX, $0x10
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_8through16
|
|
CMPQ BX, $0x20
|
|
JBE emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_17through32
|
|
JMP emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_33through64
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_1or2:
|
|
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 (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 (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 (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 (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 (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, CX
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
LEAQ (CX)(SI*1), DX
|
|
MOVL SI, BX
|
|
|
|
// genMemMoveLong
|
|
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 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(AX)(R8*1), SI
|
|
LEAQ -32(CX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_forward_sse_loop_32:
|
|
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, (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), AX
|
|
SUBQ AX, CX
|
|
MOVQ CX, ret+56(FP)
|
|
RET
|
|
|
|
// func calcBlockSize(src []byte, tmp *[32768]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x05, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_calcBlockSize
|
|
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 R9, R10
|
|
SHRQ $0x33, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_calcBlockSize
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_calcBlockSize
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_calcBlockSize
|
|
|
|
repeat_extend_back_end_calcBlockSize:
|
|
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+32(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_calcBlockSize:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_calcBlockSize
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_calcBlockSize
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_repeat_emit_calcBlockSize
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_repeat_emit_calcBlockSize
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
four_bytes_repeat_emit_calcBlockSize:
|
|
ADDQ $0x04, CX
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
three_bytes_repeat_emit_calcBlockSize:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
two_bytes_repeat_emit_calcBlockSize:
|
|
ADDQ $0x02, CX
|
|
CMPL SI, $0x40
|
|
JB memmove_repeat_emit_calcBlockSize
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
one_byte_repeat_emit_calcBlockSize:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_calcBlockSize:
|
|
LEAQ (CX)(R8*1), CX
|
|
JMP emit_literal_done_repeat_emit_calcBlockSize
|
|
|
|
memmove_long_repeat_emit_calcBlockSize:
|
|
LEAQ (CX)(R8*1), CX
|
|
|
|
emit_literal_done_repeat_emit_calcBlockSize:
|
|
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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_calcBlockSize:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_calcBlockSize
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_calcBlockSize
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_calcBlockSize
|
|
|
|
matchlen_bsf_16repeat_extend_calcBlockSize:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match8_repeat_extend_calcBlockSize:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_calcBlockSize
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_calcBlockSize
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_calcBlockSize
|
|
|
|
matchlen_bsf_8_repeat_extend_calcBlockSize:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match4_repeat_extend_calcBlockSize:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_calcBlockSize
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_calcBlockSize
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_calcBlockSize:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_calcBlockSize
|
|
JB repeat_extend_forward_end_calcBlockSize
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_calcBlockSize
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match1_repeat_extend_calcBlockSize:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_calcBlockSize
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_calcBlockSize:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
CMPL DI, $0x00010000
|
|
JB two_byte_offset_repeat_as_copy_calcBlockSize
|
|
|
|
four_bytes_loop_back_repeat_as_copy_calcBlockSize:
|
|
CMPL SI, $0x40
|
|
JBE four_bytes_remain_repeat_as_copy_calcBlockSize
|
|
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 SI, SI
|
|
JZ repeat_end_emit_calcBlockSize
|
|
XORL SI, SI
|
|
ADDQ $0x05, CX
|
|
JMP repeat_end_emit_calcBlockSize
|
|
|
|
two_byte_offset_repeat_as_copy_calcBlockSize:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_calcBlockSize
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
JMP two_byte_offset_repeat_as_copy_calcBlockSize
|
|
|
|
two_byte_offset_short_repeat_as_copy_calcBlockSize:
|
|
MOVL SI, R8
|
|
SHLL $0x02, R8
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_calcBlockSize
|
|
CMPL DI, $0x00000800
|
|
JAE emit_copy_three_repeat_as_copy_calcBlockSize
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_calcBlockSize
|
|
|
|
emit_copy_three_repeat_as_copy_calcBlockSize:
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_calcBlockSize:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_calcBlockSize
|
|
|
|
no_repeat_found_calcBlockSize:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_calcBlockSize
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_calcBlockSize
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_calcBlockSize
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_calcBlockSize
|
|
|
|
candidate3_match_calcBlockSize:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_calcBlockSize
|
|
|
|
candidate2_match_calcBlockSize:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_calcBlockSize:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_calcBlockSize
|
|
|
|
match_extend_back_loop_calcBlockSize:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_calcBlockSize
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_calcBlockSize
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_calcBlockSize
|
|
JMP match_extend_back_loop_calcBlockSize
|
|
|
|
match_extend_back_end_calcBlockSize:
|
|
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+32(FP)
|
|
RET
|
|
|
|
match_dst_size_check_calcBlockSize:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_calcBlockSize
|
|
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 DI, $0x00000100
|
|
JB two_bytes_match_emit_calcBlockSize
|
|
CMPL DI, $0x00010000
|
|
JB three_bytes_match_emit_calcBlockSize
|
|
CMPL DI, $0x01000000
|
|
JB four_bytes_match_emit_calcBlockSize
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
four_bytes_match_emit_calcBlockSize:
|
|
ADDQ $0x04, CX
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
three_bytes_match_emit_calcBlockSize:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
two_bytes_match_emit_calcBlockSize:
|
|
ADDQ $0x02, CX
|
|
CMPL DI, $0x40
|
|
JB memmove_match_emit_calcBlockSize
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
one_byte_match_emit_calcBlockSize:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_calcBlockSize:
|
|
LEAQ (CX)(R9*1), CX
|
|
JMP emit_literal_done_match_emit_calcBlockSize
|
|
|
|
memmove_long_match_emit_calcBlockSize:
|
|
LEAQ (CX)(R9*1), CX
|
|
|
|
emit_literal_done_match_emit_calcBlockSize:
|
|
match_nolit_loop_calcBlockSize:
|
|
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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_calcBlockSize:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_calcBlockSize
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_calcBlockSize
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_calcBlockSize
|
|
|
|
matchlen_bsf_16match_nolit_calcBlockSize:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match8_match_nolit_calcBlockSize:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_calcBlockSize
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_calcBlockSize
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_calcBlockSize
|
|
|
|
matchlen_bsf_8_match_nolit_calcBlockSize:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match4_match_nolit_calcBlockSize:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_calcBlockSize
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_calcBlockSize
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_calcBlockSize:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_calcBlockSize
|
|
JB match_nolit_end_calcBlockSize
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_calcBlockSize
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match1_match_nolit_calcBlockSize:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_calcBlockSize
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_calcBlockSize:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
CMPL SI, $0x00010000
|
|
JB two_byte_offset_match_nolit_calcBlockSize
|
|
|
|
four_bytes_loop_back_match_nolit_calcBlockSize:
|
|
CMPL R10, $0x40
|
|
JBE four_bytes_remain_match_nolit_calcBlockSize
|
|
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 R10, R10
|
|
JZ match_nolit_emitcopy_end_calcBlockSize
|
|
XORL SI, SI
|
|
ADDQ $0x05, CX
|
|
JMP match_nolit_emitcopy_end_calcBlockSize
|
|
|
|
two_byte_offset_match_nolit_calcBlockSize:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_calcBlockSize
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
JMP two_byte_offset_match_nolit_calcBlockSize
|
|
|
|
two_byte_offset_short_match_nolit_calcBlockSize:
|
|
MOVL R10, DI
|
|
SHLL $0x02, DI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_calcBlockSize
|
|
CMPL SI, $0x00000800
|
|
JAE emit_copy_three_match_nolit_calcBlockSize
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_calcBlockSize
|
|
|
|
emit_copy_three_match_nolit_calcBlockSize:
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_calcBlockSize:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_calcBlockSize
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_calcBlockSize
|
|
MOVQ $0x00000000, ret+32(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_calcBlockSize:
|
|
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 DX
|
|
JMP search_loop_calcBlockSize
|
|
|
|
emit_remainder_calcBlockSize:
|
|
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+32(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_calcBlockSize:
|
|
MOVQ src_len+8(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_calcBlockSize
|
|
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 AX, $0x00000100
|
|
JB two_bytes_emit_remainder_calcBlockSize
|
|
CMPL AX, $0x00010000
|
|
JB three_bytes_emit_remainder_calcBlockSize
|
|
CMPL AX, $0x01000000
|
|
JB four_bytes_emit_remainder_calcBlockSize
|
|
ADDQ $0x05, CX
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
four_bytes_emit_remainder_calcBlockSize:
|
|
ADDQ $0x04, CX
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
three_bytes_emit_remainder_calcBlockSize:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
two_bytes_emit_remainder_calcBlockSize:
|
|
ADDQ $0x02, CX
|
|
CMPL AX, $0x40
|
|
JB memmove_emit_remainder_calcBlockSize
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
one_byte_emit_remainder_calcBlockSize:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_calcBlockSize:
|
|
LEAQ (CX)(SI*1), AX
|
|
MOVQ AX, CX
|
|
JMP emit_literal_done_emit_remainder_calcBlockSize
|
|
|
|
memmove_long_emit_remainder_calcBlockSize:
|
|
LEAQ (CX)(SI*1), AX
|
|
MOVQ AX, CX
|
|
|
|
emit_literal_done_emit_remainder_calcBlockSize:
|
|
MOVQ CX, ret+32(FP)
|
|
RET
|
|
|
|
// func calcBlockSizeSmall(src []byte, tmp *[2048]byte) int
|
|
// Requires: BMI, SSE2
|
|
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, (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), 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 DX, SI
|
|
SUBL 12(SP), SI
|
|
SHRL $0x04, SI
|
|
LEAL 4(DX)(SI*1), SI
|
|
CMPL SI, 8(SP)
|
|
JAE emit_remainder_calcBlockSizeSmall
|
|
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 R9, R10
|
|
SHRQ $0x37, 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(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 DI, SI
|
|
JBE repeat_extend_back_end_calcBlockSizeSmall
|
|
MOVB -1(BX)(R8*1), R9
|
|
MOVB -1(BX)(DI*1), R10
|
|
CMPB R9, R10
|
|
JNE repeat_extend_back_end_calcBlockSizeSmall
|
|
LEAL -1(DI), DI
|
|
DECL R8
|
|
JNZ repeat_extend_back_loop_calcBlockSizeSmall
|
|
|
|
repeat_extend_back_end_calcBlockSizeSmall:
|
|
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+32(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_calcBlockSizeSmall:
|
|
MOVL 12(SP), SI
|
|
CMPL SI, DI
|
|
JEQ emit_literal_done_repeat_emit_calcBlockSizeSmall
|
|
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 SI, $0x00000100
|
|
JB two_bytes_repeat_emit_calcBlockSizeSmall
|
|
JB three_bytes_repeat_emit_calcBlockSizeSmall
|
|
|
|
three_bytes_repeat_emit_calcBlockSizeSmall:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_repeat_emit_calcBlockSizeSmall
|
|
|
|
two_bytes_repeat_emit_calcBlockSizeSmall:
|
|
ADDQ $0x02, CX
|
|
CMPL SI, $0x40
|
|
JB memmove_repeat_emit_calcBlockSizeSmall
|
|
JMP memmove_long_repeat_emit_calcBlockSizeSmall
|
|
|
|
one_byte_repeat_emit_calcBlockSizeSmall:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_repeat_emit_calcBlockSizeSmall:
|
|
LEAQ (CX)(R8*1), CX
|
|
JMP emit_literal_done_repeat_emit_calcBlockSizeSmall
|
|
|
|
memmove_long_repeat_emit_calcBlockSizeSmall:
|
|
LEAQ (CX)(R8*1), CX
|
|
|
|
emit_literal_done_repeat_emit_calcBlockSizeSmall:
|
|
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 R11, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_calcBlockSizeSmall:
|
|
CMPL R8, $0x10
|
|
JB matchlen_match8_repeat_extend_calcBlockSizeSmall
|
|
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(SI)(R11*1), R12
|
|
JNZ matchlen_bsf_16repeat_extend_calcBlockSizeSmall
|
|
LEAL -16(R8), R8
|
|
LEAL 16(R11), R11
|
|
JMP matchlen_loopback_16_repeat_extend_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_16repeat_extend_calcBlockSizeSmall:
|
|
TZCNTQ R12, R12
|
|
SARQ $0x03, R12
|
|
LEAL 8(R11)(R12*1), R11
|
|
JMP repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match8_repeat_extend_calcBlockSizeSmall:
|
|
CMPL R8, $0x08
|
|
JB matchlen_match4_repeat_extend_calcBlockSizeSmall
|
|
MOVQ (R9)(R11*1), R10
|
|
XORQ (SI)(R11*1), R10
|
|
JNZ matchlen_bsf_8_repeat_extend_calcBlockSizeSmall
|
|
LEAL -8(R8), R8
|
|
LEAL 8(R11), R11
|
|
JMP matchlen_match4_repeat_extend_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_8_repeat_extend_calcBlockSizeSmall:
|
|
TZCNTQ R10, R10
|
|
SARQ $0x03, R10
|
|
LEAL (R11)(R10*1), R11
|
|
JMP repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match4_repeat_extend_calcBlockSizeSmall:
|
|
CMPL R8, $0x04
|
|
JB matchlen_match2_repeat_extend_calcBlockSizeSmall
|
|
MOVL (R9)(R11*1), R10
|
|
CMPL (SI)(R11*1), R10
|
|
JNE matchlen_match2_repeat_extend_calcBlockSizeSmall
|
|
LEAL -4(R8), R8
|
|
LEAL 4(R11), R11
|
|
|
|
matchlen_match2_repeat_extend_calcBlockSizeSmall:
|
|
CMPL R8, $0x01
|
|
JE matchlen_match1_repeat_extend_calcBlockSizeSmall
|
|
JB repeat_extend_forward_end_calcBlockSizeSmall
|
|
MOVW (R9)(R11*1), R10
|
|
CMPW (SI)(R11*1), R10
|
|
JNE matchlen_match1_repeat_extend_calcBlockSizeSmall
|
|
LEAL 2(R11), R11
|
|
SUBL $0x02, R8
|
|
JZ repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match1_repeat_extend_calcBlockSizeSmall:
|
|
MOVB (R9)(R11*1), R10
|
|
CMPB (SI)(R11*1), R10
|
|
JNE repeat_extend_forward_end_calcBlockSizeSmall
|
|
LEAL 1(R11), R11
|
|
|
|
repeat_extend_forward_end_calcBlockSizeSmall:
|
|
ADDL R11, DX
|
|
MOVL DX, SI
|
|
SUBL DI, SI
|
|
MOVL 16(SP), DI
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_calcBlockSizeSmall:
|
|
CMPL SI, $0x40
|
|
JBE two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall
|
|
LEAL -60(SI), SI
|
|
ADDQ $0x03, CX
|
|
JMP two_byte_offset_repeat_as_copy_calcBlockSizeSmall
|
|
|
|
two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall:
|
|
MOVL SI, DI
|
|
SHLL $0x02, DI
|
|
CMPL SI, $0x0c
|
|
JAE emit_copy_three_repeat_as_copy_calcBlockSizeSmall
|
|
ADDQ $0x02, CX
|
|
JMP repeat_end_emit_calcBlockSizeSmall
|
|
|
|
emit_copy_three_repeat_as_copy_calcBlockSizeSmall:
|
|
ADDQ $0x03, CX
|
|
|
|
repeat_end_emit_calcBlockSizeSmall:
|
|
MOVL DX, 12(SP)
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
no_repeat_found_calcBlockSizeSmall:
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate_match_calcBlockSizeSmall
|
|
SHRQ $0x08, DI
|
|
MOVL (AX)(R10*4), SI
|
|
LEAL 2(DX), R9
|
|
CMPL (BX)(R8*1), DI
|
|
JEQ candidate2_match_calcBlockSizeSmall
|
|
MOVL R9, (AX)(R10*4)
|
|
SHRQ $0x08, DI
|
|
CMPL (BX)(SI*1), DI
|
|
JEQ candidate3_match_calcBlockSizeSmall
|
|
MOVL 20(SP), DX
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
candidate3_match_calcBlockSizeSmall:
|
|
ADDL $0x02, DX
|
|
JMP candidate_match_calcBlockSizeSmall
|
|
|
|
candidate2_match_calcBlockSizeSmall:
|
|
MOVL R9, (AX)(R10*4)
|
|
INCL DX
|
|
MOVL R8, SI
|
|
|
|
candidate_match_calcBlockSizeSmall:
|
|
MOVL 12(SP), DI
|
|
TESTL SI, SI
|
|
JZ match_extend_back_end_calcBlockSizeSmall
|
|
|
|
match_extend_back_loop_calcBlockSizeSmall:
|
|
CMPL DX, DI
|
|
JBE match_extend_back_end_calcBlockSizeSmall
|
|
MOVB -1(BX)(SI*1), R8
|
|
MOVB -1(BX)(DX*1), R9
|
|
CMPB R8, R9
|
|
JNE match_extend_back_end_calcBlockSizeSmall
|
|
LEAL -1(DX), DX
|
|
DECL SI
|
|
JZ match_extend_back_end_calcBlockSizeSmall
|
|
JMP match_extend_back_loop_calcBlockSizeSmall
|
|
|
|
match_extend_back_end_calcBlockSizeSmall:
|
|
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+32(FP)
|
|
RET
|
|
|
|
match_dst_size_check_calcBlockSizeSmall:
|
|
MOVL DX, DI
|
|
MOVL 12(SP), R8
|
|
CMPL R8, DI
|
|
JEQ emit_literal_done_match_emit_calcBlockSizeSmall
|
|
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 DI, $0x00000100
|
|
JB two_bytes_match_emit_calcBlockSizeSmall
|
|
JB three_bytes_match_emit_calcBlockSizeSmall
|
|
|
|
three_bytes_match_emit_calcBlockSizeSmall:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_match_emit_calcBlockSizeSmall
|
|
|
|
two_bytes_match_emit_calcBlockSizeSmall:
|
|
ADDQ $0x02, CX
|
|
CMPL DI, $0x40
|
|
JB memmove_match_emit_calcBlockSizeSmall
|
|
JMP memmove_long_match_emit_calcBlockSizeSmall
|
|
|
|
one_byte_match_emit_calcBlockSizeSmall:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_match_emit_calcBlockSizeSmall:
|
|
LEAQ (CX)(R9*1), CX
|
|
JMP emit_literal_done_match_emit_calcBlockSizeSmall
|
|
|
|
memmove_long_match_emit_calcBlockSizeSmall:
|
|
LEAQ (CX)(R9*1), CX
|
|
|
|
emit_literal_done_match_emit_calcBlockSizeSmall:
|
|
match_nolit_loop_calcBlockSizeSmall:
|
|
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 R10, R10
|
|
|
|
matchlen_loopback_16_match_nolit_calcBlockSizeSmall:
|
|
CMPL DI, $0x10
|
|
JB matchlen_match8_match_nolit_calcBlockSizeSmall
|
|
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(SI)(R10*1), R11
|
|
JNZ matchlen_bsf_16match_nolit_calcBlockSizeSmall
|
|
LEAL -16(DI), DI
|
|
LEAL 16(R10), R10
|
|
JMP matchlen_loopback_16_match_nolit_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_16match_nolit_calcBlockSizeSmall:
|
|
TZCNTQ R11, R11
|
|
SARQ $0x03, R11
|
|
LEAL 8(R10)(R11*1), R10
|
|
JMP match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match8_match_nolit_calcBlockSizeSmall:
|
|
CMPL DI, $0x08
|
|
JB matchlen_match4_match_nolit_calcBlockSizeSmall
|
|
MOVQ (R8)(R10*1), R9
|
|
XORQ (SI)(R10*1), R9
|
|
JNZ matchlen_bsf_8_match_nolit_calcBlockSizeSmall
|
|
LEAL -8(DI), DI
|
|
LEAL 8(R10), R10
|
|
JMP matchlen_match4_match_nolit_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_8_match_nolit_calcBlockSizeSmall:
|
|
TZCNTQ R9, R9
|
|
SARQ $0x03, R9
|
|
LEAL (R10)(R9*1), R10
|
|
JMP match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match4_match_nolit_calcBlockSizeSmall:
|
|
CMPL DI, $0x04
|
|
JB matchlen_match2_match_nolit_calcBlockSizeSmall
|
|
MOVL (R8)(R10*1), R9
|
|
CMPL (SI)(R10*1), R9
|
|
JNE matchlen_match2_match_nolit_calcBlockSizeSmall
|
|
LEAL -4(DI), DI
|
|
LEAL 4(R10), R10
|
|
|
|
matchlen_match2_match_nolit_calcBlockSizeSmall:
|
|
CMPL DI, $0x01
|
|
JE matchlen_match1_match_nolit_calcBlockSizeSmall
|
|
JB match_nolit_end_calcBlockSizeSmall
|
|
MOVW (R8)(R10*1), R9
|
|
CMPW (SI)(R10*1), R9
|
|
JNE matchlen_match1_match_nolit_calcBlockSizeSmall
|
|
LEAL 2(R10), R10
|
|
SUBL $0x02, DI
|
|
JZ match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match1_match_nolit_calcBlockSizeSmall:
|
|
MOVB (R8)(R10*1), R9
|
|
CMPB (SI)(R10*1), R9
|
|
JNE match_nolit_end_calcBlockSizeSmall
|
|
LEAL 1(R10), R10
|
|
|
|
match_nolit_end_calcBlockSizeSmall:
|
|
ADDL R10, DX
|
|
MOVL 16(SP), SI
|
|
ADDL $0x04, R10
|
|
MOVL DX, 12(SP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_calcBlockSizeSmall:
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_match_nolit_calcBlockSizeSmall
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, CX
|
|
JMP two_byte_offset_match_nolit_calcBlockSizeSmall
|
|
|
|
two_byte_offset_short_match_nolit_calcBlockSizeSmall:
|
|
MOVL R10, SI
|
|
SHLL $0x02, SI
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_match_nolit_calcBlockSizeSmall
|
|
ADDQ $0x02, CX
|
|
JMP match_nolit_emitcopy_end_calcBlockSizeSmall
|
|
|
|
emit_copy_three_match_nolit_calcBlockSizeSmall:
|
|
ADDQ $0x03, CX
|
|
|
|
match_nolit_emitcopy_end_calcBlockSizeSmall:
|
|
CMPL DX, 8(SP)
|
|
JAE emit_remainder_calcBlockSizeSmall
|
|
MOVQ -2(BX)(DX*1), DI
|
|
CMPQ CX, (SP)
|
|
JB match_nolit_dst_ok_calcBlockSizeSmall
|
|
MOVQ $0x00000000, ret+32(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_calcBlockSizeSmall:
|
|
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 DX
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
emit_remainder_calcBlockSizeSmall:
|
|
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+32(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_calcBlockSizeSmall:
|
|
MOVQ src_len+8(FP), AX
|
|
MOVL 12(SP), DX
|
|
CMPL DX, AX
|
|
JEQ emit_literal_done_emit_remainder_calcBlockSizeSmall
|
|
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 AX, $0x00000100
|
|
JB two_bytes_emit_remainder_calcBlockSizeSmall
|
|
JB three_bytes_emit_remainder_calcBlockSizeSmall
|
|
|
|
three_bytes_emit_remainder_calcBlockSizeSmall:
|
|
ADDQ $0x03, CX
|
|
JMP memmove_long_emit_remainder_calcBlockSizeSmall
|
|
|
|
two_bytes_emit_remainder_calcBlockSizeSmall:
|
|
ADDQ $0x02, CX
|
|
CMPL AX, $0x40
|
|
JB memmove_emit_remainder_calcBlockSizeSmall
|
|
JMP memmove_long_emit_remainder_calcBlockSizeSmall
|
|
|
|
one_byte_emit_remainder_calcBlockSizeSmall:
|
|
ADDQ $0x01, CX
|
|
|
|
memmove_emit_remainder_calcBlockSizeSmall:
|
|
LEAQ (CX)(SI*1), AX
|
|
MOVQ AX, CX
|
|
JMP emit_literal_done_emit_remainder_calcBlockSizeSmall
|
|
|
|
memmove_long_emit_remainder_calcBlockSizeSmall:
|
|
LEAQ (CX)(SI*1), AX
|
|
MOVQ AX, CX
|
|
|
|
emit_literal_done_emit_remainder_calcBlockSizeSmall:
|
|
MOVQ CX, ret+32(FP)
|
|
RET
|
|
|
|
// func emitLiteral(dst []byte, lit []byte) int
|
|
// Requires: SSE2
|
|
TEXT ·emitLiteral(SB), NOSPLIT, $0-56
|
|
MOVQ lit_len+32(FP), DX
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ lit_base+24(FP), CX
|
|
TESTQ DX, DX
|
|
JZ emit_literal_end_standalone_skip
|
|
MOVL DX, BX
|
|
LEAL -1(DX), SI
|
|
CMPL SI, $0x3c
|
|
JB one_byte_standalone
|
|
CMPL SI, $0x00000100
|
|
JB two_bytes_standalone
|
|
CMPL SI, $0x00010000
|
|
JB three_bytes_standalone
|
|
CMPL SI, $0x01000000
|
|
JB four_bytes_standalone
|
|
MOVB $0xfc, (AX)
|
|
MOVL SI, 1(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP memmove_long_standalone
|
|
|
|
four_bytes_standalone:
|
|
MOVL SI, DI
|
|
SHRL $0x10, DI
|
|
MOVB $0xf8, (AX)
|
|
MOVW SI, 1(AX)
|
|
MOVB DI, 3(AX)
|
|
ADDQ $0x04, BX
|
|
ADDQ $0x04, AX
|
|
JMP memmove_long_standalone
|
|
|
|
three_bytes_standalone:
|
|
MOVB $0xf4, (AX)
|
|
MOVW SI, 1(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
JMP memmove_long_standalone
|
|
|
|
two_bytes_standalone:
|
|
MOVB $0xf0, (AX)
|
|
MOVB SI, 1(AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
CMPL SI, $0x40
|
|
JB memmove_standalone
|
|
JMP memmove_long_standalone
|
|
|
|
one_byte_standalone:
|
|
SHLB $0x02, SI
|
|
MOVB SI, (AX)
|
|
ADDQ $0x01, BX
|
|
ADDQ $0x01, AX
|
|
|
|
memmove_standalone:
|
|
// genMemMoveShort
|
|
CMPQ DX, $0x03
|
|
JB emit_lit_memmove_standalone_memmove_move_1or2
|
|
JE emit_lit_memmove_standalone_memmove_move_3
|
|
CMPQ DX, $0x08
|
|
JB emit_lit_memmove_standalone_memmove_move_4through7
|
|
CMPQ DX, $0x10
|
|
JBE emit_lit_memmove_standalone_memmove_move_8through16
|
|
CMPQ DX, $0x20
|
|
JBE emit_lit_memmove_standalone_memmove_move_17through32
|
|
JMP emit_lit_memmove_standalone_memmove_move_33through64
|
|
|
|
emit_lit_memmove_standalone_memmove_move_1or2:
|
|
MOVB (CX), SI
|
|
MOVB -1(CX)(DX*1), CL
|
|
MOVB SI, (AX)
|
|
MOVB CL, -1(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_3:
|
|
MOVW (CX), SI
|
|
MOVB 2(CX), CL
|
|
MOVW SI, (AX)
|
|
MOVB CL, 2(AX)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_4through7:
|
|
MOVL (CX), SI
|
|
MOVL -4(CX)(DX*1), CX
|
|
MOVL SI, (AX)
|
|
MOVL CX, -4(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_8through16:
|
|
MOVQ (CX), SI
|
|
MOVQ -8(CX)(DX*1), CX
|
|
MOVQ SI, (AX)
|
|
MOVQ CX, -8(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_17through32:
|
|
MOVOU (CX), X0
|
|
MOVOU -16(CX)(DX*1), X1
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, -16(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_33through64:
|
|
MOVOU (CX), X0
|
|
MOVOU 16(CX), X1
|
|
MOVOU -32(CX)(DX*1), X2
|
|
MOVOU -16(CX)(DX*1), X3
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(DX*1)
|
|
MOVOU X3, -16(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
JMP emit_literal_end_standalone
|
|
|
|
memmove_long_standalone:
|
|
// genMemMoveLong
|
|
MOVOU (CX), X0
|
|
MOVOU 16(CX), X1
|
|
MOVOU -32(CX)(DX*1), X2
|
|
MOVOU -16(CX)(DX*1), X3
|
|
MOVQ DX, DI
|
|
SHRQ $0x05, DI
|
|
MOVQ AX, SI
|
|
ANDL $0x0000001f, SI
|
|
MOVQ $0x00000040, R8
|
|
SUBQ SI, R8
|
|
DECQ DI
|
|
JA emit_lit_memmove_long_standalonelarge_forward_sse_loop_32
|
|
LEAQ -32(CX)(R8*1), SI
|
|
LEAQ -32(AX)(R8*1), R9
|
|
|
|
emit_lit_memmove_long_standalonelarge_big_loop_back:
|
|
MOVOU (SI), X4
|
|
MOVOU 16(SI), X5
|
|
MOVOA X4, (R9)
|
|
MOVOA X5, 16(R9)
|
|
ADDQ $0x20, R9
|
|
ADDQ $0x20, SI
|
|
ADDQ $0x20, R8
|
|
DECQ DI
|
|
JNA emit_lit_memmove_long_standalonelarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_standalonelarge_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)
|
|
ADDQ $0x20, R8
|
|
CMPQ DX, R8
|
|
JAE emit_lit_memmove_long_standalonelarge_forward_sse_loop_32
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(DX*1)
|
|
MOVOU X3, -16(AX)(DX*1)
|
|
JMP emit_literal_end_standalone
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_literal_end_standalone_skip:
|
|
XORQ BX, BX
|
|
|
|
emit_literal_end_standalone:
|
|
MOVQ BX, ret+48(FP)
|
|
RET
|
|
|
|
// func emitRepeat(dst []byte, offset int, length int) int
|
|
TEXT ·emitRepeat(SB), NOSPLIT, $0-48
|
|
XORQ BX, BX
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ offset+24(FP), CX
|
|
MOVQ length+32(FP), DX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone:
|
|
MOVL DX, SI
|
|
LEAL -4(DX), DX
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_standalone
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_standalone
|
|
CMPL CX, $0x00000800
|
|
JB repeat_two_offset_standalone
|
|
|
|
cant_repeat_two_offset_standalone:
|
|
CMPL DX, $0x00000104
|
|
JB repeat_three_standalone
|
|
CMPL DX, $0x00010100
|
|
JB repeat_four_standalone
|
|
CMPL DX, $0x0100ffff
|
|
JB repeat_five_standalone
|
|
LEAL -16842747(DX), DX
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
ADDQ $0x05, BX
|
|
JMP emit_repeat_again_standalone
|
|
|
|
repeat_five_standalone:
|
|
LEAL -65536(DX), DX
|
|
MOVL DX, CX
|
|
MOVW $0x001d, (AX)
|
|
MOVW DX, 2(AX)
|
|
SARL $0x10, CX
|
|
MOVB CL, 4(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_four_standalone:
|
|
LEAL -256(DX), DX
|
|
MOVW $0x0019, (AX)
|
|
MOVW DX, 2(AX)
|
|
ADDQ $0x04, BX
|
|
ADDQ $0x04, AX
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_three_standalone:
|
|
LEAL -4(DX), DX
|
|
MOVW $0x0015, (AX)
|
|
MOVB DL, 2(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_two_standalone:
|
|
SHLL $0x02, DX
|
|
ORL $0x01, DX
|
|
MOVW DX, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_two_offset_standalone:
|
|
XORQ SI, SI
|
|
LEAL 1(SI)(DX*4), DX
|
|
MOVB CL, 1(AX)
|
|
SARL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, DX
|
|
MOVB DL, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
|
|
gen_emit_repeat_end:
|
|
MOVQ BX, ret+40(FP)
|
|
RET
|
|
|
|
// func emitCopy(dst []byte, offset int, length int) int
|
|
TEXT ·emitCopy(SB), NOSPLIT, $0-48
|
|
XORQ BX, BX
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ offset+24(FP), CX
|
|
MOVQ length+32(FP), DX
|
|
|
|
// emitCopy
|
|
CMPL CX, $0x00010000
|
|
JB two_byte_offset_standalone
|
|
CMPL DX, $0x40
|
|
JBE four_bytes_remain_standalone
|
|
MOVB $0xff, (AX)
|
|
MOVL CX, 1(AX)
|
|
LEAL -64(DX), DX
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
CMPL DX, $0x04
|
|
JB four_bytes_remain_standalone
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone_emit_copy:
|
|
MOVL DX, SI
|
|
LEAL -4(DX), DX
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_standalone_emit_copy
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_standalone_emit_copy
|
|
CMPL CX, $0x00000800
|
|
JB repeat_two_offset_standalone_emit_copy
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy:
|
|
CMPL DX, $0x00000104
|
|
JB repeat_three_standalone_emit_copy
|
|
CMPL DX, $0x00010100
|
|
JB repeat_four_standalone_emit_copy
|
|
CMPL DX, $0x0100ffff
|
|
JB repeat_five_standalone_emit_copy
|
|
LEAL -16842747(DX), DX
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
ADDQ $0x05, BX
|
|
JMP emit_repeat_again_standalone_emit_copy
|
|
|
|
repeat_five_standalone_emit_copy:
|
|
LEAL -65536(DX), DX
|
|
MOVL DX, CX
|
|
MOVW $0x001d, (AX)
|
|
MOVW DX, 2(AX)
|
|
SARL $0x10, CX
|
|
MOVB CL, 4(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy:
|
|
LEAL -256(DX), DX
|
|
MOVW $0x0019, (AX)
|
|
MOVW DX, 2(AX)
|
|
ADDQ $0x04, BX
|
|
ADDQ $0x04, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy:
|
|
LEAL -4(DX), DX
|
|
MOVW $0x0015, (AX)
|
|
MOVB DL, 2(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy:
|
|
SHLL $0x02, DX
|
|
ORL $0x01, DX
|
|
MOVW DX, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy:
|
|
XORQ SI, SI
|
|
LEAL 1(SI)(DX*4), DX
|
|
MOVB CL, 1(AX)
|
|
SARL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, DX
|
|
MOVB DL, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
four_bytes_remain_standalone:
|
|
TESTL DX, DX
|
|
JZ gen_emit_copy_end
|
|
XORL SI, SI
|
|
LEAL -1(SI)(DX*4), DX
|
|
MOVB DL, (AX)
|
|
MOVL CX, 1(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
two_byte_offset_standalone:
|
|
CMPL DX, $0x40
|
|
JBE two_byte_offset_short_standalone
|
|
CMPL CX, $0x00000800
|
|
JAE long_offset_short_standalone
|
|
MOVL $0x00000001, SI
|
|
LEAL 16(SI), SI
|
|
MOVB CL, 1(AX)
|
|
MOVL CX, DI
|
|
SHRL $0x08, DI
|
|
SHLL $0x05, DI
|
|
ORL DI, SI
|
|
MOVB SI, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
SUBL $0x08, DX
|
|
|
|
// emitRepeat
|
|
LEAL -4(DX), DX
|
|
JMP cant_repeat_two_offset_standalone_emit_copy_short_2b
|
|
|
|
emit_repeat_again_standalone_emit_copy_short_2b:
|
|
MOVL DX, SI
|
|
LEAL -4(DX), DX
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_standalone_emit_copy_short_2b
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_standalone_emit_copy_short_2b
|
|
CMPL CX, $0x00000800
|
|
JB repeat_two_offset_standalone_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy_short_2b:
|
|
CMPL DX, $0x00000104
|
|
JB repeat_three_standalone_emit_copy_short_2b
|
|
CMPL DX, $0x00010100
|
|
JB repeat_four_standalone_emit_copy_short_2b
|
|
CMPL DX, $0x0100ffff
|
|
JB repeat_five_standalone_emit_copy_short_2b
|
|
LEAL -16842747(DX), DX
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
ADDQ $0x05, BX
|
|
JMP emit_repeat_again_standalone_emit_copy_short_2b
|
|
|
|
repeat_five_standalone_emit_copy_short_2b:
|
|
LEAL -65536(DX), DX
|
|
MOVL DX, CX
|
|
MOVW $0x001d, (AX)
|
|
MOVW DX, 2(AX)
|
|
SARL $0x10, CX
|
|
MOVB CL, 4(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy_short_2b:
|
|
LEAL -256(DX), DX
|
|
MOVW $0x0019, (AX)
|
|
MOVW DX, 2(AX)
|
|
ADDQ $0x04, BX
|
|
ADDQ $0x04, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy_short_2b:
|
|
LEAL -4(DX), DX
|
|
MOVW $0x0015, (AX)
|
|
MOVB DL, 2(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy_short_2b:
|
|
SHLL $0x02, DX
|
|
ORL $0x01, DX
|
|
MOVW DX, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy_short_2b:
|
|
XORQ SI, SI
|
|
LEAL 1(SI)(DX*4), DX
|
|
MOVB CL, 1(AX)
|
|
SARL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, DX
|
|
MOVB DL, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
long_offset_short_standalone:
|
|
MOVB $0xee, (AX)
|
|
MOVW CX, 1(AX)
|
|
LEAL -60(DX), DX
|
|
ADDQ $0x03, AX
|
|
ADDQ $0x03, BX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone_emit_copy_short:
|
|
MOVL DX, SI
|
|
LEAL -4(DX), DX
|
|
CMPL SI, $0x08
|
|
JBE repeat_two_standalone_emit_copy_short
|
|
CMPL SI, $0x0c
|
|
JAE cant_repeat_two_offset_standalone_emit_copy_short
|
|
CMPL CX, $0x00000800
|
|
JB repeat_two_offset_standalone_emit_copy_short
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy_short:
|
|
CMPL DX, $0x00000104
|
|
JB repeat_three_standalone_emit_copy_short
|
|
CMPL DX, $0x00010100
|
|
JB repeat_four_standalone_emit_copy_short
|
|
CMPL DX, $0x0100ffff
|
|
JB repeat_five_standalone_emit_copy_short
|
|
LEAL -16842747(DX), DX
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
ADDQ $0x05, BX
|
|
JMP emit_repeat_again_standalone_emit_copy_short
|
|
|
|
repeat_five_standalone_emit_copy_short:
|
|
LEAL -65536(DX), DX
|
|
MOVL DX, CX
|
|
MOVW $0x001d, (AX)
|
|
MOVW DX, 2(AX)
|
|
SARL $0x10, CX
|
|
MOVB CL, 4(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy_short:
|
|
LEAL -256(DX), DX
|
|
MOVW $0x0019, (AX)
|
|
MOVW DX, 2(AX)
|
|
ADDQ $0x04, BX
|
|
ADDQ $0x04, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy_short:
|
|
LEAL -4(DX), DX
|
|
MOVW $0x0015, (AX)
|
|
MOVB DL, 2(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy_short:
|
|
SHLL $0x02, DX
|
|
ORL $0x01, DX
|
|
MOVW DX, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy_short:
|
|
XORQ SI, SI
|
|
LEAL 1(SI)(DX*4), DX
|
|
MOVB CL, 1(AX)
|
|
SARL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, DX
|
|
MOVB DL, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
two_byte_offset_short_standalone:
|
|
MOVL DX, SI
|
|
SHLL $0x02, SI
|
|
CMPL DX, $0x0c
|
|
JAE emit_copy_three_standalone
|
|
CMPL CX, $0x00000800
|
|
JAE emit_copy_three_standalone
|
|
LEAL -15(SI), SI
|
|
MOVB CL, 1(AX)
|
|
SHRL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, SI
|
|
MOVB SI, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end
|
|
|
|
emit_copy_three_standalone:
|
|
LEAL -2(SI), SI
|
|
MOVB SI, (AX)
|
|
MOVW CX, 1(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
|
|
gen_emit_copy_end:
|
|
MOVQ BX, ret+40(FP)
|
|
RET
|
|
|
|
// func emitCopyNoRepeat(dst []byte, offset int, length int) int
|
|
TEXT ·emitCopyNoRepeat(SB), NOSPLIT, $0-48
|
|
XORQ BX, BX
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ offset+24(FP), CX
|
|
MOVQ length+32(FP), DX
|
|
|
|
// emitCopy
|
|
CMPL CX, $0x00010000
|
|
JB two_byte_offset_standalone_snappy
|
|
|
|
four_bytes_loop_back_standalone_snappy:
|
|
CMPL DX, $0x40
|
|
JBE four_bytes_remain_standalone_snappy
|
|
MOVB $0xff, (AX)
|
|
MOVL CX, 1(AX)
|
|
LEAL -64(DX), DX
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
CMPL DX, $0x04
|
|
JB four_bytes_remain_standalone_snappy
|
|
JMP four_bytes_loop_back_standalone_snappy
|
|
|
|
four_bytes_remain_standalone_snappy:
|
|
TESTL DX, DX
|
|
JZ gen_emit_copy_end_snappy
|
|
XORL SI, SI
|
|
LEAL -1(SI)(DX*4), DX
|
|
MOVB DL, (AX)
|
|
MOVL CX, 1(AX)
|
|
ADDQ $0x05, BX
|
|
ADDQ $0x05, AX
|
|
JMP gen_emit_copy_end_snappy
|
|
|
|
two_byte_offset_standalone_snappy:
|
|
CMPL DX, $0x40
|
|
JBE two_byte_offset_short_standalone_snappy
|
|
MOVB $0xee, (AX)
|
|
MOVW CX, 1(AX)
|
|
LEAL -60(DX), DX
|
|
ADDQ $0x03, AX
|
|
ADDQ $0x03, BX
|
|
JMP two_byte_offset_standalone_snappy
|
|
|
|
two_byte_offset_short_standalone_snappy:
|
|
MOVL DX, SI
|
|
SHLL $0x02, SI
|
|
CMPL DX, $0x0c
|
|
JAE emit_copy_three_standalone_snappy
|
|
CMPL CX, $0x00000800
|
|
JAE emit_copy_three_standalone_snappy
|
|
LEAL -15(SI), SI
|
|
MOVB CL, 1(AX)
|
|
SHRL $0x08, CX
|
|
SHLL $0x05, CX
|
|
ORL CX, SI
|
|
MOVB SI, (AX)
|
|
ADDQ $0x02, BX
|
|
ADDQ $0x02, AX
|
|
JMP gen_emit_copy_end_snappy
|
|
|
|
emit_copy_three_standalone_snappy:
|
|
LEAL -2(SI), SI
|
|
MOVB SI, (AX)
|
|
MOVW CX, 1(AX)
|
|
ADDQ $0x03, BX
|
|
ADDQ $0x03, AX
|
|
|
|
gen_emit_copy_end_snappy:
|
|
MOVQ BX, ret+40(FP)
|
|
RET
|
|
|
|
// func matchLen(a []byte, b []byte) int
|
|
// Requires: BMI
|
|
TEXT ·matchLen(SB), NOSPLIT, $0-56
|
|
MOVQ a_base+0(FP), AX
|
|
MOVQ b_base+24(FP), CX
|
|
MOVQ a_len+8(FP), DX
|
|
|
|
// matchLen
|
|
XORL SI, SI
|
|
|
|
matchlen_loopback_16_standalone:
|
|
CMPL DX, $0x10
|
|
JB matchlen_match8_standalone
|
|
MOVQ (AX)(SI*1), BX
|
|
MOVQ 8(AX)(SI*1), DI
|
|
XORQ (CX)(SI*1), BX
|
|
JNZ matchlen_bsf_8_standalone
|
|
XORQ 8(CX)(SI*1), DI
|
|
JNZ matchlen_bsf_16standalone
|
|
LEAL -16(DX), DX
|
|
LEAL 16(SI), SI
|
|
JMP matchlen_loopback_16_standalone
|
|
|
|
matchlen_bsf_16standalone:
|
|
TZCNTQ DI, DI
|
|
SARQ $0x03, DI
|
|
LEAL 8(SI)(DI*1), SI
|
|
JMP gen_match_len_end
|
|
|
|
matchlen_match8_standalone:
|
|
CMPL DX, $0x08
|
|
JB matchlen_match4_standalone
|
|
MOVQ (AX)(SI*1), BX
|
|
XORQ (CX)(SI*1), BX
|
|
JNZ matchlen_bsf_8_standalone
|
|
LEAL -8(DX), DX
|
|
LEAL 8(SI), SI
|
|
JMP matchlen_match4_standalone
|
|
|
|
matchlen_bsf_8_standalone:
|
|
TZCNTQ BX, BX
|
|
SARQ $0x03, BX
|
|
LEAL (SI)(BX*1), SI
|
|
JMP gen_match_len_end
|
|
|
|
matchlen_match4_standalone:
|
|
CMPL DX, $0x04
|
|
JB matchlen_match2_standalone
|
|
MOVL (AX)(SI*1), BX
|
|
CMPL (CX)(SI*1), BX
|
|
JNE matchlen_match2_standalone
|
|
LEAL -4(DX), DX
|
|
LEAL 4(SI), SI
|
|
|
|
matchlen_match2_standalone:
|
|
CMPL DX, $0x01
|
|
JE matchlen_match1_standalone
|
|
JB gen_match_len_end
|
|
MOVW (AX)(SI*1), BX
|
|
CMPW (CX)(SI*1), BX
|
|
JNE matchlen_match1_standalone
|
|
LEAL 2(SI), SI
|
|
SUBL $0x02, DX
|
|
JZ gen_match_len_end
|
|
|
|
matchlen_match1_standalone:
|
|
MOVB (AX)(SI*1), BL
|
|
CMPB (CX)(SI*1), BL
|
|
JNE gen_match_len_end
|
|
LEAL 1(SI), SI
|
|
|
|
gen_match_len_end:
|
|
MOVQ SI, ret+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4BlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4BlockAsm(SB), NOSPLIT, $0-64
|
|
XORQ SI, SI
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ dst_len+8(FP), CX
|
|
MOVQ src_base+24(FP), DX
|
|
MOVQ src_len+32(FP), BX
|
|
LEAQ (DX)(BX*1), BX
|
|
LEAQ -8(AX)(CX*1), CX
|
|
XORQ DI, DI
|
|
|
|
lz4_s2_loop:
|
|
CMPQ DX, BX
|
|
JAE lz4_s2_corrupt
|
|
CMPQ AX, CX
|
|
JAE lz4_s2_dstfull
|
|
MOVBQZX (DX), R8
|
|
MOVQ R8, R9
|
|
MOVQ R8, R10
|
|
SHRQ $0x04, R9
|
|
ANDQ $0x0f, R10
|
|
CMPQ R8, $0xf0
|
|
JB lz4_s2_ll_end
|
|
|
|
lz4_s2_ll_loop:
|
|
INCQ DX
|
|
CMPQ DX, BX
|
|
JAE lz4_s2_corrupt
|
|
MOVBQZX (DX), R8
|
|
ADDQ R8, R9
|
|
CMPQ R8, $0xff
|
|
JEQ lz4_s2_ll_loop
|
|
|
|
lz4_s2_ll_end:
|
|
LEAQ (DX)(R9*1), R8
|
|
ADDQ $0x04, R10
|
|
CMPQ R8, BX
|
|
JAE lz4_s2_corrupt
|
|
INCQ DX
|
|
INCQ R8
|
|
TESTQ R9, R9
|
|
JZ lz4_s2_lits_done
|
|
LEAQ (AX)(R9*1), R11
|
|
CMPQ R11, CX
|
|
JAE lz4_s2_dstfull
|
|
ADDQ R9, SI
|
|
LEAL -1(R9), R11
|
|
CMPL R11, $0x3c
|
|
JB one_byte_lz4_s2
|
|
CMPL R11, $0x00000100
|
|
JB two_bytes_lz4_s2
|
|
CMPL R11, $0x00010000
|
|
JB three_bytes_lz4_s2
|
|
CMPL R11, $0x01000000
|
|
JB four_bytes_lz4_s2
|
|
MOVB $0xfc, (AX)
|
|
MOVL R11, 1(AX)
|
|
ADDQ $0x05, AX
|
|
JMP memmove_long_lz4_s2
|
|
|
|
four_bytes_lz4_s2:
|
|
MOVL R11, R12
|
|
SHRL $0x10, R12
|
|
MOVB $0xf8, (AX)
|
|
MOVW R11, 1(AX)
|
|
MOVB R12, 3(AX)
|
|
ADDQ $0x04, AX
|
|
JMP memmove_long_lz4_s2
|
|
|
|
three_bytes_lz4_s2:
|
|
MOVB $0xf4, (AX)
|
|
MOVW R11, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP memmove_long_lz4_s2
|
|
|
|
two_bytes_lz4_s2:
|
|
MOVB $0xf0, (AX)
|
|
MOVB R11, 1(AX)
|
|
ADDQ $0x02, AX
|
|
CMPL R11, $0x40
|
|
JB memmove_lz4_s2
|
|
JMP memmove_long_lz4_s2
|
|
|
|
one_byte_lz4_s2:
|
|
SHLB $0x02, R11
|
|
MOVB R11, (AX)
|
|
ADDQ $0x01, AX
|
|
|
|
memmove_lz4_s2:
|
|
LEAQ (AX)(R9*1), R11
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_lz4_s2_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_lz4_s2_memmove_move_8through16
|
|
CMPQ R9, $0x20
|
|
JBE emit_lit_memmove_lz4_s2_memmove_move_17through32
|
|
JMP emit_lit_memmove_lz4_s2_memmove_move_33through64
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_8:
|
|
MOVQ (DX), R12
|
|
MOVQ R12, (AX)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_8through16:
|
|
MOVQ (DX), R12
|
|
MOVQ -8(DX)(R9*1), DX
|
|
MOVQ R12, (AX)
|
|
MOVQ DX, -8(AX)(R9*1)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_17through32:
|
|
MOVOU (DX), X0
|
|
MOVOU -16(DX)(R9*1), X1
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, -16(AX)(R9*1)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_33through64:
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R9*1), X2
|
|
MOVOU -16(DX)(R9*1), X3
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R9*1)
|
|
MOVOU X3, -16(AX)(R9*1)
|
|
|
|
memmove_end_copy_lz4_s2:
|
|
MOVQ R11, AX
|
|
JMP lz4_s2_lits_emit_done
|
|
|
|
memmove_long_lz4_s2:
|
|
LEAQ (AX)(R9*1), R11
|
|
|
|
// genMemMoveLong
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R9*1), X2
|
|
MOVOU -16(DX)(R9*1), X3
|
|
MOVQ R9, R13
|
|
SHRQ $0x05, R13
|
|
MOVQ AX, R12
|
|
ANDL $0x0000001f, R12
|
|
MOVQ $0x00000040, R14
|
|
SUBQ R12, R14
|
|
DECQ R13
|
|
JA emit_lit_memmove_long_lz4_s2large_forward_sse_loop_32
|
|
LEAQ -32(DX)(R14*1), R12
|
|
LEAQ -32(AX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_lz4_s2large_big_loop_back:
|
|
MOVOU (R12), X4
|
|
MOVOU 16(R12), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R12
|
|
ADDQ $0x20, R14
|
|
DECQ R13
|
|
JNA emit_lit_memmove_long_lz4_s2large_big_loop_back
|
|
|
|
emit_lit_memmove_long_lz4_s2large_forward_sse_loop_32:
|
|
MOVOU -32(DX)(R14*1), X4
|
|
MOVOU -16(DX)(R14*1), X5
|
|
MOVOA X4, -32(AX)(R14*1)
|
|
MOVOA X5, -16(AX)(R14*1)
|
|
ADDQ $0x20, R14
|
|
CMPQ R9, R14
|
|
JAE emit_lit_memmove_long_lz4_s2large_forward_sse_loop_32
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R9*1)
|
|
MOVOU X3, -16(AX)(R9*1)
|
|
MOVQ R11, AX
|
|
|
|
lz4_s2_lits_emit_done:
|
|
MOVQ R8, DX
|
|
|
|
lz4_s2_lits_done:
|
|
CMPQ DX, BX
|
|
JNE lz4_s2_match
|
|
CMPQ R10, $0x04
|
|
JEQ lz4_s2_done
|
|
JMP lz4_s2_corrupt
|
|
|
|
lz4_s2_match:
|
|
LEAQ 2(DX), R8
|
|
CMPQ R8, BX
|
|
JAE lz4_s2_corrupt
|
|
MOVWQZX (DX), R9
|
|
MOVQ R8, DX
|
|
TESTQ R9, R9
|
|
JZ lz4_s2_corrupt
|
|
CMPQ R9, SI
|
|
JA lz4_s2_corrupt
|
|
CMPQ R10, $0x13
|
|
JNE lz4_s2_ml_done
|
|
|
|
lz4_s2_ml_loop:
|
|
MOVBQZX (DX), R8
|
|
INCQ DX
|
|
ADDQ R8, R10
|
|
CMPQ DX, BX
|
|
JAE lz4_s2_corrupt
|
|
CMPQ R8, $0xff
|
|
JEQ lz4_s2_ml_loop
|
|
|
|
lz4_s2_ml_done:
|
|
ADDQ R10, SI
|
|
CMPQ R9, DI
|
|
JNE lz4_s2_docopy
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2
|
|
|
|
cant_repeat_two_offset_lz4_s2:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2
|
|
|
|
repeat_five_lz4_s2:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
lz4_s2_docopy:
|
|
MOVQ R9, DI
|
|
|
|
// emitCopy
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JAE long_offset_short_lz4_s2
|
|
MOVL $0x00000001, R8
|
|
LEAL 16(R8), R8
|
|
MOVB R9, 1(AX)
|
|
MOVL R9, R11
|
|
SHRL $0x08, R11
|
|
SHLL $0x05, R11
|
|
ORL R11, R8
|
|
MOVB R8, (AX)
|
|
ADDQ $0x02, AX
|
|
SUBL $0x08, R10
|
|
|
|
// emitRepeat
|
|
LEAL -4(R10), R10
|
|
JMP cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
emit_repeat_again_lz4_s2_emit_copy_short_2b:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2_emit_copy_short_2b
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2_emit_copy_short_2b
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2_emit_copy_short_2b
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short_2b
|
|
|
|
repeat_five_lz4_s2_emit_copy_short_2b:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short_2b:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short_2b:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short_2b:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
long_offset_short_lz4_s2:
|
|
MOVB $0xee, (AX)
|
|
MOVW R9, 1(AX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, AX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2_emit_copy_short:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2_emit_copy_short
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2_emit_copy_short
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2_emit_copy_short
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2_emit_copy_short
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2_emit_copy_short
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short
|
|
|
|
repeat_five_lz4_s2_emit_copy_short:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVL R10, R8
|
|
SHLL $0x02, R8
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JAE emit_copy_three_lz4_s2
|
|
LEAL -15(R8), R8
|
|
MOVB R9, 1(AX)
|
|
SHRL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R8
|
|
MOVB R8, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_s2_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
LEAL -2(R8), R8
|
|
MOVB R8, (AX)
|
|
MOVW R9, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4_s2_loop
|
|
|
|
lz4_s2_done:
|
|
MOVQ dst_base+0(FP), CX
|
|
SUBQ CX, AX
|
|
MOVQ SI, uncompressed+48(FP)
|
|
MOVQ AX, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4_s2_corrupt:
|
|
XORQ AX, AX
|
|
LEAQ -1(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4_s2_dstfull:
|
|
XORQ AX, AX
|
|
LEAQ -2(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4sBlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4sBlockAsm(SB), NOSPLIT, $0-64
|
|
XORQ SI, SI
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ dst_len+8(FP), CX
|
|
MOVQ src_base+24(FP), DX
|
|
MOVQ src_len+32(FP), BX
|
|
LEAQ (DX)(BX*1), BX
|
|
LEAQ -8(AX)(CX*1), CX
|
|
XORQ DI, DI
|
|
|
|
lz4s_s2_loop:
|
|
CMPQ DX, BX
|
|
JAE lz4s_s2_corrupt
|
|
CMPQ AX, CX
|
|
JAE lz4s_s2_dstfull
|
|
MOVBQZX (DX), R8
|
|
MOVQ R8, R9
|
|
MOVQ R8, R10
|
|
SHRQ $0x04, R9
|
|
ANDQ $0x0f, R10
|
|
CMPQ R8, $0xf0
|
|
JB lz4s_s2_ll_end
|
|
|
|
lz4s_s2_ll_loop:
|
|
INCQ DX
|
|
CMPQ DX, BX
|
|
JAE lz4s_s2_corrupt
|
|
MOVBQZX (DX), R8
|
|
ADDQ R8, R9
|
|
CMPQ R8, $0xff
|
|
JEQ lz4s_s2_ll_loop
|
|
|
|
lz4s_s2_ll_end:
|
|
LEAQ (DX)(R9*1), R8
|
|
ADDQ $0x03, R10
|
|
CMPQ R8, BX
|
|
JAE lz4s_s2_corrupt
|
|
INCQ DX
|
|
INCQ R8
|
|
TESTQ R9, R9
|
|
JZ lz4s_s2_lits_done
|
|
LEAQ (AX)(R9*1), R11
|
|
CMPQ R11, CX
|
|
JAE lz4s_s2_dstfull
|
|
ADDQ R9, SI
|
|
LEAL -1(R9), R11
|
|
CMPL R11, $0x3c
|
|
JB one_byte_lz4s_s2
|
|
CMPL R11, $0x00000100
|
|
JB two_bytes_lz4s_s2
|
|
CMPL R11, $0x00010000
|
|
JB three_bytes_lz4s_s2
|
|
CMPL R11, $0x01000000
|
|
JB four_bytes_lz4s_s2
|
|
MOVB $0xfc, (AX)
|
|
MOVL R11, 1(AX)
|
|
ADDQ $0x05, AX
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
four_bytes_lz4s_s2:
|
|
MOVL R11, R12
|
|
SHRL $0x10, R12
|
|
MOVB $0xf8, (AX)
|
|
MOVW R11, 1(AX)
|
|
MOVB R12, 3(AX)
|
|
ADDQ $0x04, AX
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
three_bytes_lz4s_s2:
|
|
MOVB $0xf4, (AX)
|
|
MOVW R11, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
two_bytes_lz4s_s2:
|
|
MOVB $0xf0, (AX)
|
|
MOVB R11, 1(AX)
|
|
ADDQ $0x02, AX
|
|
CMPL R11, $0x40
|
|
JB memmove_lz4s_s2
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
one_byte_lz4s_s2:
|
|
SHLB $0x02, R11
|
|
MOVB R11, (AX)
|
|
ADDQ $0x01, AX
|
|
|
|
memmove_lz4s_s2:
|
|
LEAQ (AX)(R9*1), R11
|
|
|
|
// genMemMoveShort
|
|
CMPQ R9, $0x08
|
|
JBE emit_lit_memmove_lz4s_s2_memmove_move_8
|
|
CMPQ R9, $0x10
|
|
JBE emit_lit_memmove_lz4s_s2_memmove_move_8through16
|
|
CMPQ R9, $0x20
|
|
JBE emit_lit_memmove_lz4s_s2_memmove_move_17through32
|
|
JMP emit_lit_memmove_lz4s_s2_memmove_move_33through64
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_8:
|
|
MOVQ (DX), R12
|
|
MOVQ R12, (AX)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_8through16:
|
|
MOVQ (DX), R12
|
|
MOVQ -8(DX)(R9*1), DX
|
|
MOVQ R12, (AX)
|
|
MOVQ DX, -8(AX)(R9*1)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_17through32:
|
|
MOVOU (DX), X0
|
|
MOVOU -16(DX)(R9*1), X1
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, -16(AX)(R9*1)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_33through64:
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R9*1), X2
|
|
MOVOU -16(DX)(R9*1), X3
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R9*1)
|
|
MOVOU X3, -16(AX)(R9*1)
|
|
|
|
memmove_end_copy_lz4s_s2:
|
|
MOVQ R11, AX
|
|
JMP lz4s_s2_lits_emit_done
|
|
|
|
memmove_long_lz4s_s2:
|
|
LEAQ (AX)(R9*1), R11
|
|
|
|
// genMemMoveLong
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R9*1), X2
|
|
MOVOU -16(DX)(R9*1), X3
|
|
MOVQ R9, R13
|
|
SHRQ $0x05, R13
|
|
MOVQ AX, R12
|
|
ANDL $0x0000001f, R12
|
|
MOVQ $0x00000040, R14
|
|
SUBQ R12, R14
|
|
DECQ R13
|
|
JA emit_lit_memmove_long_lz4s_s2large_forward_sse_loop_32
|
|
LEAQ -32(DX)(R14*1), R12
|
|
LEAQ -32(AX)(R14*1), R15
|
|
|
|
emit_lit_memmove_long_lz4s_s2large_big_loop_back:
|
|
MOVOU (R12), X4
|
|
MOVOU 16(R12), X5
|
|
MOVOA X4, (R15)
|
|
MOVOA X5, 16(R15)
|
|
ADDQ $0x20, R15
|
|
ADDQ $0x20, R12
|
|
ADDQ $0x20, R14
|
|
DECQ R13
|
|
JNA emit_lit_memmove_long_lz4s_s2large_big_loop_back
|
|
|
|
emit_lit_memmove_long_lz4s_s2large_forward_sse_loop_32:
|
|
MOVOU -32(DX)(R14*1), X4
|
|
MOVOU -16(DX)(R14*1), X5
|
|
MOVOA X4, -32(AX)(R14*1)
|
|
MOVOA X5, -16(AX)(R14*1)
|
|
ADDQ $0x20, R14
|
|
CMPQ R9, R14
|
|
JAE emit_lit_memmove_long_lz4s_s2large_forward_sse_loop_32
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R9*1)
|
|
MOVOU X3, -16(AX)(R9*1)
|
|
MOVQ R11, AX
|
|
|
|
lz4s_s2_lits_emit_done:
|
|
MOVQ R8, DX
|
|
|
|
lz4s_s2_lits_done:
|
|
CMPQ DX, BX
|
|
JNE lz4s_s2_match
|
|
CMPQ R10, $0x03
|
|
JEQ lz4s_s2_done
|
|
JMP lz4s_s2_corrupt
|
|
|
|
lz4s_s2_match:
|
|
CMPQ R10, $0x03
|
|
JEQ lz4s_s2_loop
|
|
LEAQ 2(DX), R8
|
|
CMPQ R8, BX
|
|
JAE lz4s_s2_corrupt
|
|
MOVWQZX (DX), R9
|
|
MOVQ R8, DX
|
|
TESTQ R9, R9
|
|
JZ lz4s_s2_corrupt
|
|
CMPQ R9, SI
|
|
JA lz4s_s2_corrupt
|
|
CMPQ R10, $0x12
|
|
JNE lz4s_s2_ml_done
|
|
|
|
lz4s_s2_ml_loop:
|
|
MOVBQZX (DX), R8
|
|
INCQ DX
|
|
ADDQ R8, R10
|
|
CMPQ DX, BX
|
|
JAE lz4s_s2_corrupt
|
|
CMPQ R8, $0xff
|
|
JEQ lz4s_s2_ml_loop
|
|
|
|
lz4s_s2_ml_done:
|
|
ADDQ R10, SI
|
|
CMPQ R9, DI
|
|
JNE lz4s_s2_docopy
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2
|
|
|
|
cant_repeat_two_offset_lz4_s2:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2
|
|
|
|
repeat_five_lz4_s2:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
lz4s_s2_docopy:
|
|
MOVQ R9, DI
|
|
|
|
// emitCopy
|
|
CMPL R10, $0x40
|
|
JBE two_byte_offset_short_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JAE long_offset_short_lz4_s2
|
|
MOVL $0x00000001, R8
|
|
LEAL 16(R8), R8
|
|
MOVB R9, 1(AX)
|
|
MOVL R9, R11
|
|
SHRL $0x08, R11
|
|
SHLL $0x05, R11
|
|
ORL R11, R8
|
|
MOVB R8, (AX)
|
|
ADDQ $0x02, AX
|
|
SUBL $0x08, R10
|
|
|
|
// emitRepeat
|
|
LEAL -4(R10), R10
|
|
JMP cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
emit_repeat_again_lz4_s2_emit_copy_short_2b:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2_emit_copy_short_2b
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2_emit_copy_short_2b
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2_emit_copy_short_2b
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2_emit_copy_short_2b
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short_2b
|
|
|
|
repeat_five_lz4_s2_emit_copy_short_2b:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short_2b:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short_2b:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short_2b:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
long_offset_short_lz4_s2:
|
|
MOVB $0xee, (AX)
|
|
MOVW R9, 1(AX)
|
|
LEAL -60(R10), R10
|
|
ADDQ $0x03, AX
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2_emit_copy_short:
|
|
MOVL R10, R8
|
|
LEAL -4(R10), R10
|
|
CMPL R8, $0x08
|
|
JBE repeat_two_lz4_s2_emit_copy_short
|
|
CMPL R8, $0x0c
|
|
JAE cant_repeat_two_offset_lz4_s2_emit_copy_short
|
|
CMPL R9, $0x00000800
|
|
JB repeat_two_offset_lz4_s2_emit_copy_short
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short:
|
|
CMPL R10, $0x00000104
|
|
JB repeat_three_lz4_s2_emit_copy_short
|
|
CMPL R10, $0x00010100
|
|
JB repeat_four_lz4_s2_emit_copy_short
|
|
CMPL R10, $0x0100ffff
|
|
JB repeat_five_lz4_s2_emit_copy_short
|
|
LEAL -16842747(R10), R10
|
|
MOVL $0xfffb001d, (AX)
|
|
MOVB $0xff, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short
|
|
|
|
repeat_five_lz4_s2_emit_copy_short:
|
|
LEAL -65536(R10), R10
|
|
MOVL R10, R9
|
|
MOVW $0x001d, (AX)
|
|
MOVW R10, 2(AX)
|
|
SARL $0x10, R9
|
|
MOVB R9, 4(AX)
|
|
ADDQ $0x05, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short:
|
|
LEAL -256(R10), R10
|
|
MOVW $0x0019, (AX)
|
|
MOVW R10, 2(AX)
|
|
ADDQ $0x04, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short:
|
|
LEAL -4(R10), R10
|
|
MOVW $0x0015, (AX)
|
|
MOVB R10, 2(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short:
|
|
SHLL $0x02, R10
|
|
ORL $0x01, R10
|
|
MOVW R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short:
|
|
XORQ R8, R8
|
|
LEAL 1(R8)(R10*4), R10
|
|
MOVB R9, 1(AX)
|
|
SARL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVL R10, R8
|
|
SHLL $0x02, R8
|
|
CMPL R10, $0x0c
|
|
JAE emit_copy_three_lz4_s2
|
|
CMPL R9, $0x00000800
|
|
JAE emit_copy_three_lz4_s2
|
|
LEAL -15(R8), R8
|
|
MOVB R9, 1(AX)
|
|
SHRL $0x08, R9
|
|
SHLL $0x05, R9
|
|
ORL R9, R8
|
|
MOVB R8, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
LEAL -2(R8), R8
|
|
MOVB R8, (AX)
|
|
MOVW R9, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4s_s2_loop
|
|
|
|
lz4s_s2_done:
|
|
MOVQ dst_base+0(FP), CX
|
|
SUBQ CX, AX
|
|
MOVQ SI, uncompressed+48(FP)
|
|
MOVQ AX, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4s_s2_corrupt:
|
|
XORQ AX, AX
|
|
LEAQ -1(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4s_s2_dstfull:
|
|
XORQ AX, AX
|
|
LEAQ -2(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4BlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4BlockSnappyAsm(SB), NOSPLIT, $0-64
|
|
XORQ SI, SI
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ dst_len+8(FP), CX
|
|
MOVQ src_base+24(FP), DX
|
|
MOVQ src_len+32(FP), BX
|
|
LEAQ (DX)(BX*1), BX
|
|
LEAQ -8(AX)(CX*1), CX
|
|
|
|
lz4_snappy_loop:
|
|
CMPQ DX, BX
|
|
JAE lz4_snappy_corrupt
|
|
CMPQ AX, CX
|
|
JAE lz4_snappy_dstfull
|
|
MOVBQZX (DX), DI
|
|
MOVQ DI, R8
|
|
MOVQ DI, R9
|
|
SHRQ $0x04, R8
|
|
ANDQ $0x0f, R9
|
|
CMPQ DI, $0xf0
|
|
JB lz4_snappy_ll_end
|
|
|
|
lz4_snappy_ll_loop:
|
|
INCQ DX
|
|
CMPQ DX, BX
|
|
JAE lz4_snappy_corrupt
|
|
MOVBQZX (DX), DI
|
|
ADDQ DI, R8
|
|
CMPQ DI, $0xff
|
|
JEQ lz4_snappy_ll_loop
|
|
|
|
lz4_snappy_ll_end:
|
|
LEAQ (DX)(R8*1), DI
|
|
ADDQ $0x04, R9
|
|
CMPQ DI, BX
|
|
JAE lz4_snappy_corrupt
|
|
INCQ DX
|
|
INCQ DI
|
|
TESTQ R8, R8
|
|
JZ lz4_snappy_lits_done
|
|
LEAQ (AX)(R8*1), R10
|
|
CMPQ R10, CX
|
|
JAE lz4_snappy_dstfull
|
|
ADDQ R8, SI
|
|
LEAL -1(R8), R10
|
|
CMPL R10, $0x3c
|
|
JB one_byte_lz4_snappy
|
|
CMPL R10, $0x00000100
|
|
JB two_bytes_lz4_snappy
|
|
CMPL R10, $0x00010000
|
|
JB three_bytes_lz4_snappy
|
|
CMPL R10, $0x01000000
|
|
JB four_bytes_lz4_snappy
|
|
MOVB $0xfc, (AX)
|
|
MOVL R10, 1(AX)
|
|
ADDQ $0x05, AX
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
four_bytes_lz4_snappy:
|
|
MOVL R10, R11
|
|
SHRL $0x10, R11
|
|
MOVB $0xf8, (AX)
|
|
MOVW R10, 1(AX)
|
|
MOVB R11, 3(AX)
|
|
ADDQ $0x04, AX
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
three_bytes_lz4_snappy:
|
|
MOVB $0xf4, (AX)
|
|
MOVW R10, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
two_bytes_lz4_snappy:
|
|
MOVB $0xf0, (AX)
|
|
MOVB R10, 1(AX)
|
|
ADDQ $0x02, AX
|
|
CMPL R10, $0x40
|
|
JB memmove_lz4_snappy
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
one_byte_lz4_snappy:
|
|
SHLB $0x02, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x01, AX
|
|
|
|
memmove_lz4_snappy:
|
|
LEAQ (AX)(R8*1), R10
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_lz4_snappy_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_lz4_snappy_memmove_move_8through16
|
|
CMPQ R8, $0x20
|
|
JBE emit_lit_memmove_lz4_snappy_memmove_move_17through32
|
|
JMP emit_lit_memmove_lz4_snappy_memmove_move_33through64
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_8:
|
|
MOVQ (DX), R11
|
|
MOVQ R11, (AX)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_8through16:
|
|
MOVQ (DX), R11
|
|
MOVQ -8(DX)(R8*1), DX
|
|
MOVQ R11, (AX)
|
|
MOVQ DX, -8(AX)(R8*1)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_17through32:
|
|
MOVOU (DX), X0
|
|
MOVOU -16(DX)(R8*1), X1
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, -16(AX)(R8*1)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_33through64:
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R8*1), X2
|
|
MOVOU -16(DX)(R8*1), X3
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R8*1)
|
|
MOVOU X3, -16(AX)(R8*1)
|
|
|
|
memmove_end_copy_lz4_snappy:
|
|
MOVQ R10, AX
|
|
JMP lz4_snappy_lits_emit_done
|
|
|
|
memmove_long_lz4_snappy:
|
|
LEAQ (AX)(R8*1), R10
|
|
|
|
// genMemMoveLong
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R8*1), X2
|
|
MOVOU -16(DX)(R8*1), X3
|
|
MOVQ R8, R12
|
|
SHRQ $0x05, R12
|
|
MOVQ AX, R11
|
|
ANDL $0x0000001f, R11
|
|
MOVQ $0x00000040, R13
|
|
SUBQ R11, R13
|
|
DECQ R12
|
|
JA emit_lit_memmove_long_lz4_snappylarge_forward_sse_loop_32
|
|
LEAQ -32(DX)(R13*1), R11
|
|
LEAQ -32(AX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_lz4_snappylarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
DECQ R12
|
|
JNA emit_lit_memmove_long_lz4_snappylarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_lz4_snappylarge_forward_sse_loop_32:
|
|
MOVOU -32(DX)(R13*1), X4
|
|
MOVOU -16(DX)(R13*1), X5
|
|
MOVOA X4, -32(AX)(R13*1)
|
|
MOVOA X5, -16(AX)(R13*1)
|
|
ADDQ $0x20, R13
|
|
CMPQ R8, R13
|
|
JAE emit_lit_memmove_long_lz4_snappylarge_forward_sse_loop_32
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R8*1)
|
|
MOVOU X3, -16(AX)(R8*1)
|
|
MOVQ R10, AX
|
|
|
|
lz4_snappy_lits_emit_done:
|
|
MOVQ DI, DX
|
|
|
|
lz4_snappy_lits_done:
|
|
CMPQ DX, BX
|
|
JNE lz4_snappy_match
|
|
CMPQ R9, $0x04
|
|
JEQ lz4_snappy_done
|
|
JMP lz4_snappy_corrupt
|
|
|
|
lz4_snappy_match:
|
|
LEAQ 2(DX), DI
|
|
CMPQ DI, BX
|
|
JAE lz4_snappy_corrupt
|
|
MOVWQZX (DX), R8
|
|
MOVQ DI, DX
|
|
TESTQ R8, R8
|
|
JZ lz4_snappy_corrupt
|
|
CMPQ R8, SI
|
|
JA lz4_snappy_corrupt
|
|
CMPQ R9, $0x13
|
|
JNE lz4_snappy_ml_done
|
|
|
|
lz4_snappy_ml_loop:
|
|
MOVBQZX (DX), DI
|
|
INCQ DX
|
|
ADDQ DI, R9
|
|
CMPQ DX, BX
|
|
JAE lz4_snappy_corrupt
|
|
CMPQ DI, $0xff
|
|
JEQ lz4_snappy_ml_loop
|
|
|
|
lz4_snappy_ml_done:
|
|
ADDQ R9, SI
|
|
|
|
// emitCopy
|
|
two_byte_offset_lz4_s2:
|
|
CMPL R9, $0x40
|
|
JBE two_byte_offset_short_lz4_s2
|
|
MOVB $0xee, (AX)
|
|
MOVW R8, 1(AX)
|
|
LEAL -60(R9), R9
|
|
ADDQ $0x03, AX
|
|
CMPQ AX, CX
|
|
JAE lz4_snappy_loop
|
|
JMP two_byte_offset_lz4_s2
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVL R9, DI
|
|
SHLL $0x02, DI
|
|
CMPL R9, $0x0c
|
|
JAE emit_copy_three_lz4_s2
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_lz4_s2
|
|
LEAL -15(DI), DI
|
|
MOVB R8, 1(AX)
|
|
SHRL $0x08, R8
|
|
SHLL $0x05, R8
|
|
ORL R8, DI
|
|
MOVB DI, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4_snappy_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
LEAL -2(DI), DI
|
|
MOVB DI, (AX)
|
|
MOVW R8, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4_snappy_loop
|
|
|
|
lz4_snappy_done:
|
|
MOVQ dst_base+0(FP), CX
|
|
SUBQ CX, AX
|
|
MOVQ SI, uncompressed+48(FP)
|
|
MOVQ AX, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4_snappy_corrupt:
|
|
XORQ AX, AX
|
|
LEAQ -1(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4_snappy_dstfull:
|
|
XORQ AX, AX
|
|
LEAQ -2(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4sBlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4sBlockSnappyAsm(SB), NOSPLIT, $0-64
|
|
XORQ SI, SI
|
|
MOVQ dst_base+0(FP), AX
|
|
MOVQ dst_len+8(FP), CX
|
|
MOVQ src_base+24(FP), DX
|
|
MOVQ src_len+32(FP), BX
|
|
LEAQ (DX)(BX*1), BX
|
|
LEAQ -8(AX)(CX*1), CX
|
|
|
|
lz4s_snappy_loop:
|
|
CMPQ DX, BX
|
|
JAE lz4s_snappy_corrupt
|
|
CMPQ AX, CX
|
|
JAE lz4s_snappy_dstfull
|
|
MOVBQZX (DX), DI
|
|
MOVQ DI, R8
|
|
MOVQ DI, R9
|
|
SHRQ $0x04, R8
|
|
ANDQ $0x0f, R9
|
|
CMPQ DI, $0xf0
|
|
JB lz4s_snappy_ll_end
|
|
|
|
lz4s_snappy_ll_loop:
|
|
INCQ DX
|
|
CMPQ DX, BX
|
|
JAE lz4s_snappy_corrupt
|
|
MOVBQZX (DX), DI
|
|
ADDQ DI, R8
|
|
CMPQ DI, $0xff
|
|
JEQ lz4s_snappy_ll_loop
|
|
|
|
lz4s_snappy_ll_end:
|
|
LEAQ (DX)(R8*1), DI
|
|
ADDQ $0x03, R9
|
|
CMPQ DI, BX
|
|
JAE lz4s_snappy_corrupt
|
|
INCQ DX
|
|
INCQ DI
|
|
TESTQ R8, R8
|
|
JZ lz4s_snappy_lits_done
|
|
LEAQ (AX)(R8*1), R10
|
|
CMPQ R10, CX
|
|
JAE lz4s_snappy_dstfull
|
|
ADDQ R8, SI
|
|
LEAL -1(R8), R10
|
|
CMPL R10, $0x3c
|
|
JB one_byte_lz4s_snappy
|
|
CMPL R10, $0x00000100
|
|
JB two_bytes_lz4s_snappy
|
|
CMPL R10, $0x00010000
|
|
JB three_bytes_lz4s_snappy
|
|
CMPL R10, $0x01000000
|
|
JB four_bytes_lz4s_snappy
|
|
MOVB $0xfc, (AX)
|
|
MOVL R10, 1(AX)
|
|
ADDQ $0x05, AX
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
four_bytes_lz4s_snappy:
|
|
MOVL R10, R11
|
|
SHRL $0x10, R11
|
|
MOVB $0xf8, (AX)
|
|
MOVW R10, 1(AX)
|
|
MOVB R11, 3(AX)
|
|
ADDQ $0x04, AX
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
three_bytes_lz4s_snappy:
|
|
MOVB $0xf4, (AX)
|
|
MOVW R10, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
two_bytes_lz4s_snappy:
|
|
MOVB $0xf0, (AX)
|
|
MOVB R10, 1(AX)
|
|
ADDQ $0x02, AX
|
|
CMPL R10, $0x40
|
|
JB memmove_lz4s_snappy
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
one_byte_lz4s_snappy:
|
|
SHLB $0x02, R10
|
|
MOVB R10, (AX)
|
|
ADDQ $0x01, AX
|
|
|
|
memmove_lz4s_snappy:
|
|
LEAQ (AX)(R8*1), R10
|
|
|
|
// genMemMoveShort
|
|
CMPQ R8, $0x08
|
|
JBE emit_lit_memmove_lz4s_snappy_memmove_move_8
|
|
CMPQ R8, $0x10
|
|
JBE emit_lit_memmove_lz4s_snappy_memmove_move_8through16
|
|
CMPQ R8, $0x20
|
|
JBE emit_lit_memmove_lz4s_snappy_memmove_move_17through32
|
|
JMP emit_lit_memmove_lz4s_snappy_memmove_move_33through64
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_8:
|
|
MOVQ (DX), R11
|
|
MOVQ R11, (AX)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_8through16:
|
|
MOVQ (DX), R11
|
|
MOVQ -8(DX)(R8*1), DX
|
|
MOVQ R11, (AX)
|
|
MOVQ DX, -8(AX)(R8*1)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_17through32:
|
|
MOVOU (DX), X0
|
|
MOVOU -16(DX)(R8*1), X1
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, -16(AX)(R8*1)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_33through64:
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R8*1), X2
|
|
MOVOU -16(DX)(R8*1), X3
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R8*1)
|
|
MOVOU X3, -16(AX)(R8*1)
|
|
|
|
memmove_end_copy_lz4s_snappy:
|
|
MOVQ R10, AX
|
|
JMP lz4s_snappy_lits_emit_done
|
|
|
|
memmove_long_lz4s_snappy:
|
|
LEAQ (AX)(R8*1), R10
|
|
|
|
// genMemMoveLong
|
|
MOVOU (DX), X0
|
|
MOVOU 16(DX), X1
|
|
MOVOU -32(DX)(R8*1), X2
|
|
MOVOU -16(DX)(R8*1), X3
|
|
MOVQ R8, R12
|
|
SHRQ $0x05, R12
|
|
MOVQ AX, R11
|
|
ANDL $0x0000001f, R11
|
|
MOVQ $0x00000040, R13
|
|
SUBQ R11, R13
|
|
DECQ R12
|
|
JA emit_lit_memmove_long_lz4s_snappylarge_forward_sse_loop_32
|
|
LEAQ -32(DX)(R13*1), R11
|
|
LEAQ -32(AX)(R13*1), R14
|
|
|
|
emit_lit_memmove_long_lz4s_snappylarge_big_loop_back:
|
|
MOVOU (R11), X4
|
|
MOVOU 16(R11), X5
|
|
MOVOA X4, (R14)
|
|
MOVOA X5, 16(R14)
|
|
ADDQ $0x20, R14
|
|
ADDQ $0x20, R11
|
|
ADDQ $0x20, R13
|
|
DECQ R12
|
|
JNA emit_lit_memmove_long_lz4s_snappylarge_big_loop_back
|
|
|
|
emit_lit_memmove_long_lz4s_snappylarge_forward_sse_loop_32:
|
|
MOVOU -32(DX)(R13*1), X4
|
|
MOVOU -16(DX)(R13*1), X5
|
|
MOVOA X4, -32(AX)(R13*1)
|
|
MOVOA X5, -16(AX)(R13*1)
|
|
ADDQ $0x20, R13
|
|
CMPQ R8, R13
|
|
JAE emit_lit_memmove_long_lz4s_snappylarge_forward_sse_loop_32
|
|
MOVOU X0, (AX)
|
|
MOVOU X1, 16(AX)
|
|
MOVOU X2, -32(AX)(R8*1)
|
|
MOVOU X3, -16(AX)(R8*1)
|
|
MOVQ R10, AX
|
|
|
|
lz4s_snappy_lits_emit_done:
|
|
MOVQ DI, DX
|
|
|
|
lz4s_snappy_lits_done:
|
|
CMPQ DX, BX
|
|
JNE lz4s_snappy_match
|
|
CMPQ R9, $0x03
|
|
JEQ lz4s_snappy_done
|
|
JMP lz4s_snappy_corrupt
|
|
|
|
lz4s_snappy_match:
|
|
CMPQ R9, $0x03
|
|
JEQ lz4s_snappy_loop
|
|
LEAQ 2(DX), DI
|
|
CMPQ DI, BX
|
|
JAE lz4s_snappy_corrupt
|
|
MOVWQZX (DX), R8
|
|
MOVQ DI, DX
|
|
TESTQ R8, R8
|
|
JZ lz4s_snappy_corrupt
|
|
CMPQ R8, SI
|
|
JA lz4s_snappy_corrupt
|
|
CMPQ R9, $0x12
|
|
JNE lz4s_snappy_ml_done
|
|
|
|
lz4s_snappy_ml_loop:
|
|
MOVBQZX (DX), DI
|
|
INCQ DX
|
|
ADDQ DI, R9
|
|
CMPQ DX, BX
|
|
JAE lz4s_snappy_corrupt
|
|
CMPQ DI, $0xff
|
|
JEQ lz4s_snappy_ml_loop
|
|
|
|
lz4s_snappy_ml_done:
|
|
ADDQ R9, SI
|
|
|
|
// emitCopy
|
|
two_byte_offset_lz4_s2:
|
|
CMPL R9, $0x40
|
|
JBE two_byte_offset_short_lz4_s2
|
|
MOVB $0xee, (AX)
|
|
MOVW R8, 1(AX)
|
|
LEAL -60(R9), R9
|
|
ADDQ $0x03, AX
|
|
CMPQ AX, CX
|
|
JAE lz4s_snappy_loop
|
|
JMP two_byte_offset_lz4_s2
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVL R9, DI
|
|
SHLL $0x02, DI
|
|
CMPL R9, $0x0c
|
|
JAE emit_copy_three_lz4_s2
|
|
CMPL R8, $0x00000800
|
|
JAE emit_copy_three_lz4_s2
|
|
LEAL -15(DI), DI
|
|
MOVB R8, 1(AX)
|
|
SHRL $0x08, R8
|
|
SHLL $0x05, R8
|
|
ORL R8, DI
|
|
MOVB DI, (AX)
|
|
ADDQ $0x02, AX
|
|
JMP lz4s_snappy_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
LEAL -2(DI), DI
|
|
MOVB DI, (AX)
|
|
MOVW R8, 1(AX)
|
|
ADDQ $0x03, AX
|
|
JMP lz4s_snappy_loop
|
|
|
|
lz4s_snappy_done:
|
|
MOVQ dst_base+0(FP), CX
|
|
SUBQ CX, AX
|
|
MOVQ SI, uncompressed+48(FP)
|
|
MOVQ AX, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4s_snappy_corrupt:
|
|
XORQ AX, AX
|
|
LEAQ -1(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4s_snappy_dstfull:
|
|
XORQ AX, AX
|
|
LEAQ -2(AX), SI
|
|
MOVQ SI, uncompressed+48(FP)
|
|
RET
|