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.
23563 lines
564 KiB
ArmAsm
23563 lines
564 KiB
ArmAsm
// Code generated by command: go run gen.go -out ../encodeblock.s -arch arm64 -arm64gen -pkg=s2. DO NOT EDIT.
|
|
// EXPERIMENTAL arm64 output lowered from an amd64 avo program.
|
|
|
|
//go:build arm64 && ((amd64 || arm64) && !appengine && !noasm && gc && !noasm)
|
|
|
|
#include "textflag.h"
|
|
|
|
// func encodeBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBlockAsm(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBlockAsm:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBlockAsm:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBlockAsm
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeBlockAsm
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R7
|
|
MOVWU R6, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R5, R5
|
|
BEQ repeat_extend_back_end_encodeBlockAsm
|
|
|
|
repeat_extend_back_loop_encodeBlockAsm:
|
|
CMPW R7, R6
|
|
BLS repeat_extend_back_end_encodeBlockAsm
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeBlockAsm
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R5, R5
|
|
BNE repeat_extend_back_loop_encodeBlockAsm
|
|
|
|
repeat_extend_back_end_encodeBlockAsm:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $5, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeBlockAsm
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeBlockAsm
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_repeat_emit_encodeBlockAsm
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_repeat_emit_encodeBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
four_bytes_repeat_emit_encodeBlockAsm:
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeBlockAsm
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm
|
|
|
|
one_byte_repeat_emit_encodeBlockAsm:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeBlockAsm:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R11
|
|
MOVD R8, R12
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeBlockAsmlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeBlockAsm:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R8
|
|
SUBW R2, R8, R8
|
|
ADD R2, R3, R9
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm:
|
|
CMPW $0x10, R8
|
|
BLO matchlen_match8_repeat_extend_encodeBlockAsm
|
|
MOVD (R9)(R11), R10
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm
|
|
ADD R11, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16repeat_extend_encodeBlockAsm
|
|
SUB $16, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm:
|
|
CMPW $0x08, R8
|
|
BLO matchlen_match4_repeat_extend_encodeBlockAsm
|
|
MOVD (R9)(R11), R10
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm
|
|
SUB $8, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm:
|
|
CMPW $0x04, R8
|
|
BLO matchlen_match2_repeat_extend_encodeBlockAsm
|
|
MOVWU (R9)(R11), R10
|
|
MOVWU (R5)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_repeat_extend_encodeBlockAsm
|
|
SUB $4, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm:
|
|
CMPW $0x01, R8
|
|
BEQ matchlen_match1_repeat_extend_encodeBlockAsm
|
|
BLO repeat_extend_forward_end_encodeBlockAsm
|
|
MOVHU (R9)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeBlockAsm
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R8, R8
|
|
BEQ repeat_extend_forward_end_encodeBlockAsm
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm:
|
|
MOVBU (R9)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeBlockAsm
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm:
|
|
ADDW R11, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
TSTW R7, R7
|
|
BEQ repeat_as_copy_encodeBlockAsm
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_repeat_encodeBlockAsm:
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_match_repeat_encodeBlockAsm
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_match_repeat_encodeBlockAsm
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_match_repeat_encodeBlockAsm
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_match_repeat_encodeBlockAsm
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_match_repeat_encodeBlockAsm
|
|
CMPW $0x0100ffff, R5
|
|
BLO repeat_five_match_repeat_encodeBlockAsm
|
|
SUB $16842747, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_repeat_encodeBlockAsm
|
|
|
|
repeat_five_match_repeat_encodeBlockAsm:
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_four_match_repeat_encodeBlockAsm:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_as_copy_encodeBlockAsm:
|
|
// emitCopy
|
|
CMPW $0x00010000, R6
|
|
BLO two_byte_offset_repeat_as_copy_encodeBlockAsm
|
|
CMPW $0x40, R5
|
|
BLS four_bytes_remain_repeat_as_copy_encodeBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R6, 1(R1)
|
|
SUB $64, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R5
|
|
BLO four_bytes_remain_repeat_as_copy_encodeBlockAsm
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
CMPW $0x0100ffff, R5
|
|
BLO repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
SUB $16842747, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy
|
|
|
|
repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
four_bytes_remain_repeat_as_copy_encodeBlockAsm:
|
|
TSTW R5, R5
|
|
BEQ repeat_end_emit_encodeBlockAsm
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
SUB $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVW R6, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
two_byte_offset_repeat_as_copy_encodeBlockAsm:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeBlockAsm
|
|
CMPW $0x00000800, R6
|
|
BHS long_offset_short_repeat_as_copy_encodeBlockAsm
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
MOVWU R6, R8
|
|
LSRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R5, R5
|
|
|
|
// emitRepeat
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R5
|
|
BLO repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
SUB $16842747, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
long_offset_short_repeat_as_copy_encodeBlockAsm:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x0100ffff, R5
|
|
BLO repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
SUB $16842747, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_repeat_as_copy_encodeBlockAsm_emit_copy_short
|
|
|
|
repeat_five_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeBlockAsm:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm
|
|
|
|
emit_copy_three_repeat_as_copy_encodeBlockAsm:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeBlockAsm:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
no_repeat_found_encodeBlockAsm:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBlockAsm
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeBlockAsm
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
candidate3_match_encodeBlockAsm:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeBlockAsm
|
|
|
|
candidate2_match_encodeBlockAsm:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBlockAsm:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm
|
|
|
|
match_extend_back_loop_encodeBlockAsm:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBlockAsm
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBlockAsm
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm
|
|
JMP match_extend_back_loop_encodeBlockAsm
|
|
|
|
match_extend_back_end_encodeBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $5, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeBlockAsm
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeBlockAsm
|
|
CMPW $0x00010000, R7
|
|
BLO three_bytes_match_emit_encodeBlockAsm
|
|
CMPW $0x01000000, R7
|
|
BLO four_bytes_match_emit_encodeBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R7, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
four_bytes_match_emit_encodeBlockAsm:
|
|
MOVWU R7, R9
|
|
LSRW $0x10, R9, R9
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
MOVB R9, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
three_bytes_match_emit_encodeBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
two_bytes_match_emit_encodeBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeBlockAsm
|
|
JMP memmove_long_match_emit_encodeBlockAsm
|
|
|
|
one_byte_match_emit_encodeBlockAsm:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBlockAsm:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBlockAsm:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm
|
|
|
|
memmove_long_match_emit_encodeBlockAsm:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeBlockAsmlarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeBlockAsm:
|
|
match_nolit_loop_encodeBlockAsm:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeBlockAsm
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeBlockAsm
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeBlockAsm
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeBlockAsm
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeBlockAsm
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeBlockAsm
|
|
BLO match_nolit_end_encodeBlockAsm
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBlockAsm
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBlockAsm
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeBlockAsm:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R5
|
|
BLO two_byte_offset_match_nolit_encodeBlockAsm
|
|
CMPW $0x40, R9
|
|
BLS four_bytes_remain_match_nolit_encodeBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
SUB $64, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R9
|
|
BLO four_bytes_remain_match_nolit_encodeBlockAsm
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy:
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm_emit_copy
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_match_nolit_encodeBlockAsm_emit_copy
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy
|
|
|
|
repeat_five_match_nolit_encodeBlockAsm_emit_copy:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm_emit_copy:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm_emit_copy:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm_emit_copy:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
four_bytes_remain_match_nolit_encodeBlockAsm:
|
|
TSTW R9, R9
|
|
BEQ match_nolit_emitcopy_end_encodeBlockAsm
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
SUB $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R9, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
two_byte_offset_match_nolit_encodeBlockAsm:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeBlockAsm
|
|
CMPW $0x00000800, R5
|
|
BHS long_offset_short_match_nolit_encodeBlockAsm
|
|
MOVD $0x00000001, R6
|
|
ADD $16, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
MOVWU R5, R7
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short_2b
|
|
|
|
repeat_five_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short_2b:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
long_offset_short_match_nolit_encodeBlockAsm:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm_emit_copy_short
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_match_nolit_encodeBlockAsm_emit_copy_short
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBlockAsm_emit_copy_short
|
|
|
|
repeat_five_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm_emit_copy_short:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
two_byte_offset_short_match_nolit_encodeBlockAsm:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm
|
|
|
|
emit_copy_three_match_nolit_encodeBlockAsm:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBlockAsm
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm:
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x10, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x32, R7, R7
|
|
LSL $0x10, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x32, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeBlockAsm
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBlockAsm
|
|
|
|
emit_remainder_encodeBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $5, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBlockAsm
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBlockAsm
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBlockAsm
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeBlockAsm
|
|
CMPW $0x01000000, R2
|
|
BLO four_bytes_emit_remainder_encodeBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R2, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm
|
|
|
|
four_bytes_emit_remainder_encodeBlockAsm:
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBlockAsm
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm
|
|
|
|
one_byte_emit_remainder_encodeBlockAsm:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBlockAsm:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBlockAsmlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBlockAsm:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm4MB(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBlockAsm4MB(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBlockAsm4MB:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBlockAsm4MB:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBlockAsm4MB
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeBlockAsm4MB
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R7
|
|
MOVWU R6, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R5, R5
|
|
BEQ repeat_extend_back_end_encodeBlockAsm4MB
|
|
|
|
repeat_extend_back_loop_encodeBlockAsm4MB:
|
|
CMPW R7, R6
|
|
BLS repeat_extend_back_end_encodeBlockAsm4MB
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeBlockAsm4MB
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R5, R5
|
|
BNE repeat_extend_back_loop_encodeBlockAsm4MB
|
|
|
|
repeat_extend_back_end_encodeBlockAsm4MB:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $4, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm4MB:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeBlockAsm4MB
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeBlockAsm4MB
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeBlockAsm4MB
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_repeat_emit_encodeBlockAsm4MB
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm4MB
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm4MB
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeBlockAsm4MB
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm4MB
|
|
|
|
one_byte_repeat_emit_encodeBlockAsm4MB:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeBlockAsm4MB:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm4MB
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R11
|
|
MOVD R8, R12
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeBlockAsm4MBlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeBlockAsm4MB:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R8
|
|
SUBW R2, R8, R8
|
|
ADD R2, R3, R9
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB:
|
|
CMPW $0x10, R8
|
|
BLO matchlen_match8_repeat_extend_encodeBlockAsm4MB
|
|
MOVD (R9)(R11), R10
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB
|
|
ADD R11, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16repeat_extend_encodeBlockAsm4MB
|
|
SUB $16, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm4MB:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm4MB:
|
|
CMPW $0x08, R8
|
|
BLO matchlen_match4_repeat_extend_encodeBlockAsm4MB
|
|
MOVD (R9)(R11), R10
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB
|
|
SUB $8, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm4MB:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm4MB:
|
|
CMPW $0x04, R8
|
|
BLO matchlen_match2_repeat_extend_encodeBlockAsm4MB
|
|
MOVWU (R9)(R11), R10
|
|
MOVWU (R5)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_repeat_extend_encodeBlockAsm4MB
|
|
SUB $4, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm4MB:
|
|
CMPW $0x01, R8
|
|
BEQ matchlen_match1_repeat_extend_encodeBlockAsm4MB
|
|
BLO repeat_extend_forward_end_encodeBlockAsm4MB
|
|
MOVHU (R9)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeBlockAsm4MB
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R8, R8
|
|
BEQ repeat_extend_forward_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm4MB:
|
|
MOVBU (R9)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeBlockAsm4MB
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm4MB:
|
|
ADDW R11, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
TSTW R7, R7
|
|
BEQ repeat_as_copy_encodeBlockAsm4MB
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_match_repeat_encodeBlockAsm4MB
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_match_repeat_encodeBlockAsm4MB
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm4MB:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_match_repeat_encodeBlockAsm4MB
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_match_repeat_encodeBlockAsm4MB
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_four_match_repeat_encodeBlockAsm4MB:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm4MB:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm4MB:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm4MB:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_as_copy_encodeBlockAsm4MB:
|
|
// emitCopy
|
|
CMPW $0x00010000, R6
|
|
BLO two_byte_offset_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPW $0x40, R5
|
|
BLS four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R6, 1(R1)
|
|
SUB $64, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R5
|
|
BLO four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
four_bytes_remain_repeat_as_copy_encodeBlockAsm4MB:
|
|
TSTW R5, R5
|
|
BEQ repeat_end_emit_encodeBlockAsm4MB
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
SUB $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVW R6, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
two_byte_offset_repeat_as_copy_encodeBlockAsm4MB:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPW $0x00000800, R6
|
|
BHS long_offset_short_repeat_as_copy_encodeBlockAsm4MB
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R5, R5
|
|
|
|
// emitRepeat
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
long_offset_short_repeat_as_copy_encodeBlockAsm4MB:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00010100, R5
|
|
BLO repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short
|
|
SUB $65536, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU R5, R6
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ASRW $0x10, R6, R6
|
|
MOVB R6, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_four_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short:
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm4MB_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeBlockAsm4MB:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm4MB
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm4MB
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm4MB
|
|
|
|
emit_copy_three_repeat_as_copy_encodeBlockAsm4MB:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeBlockAsm4MB:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
no_repeat_found_encodeBlockAsm4MB:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBlockAsm4MB
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeBlockAsm4MB
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeBlockAsm4MB
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
candidate3_match_encodeBlockAsm4MB:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeBlockAsm4MB
|
|
|
|
candidate2_match_encodeBlockAsm4MB:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBlockAsm4MB:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm4MB
|
|
|
|
match_extend_back_loop_encodeBlockAsm4MB:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBlockAsm4MB
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBlockAsm4MB
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm4MB
|
|
JMP match_extend_back_loop_encodeBlockAsm4MB
|
|
|
|
match_extend_back_end_encodeBlockAsm4MB:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $4, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm4MB:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeBlockAsm4MB
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeBlockAsm4MB
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeBlockAsm4MB
|
|
CMPW $0x00010000, R7
|
|
BLO three_bytes_match_emit_encodeBlockAsm4MB
|
|
MOVWU R7, R9
|
|
LSRW $0x10, R9, R9
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
MOVB R9, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm4MB
|
|
|
|
three_bytes_match_emit_encodeBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm4MB
|
|
|
|
two_bytes_match_emit_encodeBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeBlockAsm4MB
|
|
JMP memmove_long_match_emit_encodeBlockAsm4MB
|
|
|
|
one_byte_match_emit_encodeBlockAsm4MB:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBlockAsm4MB:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBlockAsm4MB:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm4MB
|
|
|
|
memmove_long_match_emit_encodeBlockAsm4MB:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeBlockAsm4MBlarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeBlockAsm4MB:
|
|
match_nolit_loop_encodeBlockAsm4MB:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm4MB:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeBlockAsm4MB
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm4MB
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeBlockAsm4MB
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm4MB:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm4MB:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeBlockAsm4MB
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm4MB
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm4MB
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm4MB:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm4MB:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeBlockAsm4MB
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeBlockAsm4MB
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm4MB:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeBlockAsm4MB
|
|
BLO match_nolit_end_encodeBlockAsm4MB
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBlockAsm4MB
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeBlockAsm4MB
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm4MB:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBlockAsm4MB
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeBlockAsm4MB:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R5
|
|
BLO two_byte_offset_match_nolit_encodeBlockAsm4MB
|
|
CMPW $0x40, R9
|
|
BLS four_bytes_remain_match_nolit_encodeBlockAsm4MB
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
SUB $64, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R9
|
|
BLO four_bytes_remain_match_nolit_encodeBlockAsm4MB
|
|
|
|
// emitRepeat
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
four_bytes_remain_match_nolit_encodeBlockAsm4MB:
|
|
TSTW R9, R9
|
|
BEQ match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
SUB $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R9, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
two_byte_offset_match_nolit_encodeBlockAsm4MB:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeBlockAsm4MB
|
|
CMPW $0x00000800, R5
|
|
BHS long_offset_short_match_nolit_encodeBlockAsm4MB
|
|
MOVD $0x00000001, R6
|
|
ADD $16, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short_2b:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
long_offset_short_match_nolit_encodeBlockAsm4MB:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R5
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ASRW $0x10, R5, R5
|
|
MOVB R5, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm4MB_emit_copy_short:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
two_byte_offset_short_match_nolit_encodeBlockAsm4MB:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm4MB
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm4MB
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm4MB
|
|
|
|
emit_copy_three_match_nolit_encodeBlockAsm4MB:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm4MB:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBlockAsm4MB
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm4MB:
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x10, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x32, R7, R7
|
|
LSL $0x10, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x32, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeBlockAsm4MB
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBlockAsm4MB
|
|
|
|
emit_remainder_encodeBlockAsm4MB:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $4, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm4MB:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBlockAsm4MB
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBlockAsm4MB
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBlockAsm4MB
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeBlockAsm4MB
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm4MB
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm4MB
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBlockAsm4MB
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm4MB
|
|
|
|
one_byte_emit_remainder_encodeBlockAsm4MB:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBlockAsm4MB:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBlockAsm4MB:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm4MB
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm4MB:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBlockAsm4MBlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBlockAsm4MB:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBlockAsm12B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000080, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBlockAsm12B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBlockAsm12B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBlockAsm12B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x000000cf1bbcdcbb, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x18, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x18, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x18, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeBlockAsm12B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R7
|
|
MOVWU R6, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R5, R5
|
|
BEQ repeat_extend_back_end_encodeBlockAsm12B
|
|
|
|
repeat_extend_back_loop_encodeBlockAsm12B:
|
|
CMPW R7, R6
|
|
BLS repeat_extend_back_end_encodeBlockAsm12B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeBlockAsm12B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R5, R5
|
|
BNE repeat_extend_back_loop_encodeBlockAsm12B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm12B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm12B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeBlockAsm12B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeBlockAsm12B
|
|
BLO three_bytes_repeat_emit_encodeBlockAsm12B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm12B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeBlockAsm12B
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm12B
|
|
|
|
one_byte_repeat_emit_encodeBlockAsm12B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeBlockAsm12B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm12B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R11
|
|
MOVD R8, R12
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeBlockAsm12B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R8
|
|
SUBW R2, R8, R8
|
|
ADD R2, R3, R9
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm12B:
|
|
CMPW $0x10, R8
|
|
BLO matchlen_match8_repeat_extend_encodeBlockAsm12B
|
|
MOVD (R9)(R11), R10
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm12B
|
|
ADD R11, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16repeat_extend_encodeBlockAsm12B
|
|
SUB $16, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm12B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm12B:
|
|
CMPW $0x08, R8
|
|
BLO matchlen_match4_repeat_extend_encodeBlockAsm12B
|
|
MOVD (R9)(R11), R10
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm12B
|
|
SUB $8, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm12B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm12B:
|
|
CMPW $0x04, R8
|
|
BLO matchlen_match2_repeat_extend_encodeBlockAsm12B
|
|
MOVWU (R9)(R11), R10
|
|
MOVWU (R5)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_repeat_extend_encodeBlockAsm12B
|
|
SUB $4, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm12B:
|
|
CMPW $0x01, R8
|
|
BEQ matchlen_match1_repeat_extend_encodeBlockAsm12B
|
|
BLO repeat_extend_forward_end_encodeBlockAsm12B
|
|
MOVHU (R9)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeBlockAsm12B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R8, R8
|
|
BEQ repeat_extend_forward_end_encodeBlockAsm12B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm12B:
|
|
MOVBU (R9)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeBlockAsm12B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm12B:
|
|
ADDW R11, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
TSTW R7, R7
|
|
BEQ repeat_as_copy_encodeBlockAsm12B
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_match_repeat_encodeBlockAsm12B
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_match_repeat_encodeBlockAsm12B
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_match_repeat_encodeBlockAsm12B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm12B:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_match_repeat_encodeBlockAsm12B
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm12B:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm12B:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm12B:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_as_copy_encodeBlockAsm12B:
|
|
// emitCopy
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeBlockAsm12B
|
|
CMPW $0x00000800, R6
|
|
BHS long_offset_short_repeat_as_copy_encodeBlockAsm12B
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R5, R5
|
|
|
|
// emitRepeat
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
long_offset_short_repeat_as_copy_encodeBlockAsm12B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm12B_emit_copy_short:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm12B_emit_copy_short:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm12B_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeBlockAsm12B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm12B
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm12B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm12B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeBlockAsm12B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeBlockAsm12B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
no_repeat_found_encodeBlockAsm12B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBlockAsm12B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeBlockAsm12B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeBlockAsm12B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
candidate3_match_encodeBlockAsm12B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeBlockAsm12B
|
|
|
|
candidate2_match_encodeBlockAsm12B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBlockAsm12B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeBlockAsm12B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBlockAsm12B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBlockAsm12B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm12B
|
|
JMP match_extend_back_loop_encodeBlockAsm12B
|
|
|
|
match_extend_back_end_encodeBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeBlockAsm12B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeBlockAsm12B
|
|
BLO three_bytes_match_emit_encodeBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeBlockAsm12B
|
|
JMP memmove_long_match_emit_encodeBlockAsm12B
|
|
|
|
one_byte_match_emit_encodeBlockAsm12B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBlockAsm12B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBlockAsm12B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm12B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeBlockAsm12B:
|
|
match_nolit_loop_encodeBlockAsm12B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm12B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeBlockAsm12B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm12B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeBlockAsm12B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm12B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm12B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeBlockAsm12B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm12B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm12B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm12B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeBlockAsm12B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeBlockAsm12B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm12B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeBlockAsm12B
|
|
BLO match_nolit_end_encodeBlockAsm12B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBlockAsm12B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm12B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBlockAsm12B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeBlockAsm12B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeBlockAsm12B
|
|
CMPW $0x00000800, R5
|
|
BHS long_offset_short_match_nolit_encodeBlockAsm12B
|
|
MOVD $0x00000001, R6
|
|
ADD $16, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short_2b
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short_2b:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
long_offset_short_match_nolit_encodeBlockAsm12B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm12B_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm12B_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm12B_emit_copy_short:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBlockAsm12B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm12B
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm12B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm12B
|
|
|
|
emit_copy_three_match_nolit_encodeBlockAsm12B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm12B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBlockAsm12B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm12B:
|
|
MOVD $0x000000cf1bbcdcbb, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x18, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x34, R7, R7
|
|
LSL $0x18, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x34, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeBlockAsm12B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBlockAsm12B
|
|
|
|
emit_remainder_encodeBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBlockAsm12B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBlockAsm12B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBlockAsm12B
|
|
BLO three_bytes_emit_remainder_encodeBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBlockAsm12B
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm12B
|
|
|
|
one_byte_emit_remainder_encodeBlockAsm12B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBlockAsm12B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBlockAsm12Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBlockAsm12B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBlockAsm10B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000020, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBlockAsm10B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBlockAsm10B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBlockAsm10B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeBlockAsm10B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R7
|
|
MOVWU R6, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R5, R5
|
|
BEQ repeat_extend_back_end_encodeBlockAsm10B
|
|
|
|
repeat_extend_back_loop_encodeBlockAsm10B:
|
|
CMPW R7, R6
|
|
BLS repeat_extend_back_end_encodeBlockAsm10B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeBlockAsm10B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R5, R5
|
|
BNE repeat_extend_back_loop_encodeBlockAsm10B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm10B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm10B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeBlockAsm10B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeBlockAsm10B
|
|
BLO three_bytes_repeat_emit_encodeBlockAsm10B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm10B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeBlockAsm10B
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm10B
|
|
|
|
one_byte_repeat_emit_encodeBlockAsm10B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeBlockAsm10B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm10B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R11
|
|
MOVD R8, R12
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeBlockAsm10B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R8
|
|
SUBW R2, R8, R8
|
|
ADD R2, R3, R9
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm10B:
|
|
CMPW $0x10, R8
|
|
BLO matchlen_match8_repeat_extend_encodeBlockAsm10B
|
|
MOVD (R9)(R11), R10
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm10B
|
|
ADD R11, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16repeat_extend_encodeBlockAsm10B
|
|
SUB $16, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm10B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm10B:
|
|
CMPW $0x08, R8
|
|
BLO matchlen_match4_repeat_extend_encodeBlockAsm10B
|
|
MOVD (R9)(R11), R10
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm10B
|
|
SUB $8, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm10B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm10B:
|
|
CMPW $0x04, R8
|
|
BLO matchlen_match2_repeat_extend_encodeBlockAsm10B
|
|
MOVWU (R9)(R11), R10
|
|
MOVWU (R5)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_repeat_extend_encodeBlockAsm10B
|
|
SUB $4, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm10B:
|
|
CMPW $0x01, R8
|
|
BEQ matchlen_match1_repeat_extend_encodeBlockAsm10B
|
|
BLO repeat_extend_forward_end_encodeBlockAsm10B
|
|
MOVHU (R9)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeBlockAsm10B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R8, R8
|
|
BEQ repeat_extend_forward_end_encodeBlockAsm10B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm10B:
|
|
MOVBU (R9)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeBlockAsm10B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm10B:
|
|
ADDW R11, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
TSTW R7, R7
|
|
BEQ repeat_as_copy_encodeBlockAsm10B
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_match_repeat_encodeBlockAsm10B
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_match_repeat_encodeBlockAsm10B
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_match_repeat_encodeBlockAsm10B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm10B:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_match_repeat_encodeBlockAsm10B
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm10B:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm10B:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_match_repeat_encodeBlockAsm10B:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_as_copy_encodeBlockAsm10B:
|
|
// emitCopy
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeBlockAsm10B
|
|
CMPW $0x00000800, R6
|
|
BHS long_offset_short_repeat_as_copy_encodeBlockAsm10B
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R5, R5
|
|
|
|
// emitRepeat
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
long_offset_short_repeat_as_copy_encodeBlockAsm10B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R7
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
CMPW $0x00000800, R6
|
|
BLO repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm10B_emit_copy_short:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm10B_emit_copy_short:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_repeat_as_copy_encodeBlockAsm10B_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeBlockAsm10B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm10B
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm10B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm10B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeBlockAsm10B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeBlockAsm10B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
no_repeat_found_encodeBlockAsm10B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBlockAsm10B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeBlockAsm10B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeBlockAsm10B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
candidate3_match_encodeBlockAsm10B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeBlockAsm10B
|
|
|
|
candidate2_match_encodeBlockAsm10B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBlockAsm10B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeBlockAsm10B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBlockAsm10B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBlockAsm10B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm10B
|
|
JMP match_extend_back_loop_encodeBlockAsm10B
|
|
|
|
match_extend_back_end_encodeBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeBlockAsm10B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeBlockAsm10B
|
|
BLO three_bytes_match_emit_encodeBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeBlockAsm10B
|
|
JMP memmove_long_match_emit_encodeBlockAsm10B
|
|
|
|
one_byte_match_emit_encodeBlockAsm10B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBlockAsm10B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBlockAsm10B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm10B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeBlockAsm10B:
|
|
match_nolit_loop_encodeBlockAsm10B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm10B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeBlockAsm10B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm10B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeBlockAsm10B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm10B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm10B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeBlockAsm10B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm10B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm10B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm10B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeBlockAsm10B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeBlockAsm10B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm10B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeBlockAsm10B
|
|
BLO match_nolit_end_encodeBlockAsm10B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBlockAsm10B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm10B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBlockAsm10B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeBlockAsm10B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeBlockAsm10B
|
|
CMPW $0x00000800, R5
|
|
BHS long_offset_short_match_nolit_encodeBlockAsm10B
|
|
MOVD $0x00000001, R6
|
|
ADD $16, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short_2b
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short_2b:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
long_offset_short_match_nolit_encodeBlockAsm10B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R9, R6
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
CMPW $0x00000800, R5
|
|
BLO repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm10B_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm10B_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_encodeBlockAsm10B_emit_copy_short:
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBlockAsm10B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm10B
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm10B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm10B
|
|
|
|
emit_copy_three_match_nolit_encodeBlockAsm10B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm10B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBlockAsm10B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm10B:
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x20, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x36, R7, R7
|
|
LSL $0x20, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x36, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeBlockAsm10B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBlockAsm10B
|
|
|
|
emit_remainder_encodeBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBlockAsm10B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBlockAsm10B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBlockAsm10B
|
|
BLO three_bytes_emit_remainder_encodeBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBlockAsm10B
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm10B
|
|
|
|
one_byte_emit_remainder_encodeBlockAsm10B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBlockAsm10B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBlockAsm10Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBlockAsm10B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBlockAsm8B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000008, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBlockAsm8B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBlockAsm8B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x04, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBlockAsm8B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x38, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x38, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x38, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeBlockAsm8B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R7
|
|
MOVWU R6, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R5, R5
|
|
BEQ repeat_extend_back_end_encodeBlockAsm8B
|
|
|
|
repeat_extend_back_loop_encodeBlockAsm8B:
|
|
CMPW R7, R6
|
|
BLS repeat_extend_back_end_encodeBlockAsm8B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeBlockAsm8B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R5, R5
|
|
BNE repeat_extend_back_loop_encodeBlockAsm8B
|
|
|
|
repeat_extend_back_end_encodeBlockAsm8B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeBlockAsm8B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeBlockAsm8B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeBlockAsm8B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeBlockAsm8B
|
|
BLO three_bytes_repeat_emit_encodeBlockAsm8B
|
|
|
|
three_bytes_repeat_emit_encodeBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm8B
|
|
|
|
two_bytes_repeat_emit_encodeBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeBlockAsm8B
|
|
JMP memmove_long_repeat_emit_encodeBlockAsm8B
|
|
|
|
one_byte_repeat_emit_encodeBlockAsm8B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeBlockAsm8B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeBlockAsm8B
|
|
|
|
memmove_long_repeat_emit_encodeBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R11
|
|
MOVD R8, R12
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeBlockAsm8Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeBlockAsm8B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R8
|
|
SUBW R2, R8, R8
|
|
ADD R2, R3, R9
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeBlockAsm8B:
|
|
CMPW $0x10, R8
|
|
BLO matchlen_match8_repeat_extend_encodeBlockAsm8B
|
|
MOVD (R9)(R11), R10
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm8B
|
|
ADD R11, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16repeat_extend_encodeBlockAsm8B
|
|
SUB $16, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_repeat_extend_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeBlockAsm8B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match8_repeat_extend_encodeBlockAsm8B:
|
|
CMPW $0x08, R8
|
|
BLO matchlen_match4_repeat_extend_encodeBlockAsm8B
|
|
MOVD (R9)(R11), R10
|
|
MOVD (R5)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_repeat_extend_encodeBlockAsm8B
|
|
SUB $8, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_repeat_extend_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeBlockAsm8B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match4_repeat_extend_encodeBlockAsm8B:
|
|
CMPW $0x04, R8
|
|
BLO matchlen_match2_repeat_extend_encodeBlockAsm8B
|
|
MOVWU (R9)(R11), R10
|
|
MOVWU (R5)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_repeat_extend_encodeBlockAsm8B
|
|
SUB $4, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_repeat_extend_encodeBlockAsm8B:
|
|
CMPW $0x01, R8
|
|
BEQ matchlen_match1_repeat_extend_encodeBlockAsm8B
|
|
BLO repeat_extend_forward_end_encodeBlockAsm8B
|
|
MOVHU (R9)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeBlockAsm8B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R8, R8
|
|
BEQ repeat_extend_forward_end_encodeBlockAsm8B
|
|
|
|
matchlen_match1_repeat_extend_encodeBlockAsm8B:
|
|
MOVBU (R9)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeBlockAsm8B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
repeat_extend_forward_end_encodeBlockAsm8B:
|
|
ADDW R11, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
TSTW R7, R7
|
|
BEQ repeat_as_copy_encodeBlockAsm8B
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R6
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_match_repeat_encodeBlockAsm8B
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_match_repeat_encodeBlockAsm8B
|
|
|
|
cant_repeat_two_offset_match_repeat_encodeBlockAsm8B:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_match_repeat_encodeBlockAsm8B
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_three_match_repeat_encodeBlockAsm8B:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_two_match_repeat_encodeBlockAsm8B:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_as_copy_encodeBlockAsm8B:
|
|
// emitCopy
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeBlockAsm8B
|
|
CMPW $0x00000800, R6
|
|
BHS long_offset_short_repeat_as_copy_encodeBlockAsm8B
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R5, R5
|
|
|
|
// emitRepeat
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
JMP cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
MOVWU R5, R6
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short_2b:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
long_offset_short_repeat_as_copy_encodeBlockAsm8B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R5, R6
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x08, R6
|
|
BLS repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short
|
|
CMPW $0x0c, R6
|
|
BHS cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_repeat_as_copy_encodeBlockAsm8B_emit_copy_short:
|
|
CMPW $0x00000104, R5
|
|
BLO repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short
|
|
SUB $256, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R5, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_three_repeat_as_copy_encodeBlockAsm8B_emit_copy_short:
|
|
SUB $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R5, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
repeat_two_repeat_as_copy_encodeBlockAsm8B_emit_copy_short:
|
|
LSLW $0x02, R5, R5
|
|
ORRW $0x01, R5, R5
|
|
MOVH R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R6, 1(R1)
|
|
ASRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeBlockAsm8B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeBlockAsm8B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeBlockAsm8B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeBlockAsm8B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeBlockAsm8B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
no_repeat_found_encodeBlockAsm8B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBlockAsm8B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeBlockAsm8B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeBlockAsm8B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
candidate3_match_encodeBlockAsm8B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeBlockAsm8B
|
|
|
|
candidate2_match_encodeBlockAsm8B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBlockAsm8B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeBlockAsm8B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBlockAsm8B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBlockAsm8B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBlockAsm8B
|
|
JMP match_extend_back_loop_encodeBlockAsm8B
|
|
|
|
match_extend_back_end_encodeBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeBlockAsm8B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeBlockAsm8B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeBlockAsm8B
|
|
BLO three_bytes_match_emit_encodeBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeBlockAsm8B
|
|
JMP memmove_long_match_emit_encodeBlockAsm8B
|
|
|
|
one_byte_match_emit_encodeBlockAsm8B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBlockAsm8B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBlockAsm8B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeBlockAsm8B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeBlockAsm8Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeBlockAsm8B:
|
|
match_nolit_loop_encodeBlockAsm8B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBlockAsm8B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeBlockAsm8B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm8B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeBlockAsm8B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBlockAsm8B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeBlockAsm8B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeBlockAsm8B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeBlockAsm8B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBlockAsm8B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeBlockAsm8B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeBlockAsm8B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeBlockAsm8B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeBlockAsm8B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeBlockAsm8B
|
|
BLO match_nolit_end_encodeBlockAsm8B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBlockAsm8B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeBlockAsm8B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBlockAsm8B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeBlockAsm8B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeBlockAsm8B
|
|
CMPW $0x00000800, R5
|
|
BHS long_offset_short_match_nolit_encodeBlockAsm8B
|
|
MOVD $0x00000001, R6
|
|
ADD $16, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
MOVWU R9, R5
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short_2b
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
long_offset_short_match_nolit_encodeBlockAsm8B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R9, R5
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBlockAsm8B_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R9, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
repeat_three_match_nolit_encodeBlockAsm8B_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R9, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
repeat_two_match_nolit_encodeBlockAsm8B_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R5, 1(R1)
|
|
ASRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R9, R9
|
|
MOVB R9, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBlockAsm8B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeBlockAsm8B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBlockAsm8B
|
|
|
|
emit_copy_three_match_nolit_encodeBlockAsm8B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBlockAsm8B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBlockAsm8B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBlockAsm8B:
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x20, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x38, R7, R7
|
|
LSL $0x20, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x38, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeBlockAsm8B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBlockAsm8B
|
|
|
|
emit_remainder_encodeBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBlockAsm8B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBlockAsm8B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBlockAsm8B
|
|
BLO three_bytes_emit_remainder_encodeBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBlockAsm8B
|
|
JMP memmove_long_emit_remainder_encodeBlockAsm8B
|
|
|
|
one_byte_emit_remainder_encodeBlockAsm8B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBlockAsm8B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBlockAsm8Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBlockAsm8B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBetterBlockAsm(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00001200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBetterBlockAsm:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $6, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBetterBlockAsm:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x07, R5, R5
|
|
CMPW $0x63, R5
|
|
BLS check_maxskip_ok_encodeBetterBlockAsm
|
|
ADD $100, R2, R5
|
|
MOVWU R5, R5
|
|
JMP check_maxskip_cont_encodeBetterBlockAsm
|
|
|
|
check_maxskip_ok_encodeBetterBlockAsm:
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
|
|
check_maxskip_cont_encodeBetterBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBetterBlockAsm
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x00cf1bbcdcbfa563, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 524288(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 524288(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeBetterBlockAsm
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeBetterBlockAsm
|
|
|
|
no_short_found_encodeBetterBlockAsm:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeBetterBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBetterBlockAsm
|
|
|
|
candidateS_match_encodeBetterBlockAsm:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBetterBlockAsm
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBetterBlockAsm:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBetterBlockAsm
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBetterBlockAsm
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $5, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeBetterBlockAsm
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeBetterBlockAsm
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeBetterBlockAsm
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeBetterBlockAsm
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeBetterBlockAsm
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeBetterBlockAsm
|
|
BLO match_nolit_end_encodeBetterBlockAsm
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBetterBlockAsm
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeBetterBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBetterBlockAsm
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeBetterBlockAsm:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVWU 24(RSP), R16
|
|
CMPW R7, R16
|
|
BEQ match_is_repeat_encodeBetterBlockAsm
|
|
CMPW $0x01, R11
|
|
BHI match_length_ok_encodeBetterBlockAsm
|
|
CMPW $0x0000ffff, R7
|
|
BLS match_length_ok_encodeBetterBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBetterBlockAsm
|
|
|
|
match_length_ok_encodeBetterBlockAsm:
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeBetterBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeBetterBlockAsm
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeBetterBlockAsm
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_match_emit_encodeBetterBlockAsm
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_match_emit_encodeBetterBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
four_bytes_match_emit_encodeBetterBlockAsm:
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeBetterBlockAsm
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm
|
|
|
|
one_byte_match_emit_encodeBetterBlockAsm:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBetterBlockAsm:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeBetterBlockAsmlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeBetterBlockAsm:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R7
|
|
BLO two_byte_offset_match_nolit_encodeBetterBlockAsm
|
|
CMPW $0x40, R11
|
|
BLS four_bytes_remain_match_nolit_encodeBetterBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R7, 1(R1)
|
|
SUB $64, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R11
|
|
BLO four_bytes_remain_match_nolit_encodeBetterBlockAsm
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
CMPW $0x0100ffff, R11
|
|
BLO repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
SUB $16842747, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy
|
|
|
|
repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
four_bytes_remain_match_nolit_encodeBetterBlockAsm:
|
|
TSTW R11, R11
|
|
BEQ match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
SUB $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R11, (R1)
|
|
MOVW R7, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
two_byte_offset_match_nolit_encodeBetterBlockAsm:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeBetterBlockAsm
|
|
CMPW $0x00000800, R7
|
|
BHS long_offset_short_match_nolit_encodeBetterBlockAsm
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
MOVWU R7, R8
|
|
LSRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R11, R11
|
|
|
|
// emitRepeat
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
|
|
emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R11
|
|
BLO repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
SUB $16842747, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b
|
|
|
|
repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short_2b:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
CMPW $0x0100ffff, R11
|
|
BLO repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
SUB $16842747, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_encodeBetterBlockAsm_emit_copy_short
|
|
|
|
repeat_five_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm_emit_copy_short:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
two_byte_offset_short_match_nolit_encodeBetterBlockAsm:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
emit_copy_three_match_nolit_encodeBetterBlockAsm:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
match_is_repeat_encodeBetterBlockAsm:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_match_emit_repeat_encodeBetterBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
four_bytes_match_emit_repeat_encodeBetterBlockAsm:
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_repeat_encodeBetterBlockAsm
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
one_byte_match_emit_repeat_encodeBetterBlockAsm:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsmlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_repeat_encodeBetterBlockAsm:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_match_nolit_repeat_encodeBetterBlockAsm:
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_repeat_encodeBetterBlockAsm
|
|
CMPW $0x0100ffff, R11
|
|
BLO repeat_five_match_nolit_repeat_encodeBetterBlockAsm
|
|
SUB $16842747, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R1)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP emit_repeat_again_match_nolit_repeat_encodeBetterBlockAsm
|
|
|
|
repeat_five_match_nolit_repeat_encodeBetterBlockAsm:
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_four_match_nolit_repeat_encodeBetterBlockAsm:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_three_match_nolit_repeat_encodeBetterBlockAsm:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_match_nolit_repeat_encodeBetterBlockAsm:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBetterBlockAsm
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm:
|
|
MOVD $0x00cf1bbcdcbfa563, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x32, R10, R10
|
|
LSL $0x08, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x2f, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x32, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 524288(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 524288(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeBetterBlockAsm:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeBetterBlockAsm
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x08, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x2f, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeBetterBlockAsm
|
|
|
|
emit_remainder_encodeBetterBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $5, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBetterBlockAsm
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBetterBlockAsm
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeBetterBlockAsm
|
|
CMPW $0x01000000, R2
|
|
BLO four_bytes_emit_remainder_encodeBetterBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R2, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm
|
|
|
|
four_bytes_emit_remainder_encodeBetterBlockAsm:
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBetterBlockAsm
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm
|
|
|
|
one_byte_emit_remainder_encodeBetterBlockAsm:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBetterBlockAsm:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsmlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBetterBlockAsm:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm4MB(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBetterBlockAsm4MB(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00001200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBetterBlockAsm4MB:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBetterBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $6, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBetterBlockAsm4MB:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x07, R5, R5
|
|
CMPW $0x63, R5
|
|
BLS check_maxskip_ok_encodeBetterBlockAsm4MB
|
|
ADD $100, R2, R5
|
|
MOVWU R5, R5
|
|
JMP check_maxskip_cont_encodeBetterBlockAsm4MB
|
|
|
|
check_maxskip_ok_encodeBetterBlockAsm4MB:
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
|
|
check_maxskip_cont_encodeBetterBlockAsm4MB:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBetterBlockAsm4MB
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x00cf1bbcdcbfa563, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 524288(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 524288(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm4MB
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeBetterBlockAsm4MB
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeBetterBlockAsm4MB
|
|
|
|
no_short_found_encodeBetterBlockAsm4MB:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm4MB
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeBetterBlockAsm4MB
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBetterBlockAsm4MB
|
|
|
|
candidateS_match_encodeBetterBlockAsm4MB:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBetterBlockAsm4MB
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBetterBlockAsm4MB:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm4MB
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm4MB:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBetterBlockAsm4MB
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBetterBlockAsm4MB
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm4MB
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm4MB
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm4MB:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $4, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBetterBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm4MB:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm4MB:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm4MB:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeBetterBlockAsm4MB
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeBetterBlockAsm4MB
|
|
BLO match_nolit_end_encodeBetterBlockAsm4MB
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBetterBlockAsm4MB
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeBetterBlockAsm4MB
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm4MB:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBetterBlockAsm4MB
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeBetterBlockAsm4MB:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVWU 24(RSP), R16
|
|
CMPW R7, R16
|
|
BEQ match_is_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x01, R11
|
|
BHI match_length_ok_encodeBetterBlockAsm4MB
|
|
CMPW $0x0000ffff, R7
|
|
BLS match_length_ok_encodeBetterBlockAsm4MB
|
|
MOVWU 28(RSP), R2
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeBetterBlockAsm4MB
|
|
|
|
match_length_ok_encodeBetterBlockAsm4MB:
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeBetterBlockAsm4MB
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeBetterBlockAsm4MB
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_match_emit_encodeBetterBlockAsm4MB
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeBetterBlockAsm4MB
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
one_byte_match_emit_encodeBetterBlockAsm4MB:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBetterBlockAsm4MB:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeBetterBlockAsm4MBlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeBetterBlockAsm4MB:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R7
|
|
BLO two_byte_offset_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPW $0x40, R11
|
|
BLS four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R7, 1(R1)
|
|
SUB $64, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R11
|
|
BLO four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
four_bytes_remain_match_nolit_encodeBetterBlockAsm4MB:
|
|
TSTW R11, R11
|
|
BEQ match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
SUB $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R11, (R1)
|
|
MOVW R7, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
two_byte_offset_match_nolit_encodeBetterBlockAsm4MB:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000800, R7
|
|
BHS long_offset_short_match_nolit_encodeBetterBlockAsm4MB
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R11, R11
|
|
|
|
// emitRepeat
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short_2b:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm4MB:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm4MB_emit_copy_short:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
two_byte_offset_short_match_nolit_encodeBetterBlockAsm4MB:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm4MB
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
emit_copy_three_match_nolit_encodeBetterBlockAsm4MB:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
match_is_repeat_encodeBetterBlockAsm4MB:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
one_byte_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm4MBlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_repeat_encodeBetterBlockAsm4MB:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
CMPW $0x00010100, R11
|
|
BLO repeat_four_match_nolit_repeat_encodeBetterBlockAsm4MB
|
|
SUB $65536, R11, R11
|
|
MOVWU R11, R11
|
|
MOVWU R11, R7
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ASRW $0x10, R7, R7
|
|
MOVB R7, 4(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_four_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_three_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm4MB
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm4MB:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm4MB:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBetterBlockAsm4MB
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBetterBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm4MB:
|
|
MOVD $0x00cf1bbcdcbfa563, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x32, R10, R10
|
|
LSL $0x08, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x2f, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x32, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 524288(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 524288(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeBetterBlockAsm4MB:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeBetterBlockAsm4MB
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x08, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x2f, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeBetterBlockAsm4MB
|
|
|
|
emit_remainder_encodeBetterBlockAsm4MB:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $4, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBetterBlockAsm4MB
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm4MB:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBetterBlockAsm4MB
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBetterBlockAsm4MB
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeBetterBlockAsm4MB
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm4MB:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBetterBlockAsm4MB
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
one_byte_emit_remainder_encodeBetterBlockAsm4MB:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm4MB:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm4MB_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBetterBlockAsm4MB:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm4MB:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm4MBlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBetterBlockAsm4MB:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBetterBlockAsm12B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000280, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBetterBlockAsm12B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $6, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBetterBlockAsm12B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBetterBlockAsm12B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 65536(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 65536(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm12B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeBetterBlockAsm12B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeBetterBlockAsm12B
|
|
|
|
no_short_found_encodeBetterBlockAsm12B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm12B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeBetterBlockAsm12B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBetterBlockAsm12B
|
|
|
|
candidateS_match_encodeBetterBlockAsm12B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBetterBlockAsm12B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBetterBlockAsm12B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm12B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBetterBlockAsm12B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBetterBlockAsm12B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm12B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm12B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm12B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeBetterBlockAsm12B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm12B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeBetterBlockAsm12B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm12B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeBetterBlockAsm12B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeBetterBlockAsm12B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm12B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeBetterBlockAsm12B
|
|
BLO match_nolit_end_encodeBetterBlockAsm12B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBetterBlockAsm12B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeBetterBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm12B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBetterBlockAsm12B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeBetterBlockAsm12B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVWU 24(RSP), R16
|
|
CMPW R7, R16
|
|
BEQ match_is_repeat_encodeBetterBlockAsm12B
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeBetterBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeBetterBlockAsm12B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeBetterBlockAsm12B
|
|
BLO three_bytes_match_emit_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeBetterBlockAsm12B
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm12B
|
|
|
|
one_byte_match_emit_encodeBetterBlockAsm12B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBetterBlockAsm12B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeBetterBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeBetterBlockAsm12B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeBetterBlockAsm12B
|
|
CMPW $0x00000800, R7
|
|
BHS long_offset_short_match_nolit_encodeBetterBlockAsm12B
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R11, R11
|
|
|
|
// emitRepeat
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short_2b:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm12B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm12B_emit_copy_short:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm12B_emit_copy_short:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm12B_emit_copy_short:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBetterBlockAsm12B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm12B
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm12B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
emit_copy_three_match_nolit_encodeBetterBlockAsm12B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
match_is_repeat_encodeBetterBlockAsm12B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_repeat_encodeBetterBlockAsm12B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_repeat_encodeBetterBlockAsm12B
|
|
BLO three_bytes_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_repeat_encodeBetterBlockAsm12B
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
one_byte_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_repeat_encodeBetterBlockAsm12B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_repeat_encodeBetterBlockAsm12B
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_three_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm12B
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm12B:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm12B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBetterBlockAsm12B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm12B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x34, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x32, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x34, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 65536(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 65536(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeBetterBlockAsm12B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeBetterBlockAsm12B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeBetterBlockAsm12B
|
|
|
|
emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm12B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBetterBlockAsm12B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBetterBlockAsm12B
|
|
BLO three_bytes_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBetterBlockAsm12B
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
one_byte_emit_remainder_encodeBetterBlockAsm12B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm12Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBetterBlockAsm12B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBetterBlockAsm10B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x000000a0, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBetterBlockAsm10B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $6, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBetterBlockAsm10B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBetterBlockAsm10B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 16384(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 16384(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm10B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeBetterBlockAsm10B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeBetterBlockAsm10B
|
|
|
|
no_short_found_encodeBetterBlockAsm10B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm10B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeBetterBlockAsm10B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBetterBlockAsm10B
|
|
|
|
candidateS_match_encodeBetterBlockAsm10B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBetterBlockAsm10B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBetterBlockAsm10B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm10B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBetterBlockAsm10B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBetterBlockAsm10B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm10B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm10B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm10B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeBetterBlockAsm10B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm10B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeBetterBlockAsm10B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm10B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeBetterBlockAsm10B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeBetterBlockAsm10B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm10B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeBetterBlockAsm10B
|
|
BLO match_nolit_end_encodeBetterBlockAsm10B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBetterBlockAsm10B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeBetterBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm10B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBetterBlockAsm10B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeBetterBlockAsm10B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVWU 24(RSP), R16
|
|
CMPW R7, R16
|
|
BEQ match_is_repeat_encodeBetterBlockAsm10B
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeBetterBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeBetterBlockAsm10B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeBetterBlockAsm10B
|
|
BLO three_bytes_match_emit_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeBetterBlockAsm10B
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm10B
|
|
|
|
one_byte_match_emit_encodeBetterBlockAsm10B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBetterBlockAsm10B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeBetterBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeBetterBlockAsm10B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeBetterBlockAsm10B
|
|
CMPW $0x00000800, R7
|
|
BHS long_offset_short_match_nolit_encodeBetterBlockAsm10B
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R11, R11
|
|
|
|
// emitRepeat
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short_2b:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm10B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm10B_emit_copy_short:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm10B_emit_copy_short:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_encodeBetterBlockAsm10B_emit_copy_short:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBetterBlockAsm10B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm10B
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm10B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
emit_copy_three_match_nolit_encodeBetterBlockAsm10B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
match_is_repeat_encodeBetterBlockAsm10B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_repeat_encodeBetterBlockAsm10B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_repeat_encodeBetterBlockAsm10B
|
|
BLO three_bytes_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_repeat_encodeBetterBlockAsm10B
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
one_byte_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_repeat_encodeBetterBlockAsm10B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
CMPW $0x00000800, R7
|
|
BLO repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_repeat_encodeBetterBlockAsm10B
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_three_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm10B
|
|
|
|
repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm10B:
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm10B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBetterBlockAsm10B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm10B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x36, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x34, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x36, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 16384(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 16384(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeBetterBlockAsm10B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeBetterBlockAsm10B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeBetterBlockAsm10B
|
|
|
|
emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm10B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBetterBlockAsm10B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBetterBlockAsm10B
|
|
BLO three_bytes_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBetterBlockAsm10B
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
one_byte_emit_remainder_encodeBetterBlockAsm10B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm10Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBetterBlockAsm10B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeBetterBlockAsm8B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000028, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeBetterBlockAsm8B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $6, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeBetterBlockAsm8B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x04, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeBetterBlockAsm8B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x38, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 4096(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 4096(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm8B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeBetterBlockAsm8B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeBetterBlockAsm8B
|
|
|
|
no_short_found_encodeBetterBlockAsm8B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeBetterBlockAsm8B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeBetterBlockAsm8B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeBetterBlockAsm8B
|
|
|
|
candidateS_match_encodeBetterBlockAsm8B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeBetterBlockAsm8B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeBetterBlockAsm8B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeBetterBlockAsm8B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeBetterBlockAsm8B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeBetterBlockAsm8B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeBetterBlockAsm8B
|
|
JMP match_extend_back_loop_encodeBetterBlockAsm8B
|
|
|
|
match_extend_back_end_encodeBetterBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeBetterBlockAsm8B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeBetterBlockAsm8B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeBetterBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeBetterBlockAsm8B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeBetterBlockAsm8B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeBetterBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeBetterBlockAsm8B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeBetterBlockAsm8B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeBetterBlockAsm8B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeBetterBlockAsm8B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeBetterBlockAsm8B
|
|
BLO match_nolit_end_encodeBetterBlockAsm8B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeBetterBlockAsm8B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeBetterBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeBetterBlockAsm8B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeBetterBlockAsm8B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeBetterBlockAsm8B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVWU 24(RSP), R16
|
|
CMPW R7, R16
|
|
BEQ match_is_repeat_encodeBetterBlockAsm8B
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeBetterBlockAsm8B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeBetterBlockAsm8B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeBetterBlockAsm8B
|
|
BLO three_bytes_match_emit_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeBetterBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeBetterBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeBetterBlockAsm8B
|
|
JMP memmove_long_match_emit_encodeBetterBlockAsm8B
|
|
|
|
one_byte_match_emit_encodeBetterBlockAsm8B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeBetterBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4
|
|
CMP $0x08, R8
|
|
BLO emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVWU (R9), R10
|
|
MOVW R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVWU -4(R15), R9
|
|
MOVW R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVW R9, -4(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeBetterBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeBetterBlockAsm8B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeBetterBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeBetterBlockAsm8Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeBetterBlockAsm8B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeBetterBlockAsm8B
|
|
CMPW $0x00000800, R7
|
|
BHS long_offset_short_match_nolit_encodeBetterBlockAsm8B
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
SUBW $0x08, R11, R11
|
|
|
|
// emitRepeat
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
JMP cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short_2b:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
long_offset_short_match_nolit_encodeBetterBlockAsm8B:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short
|
|
|
|
cant_repeat_two_offset_match_nolit_encodeBetterBlockAsm8B_emit_copy_short:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_three_match_nolit_encodeBetterBlockAsm8B_emit_copy_short:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_two_match_nolit_encodeBetterBlockAsm8B_emit_copy_short:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
two_byte_offset_short_match_nolit_encodeBetterBlockAsm8B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeBetterBlockAsm8B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
emit_copy_three_match_nolit_encodeBetterBlockAsm8B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
match_is_repeat_encodeBetterBlockAsm8B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_repeat_encodeBetterBlockAsm8B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_repeat_encodeBetterBlockAsm8B
|
|
BLO three_bytes_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
two_bytes_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_repeat_encodeBetterBlockAsm8B
|
|
JMP memmove_long_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
one_byte_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x04, R7
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4
|
|
CMP $0x08, R7
|
|
BLO emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVWU (R8), R9
|
|
MOVW R9, (R1)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVWU -4(R15), R8
|
|
MOVW R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVW R8, -4(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_repeat_encodeBetterBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R12
|
|
|
|
emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_match_emit_repeat_encodeBetterBlockAsm8Blarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_repeat_encodeBetterBlockAsm8B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitRepeat
|
|
MOVWU R11, R5
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
|
|
cant_repeat_two_offset_match_nolit_repeat_encodeBetterBlockAsm8B:
|
|
CMPW $0x00000104, R11
|
|
BLO repeat_three_match_nolit_repeat_encodeBetterBlockAsm8B
|
|
SUB $256, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R1)
|
|
MOVH R11, 2(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_three_match_nolit_repeat_encodeBetterBlockAsm8B:
|
|
SUB $4, R11, R11
|
|
MOVWU R11, R11
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R1)
|
|
MOVB R11, 2(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
|
|
repeat_two_match_nolit_repeat_encodeBetterBlockAsm8B:
|
|
LSLW $0x02, R11, R11
|
|
ORRW $0x01, R11, R11
|
|
MOVH R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeBetterBlockAsm8B
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R7, 1(R1)
|
|
ASRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R11, R11
|
|
MOVB R11, (R1)
|
|
ADD $0x02, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeBetterBlockAsm8B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeBetterBlockAsm8B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeBetterBlockAsm8B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x38, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x36, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x38, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 4096(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 4096(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeBetterBlockAsm8B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeBetterBlockAsm8B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeBetterBlockAsm8B
|
|
|
|
emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeBetterBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeBetterBlockAsm8B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeBetterBlockAsm8B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeBetterBlockAsm8B
|
|
BLO three_bytes_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeBetterBlockAsm8B
|
|
JMP memmove_long_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
one_byte_emit_remainder_encodeBetterBlockAsm8B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeBetterBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeBetterBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeBetterBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeBetterBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeBetterBlockAsm8Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeBetterBlockAsm8B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBlockAsm(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBlockAsm:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBlockAsm:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBlockAsm
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeSnappyBlockAsm
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_encodeSnappyBlockAsm
|
|
|
|
repeat_extend_back_loop_encodeSnappyBlockAsm:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_encodeSnappyBlockAsm
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeSnappyBlockAsm
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_encodeSnappyBlockAsm
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $5, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeSnappyBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeSnappyBlockAsm
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_repeat_emit_encodeSnappyBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_repeat_emit_encodeSnappyBlockAsm:
|
|
MOVWU R5, R9
|
|
LSRW $0x10, R9, R9
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R9, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeSnappyBlockAsm
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
one_byte_repeat_emit_encodeSnappyBlockAsm:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R8), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeSnappyBlockAsm:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R11
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsmlarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeSnappyBlockAsm:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_encodeSnappyBlockAsm
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_encodeSnappyBlockAsm
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_encodeSnappyBlockAsm
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_encodeSnappyBlockAsm
|
|
BLO repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeSnappyBlockAsm
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R6
|
|
BLO two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm
|
|
|
|
four_bytes_loop_back_repeat_as_copy_encodeSnappyBlockAsm:
|
|
CMPW $0x40, R5
|
|
BLS four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R6, 1(R1)
|
|
SUB $64, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R5
|
|
BLO four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm
|
|
JMP four_bytes_loop_back_repeat_as_copy_encodeSnappyBlockAsm
|
|
|
|
four_bytes_remain_repeat_as_copy_encodeSnappyBlockAsm:
|
|
TSTW R5, R5
|
|
BEQ repeat_end_emit_encodeSnappyBlockAsm
|
|
MOVD $0, R7
|
|
ADD R5<<2, R7, R5
|
|
SUB $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVW R6, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm
|
|
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm
|
|
|
|
emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBlockAsm
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeSnappyBlockAsm
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeSnappyBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
candidate3_match_encodeSnappyBlockAsm:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeSnappyBlockAsm
|
|
|
|
candidate2_match_encodeSnappyBlockAsm:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBlockAsm:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBlockAsm
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBlockAsm
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $5, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeSnappyBlockAsm
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeSnappyBlockAsm
|
|
CMPW $0x00010000, R7
|
|
BLO three_bytes_match_emit_encodeSnappyBlockAsm
|
|
CMPW $0x01000000, R7
|
|
BLO four_bytes_match_emit_encodeSnappyBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R7, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_match_emit_encodeSnappyBlockAsm:
|
|
MOVWU R7, R9
|
|
LSRW $0x10, R9, R9
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
MOVB R9, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeSnappyBlockAsm
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm
|
|
|
|
one_byte_match_emit_encodeSnappyBlockAsm:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBlockAsm:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBlockAsmlarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBlockAsm:
|
|
match_nolit_loop_encodeSnappyBlockAsm:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBlockAsm
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBlockAsm
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBlockAsm
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBlockAsm
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBlockAsm
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBlockAsm
|
|
BLO match_nolit_end_encodeSnappyBlockAsm
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBlockAsm
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeSnappyBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBlockAsm
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R5
|
|
BLO two_byte_offset_match_nolit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_loop_back_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x40, R9
|
|
BLS four_bytes_remain_match_nolit_encodeSnappyBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
SUB $64, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R9
|
|
BLO four_bytes_remain_match_nolit_encodeSnappyBlockAsm
|
|
JMP four_bytes_loop_back_match_nolit_encodeSnappyBlockAsm
|
|
|
|
four_bytes_remain_match_nolit_encodeSnappyBlockAsm:
|
|
TSTW R9, R9
|
|
BEQ match_nolit_emitcopy_end_encodeSnappyBlockAsm
|
|
MOVD $0, R6
|
|
ADD R9<<2, R6, R9
|
|
SUB $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R9, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm
|
|
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBlockAsm
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBlockAsm:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBlockAsm:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBlockAsm
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm:
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x10, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x32, R7, R7
|
|
LSL $0x10, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x32, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeSnappyBlockAsm
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBlockAsm
|
|
|
|
emit_remainder_encodeSnappyBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $5, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBlockAsm
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
CMPW $0x01000000, R2
|
|
BLO four_bytes_emit_remainder_encodeSnappyBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R2, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
four_bytes_emit_remainder_encodeSnappyBlockAsm:
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBlockAsm
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
one_byte_emit_remainder_encodeSnappyBlockAsm:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBlockAsm:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsmlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBlockAsm:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm64K(dst []byte, src []byte, tmp *[65536]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBlockAsm64K(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBlockAsm64K:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBlockAsm64K:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBlockAsm64K
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeSnappyBlockAsm64K
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_encodeSnappyBlockAsm64K
|
|
|
|
repeat_extend_back_loop_encodeSnappyBlockAsm64K:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_encodeSnappyBlockAsm64K
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeSnappyBlockAsm64K
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_encodeSnappyBlockAsm64K
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm64K:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeSnappyBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm64K:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeSnappyBlockAsm64K
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeSnappyBlockAsm64K
|
|
BLO three_bytes_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeSnappyBlockAsm64K
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
one_byte_repeat_emit_encodeSnappyBlockAsm64K:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm64K:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R8), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm64K_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeSnappyBlockAsm64K:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm64K:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R11
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeSnappyBlockAsm64K:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm64K:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm64K:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm64K:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K
|
|
BLO repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm64K:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeSnappyBlockAsm64K
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm64K:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm64K:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm64K:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm64K:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm64K:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm64K:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBlockAsm64K
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeSnappyBlockAsm64K
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeSnappyBlockAsm64K
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
candidate3_match_encodeSnappyBlockAsm64K:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeSnappyBlockAsm64K
|
|
|
|
candidate2_match_encodeSnappyBlockAsm64K:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBlockAsm64K:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm64K
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm64K:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBlockAsm64K
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBlockAsm64K
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm64K
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm64K
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm64K:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm64K:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBlockAsm64K
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeSnappyBlockAsm64K
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeSnappyBlockAsm64K
|
|
BLO three_bytes_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeSnappyBlockAsm64K
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
one_byte_match_emit_encodeSnappyBlockAsm64K:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm64K:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm64K_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBlockAsm64K:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm64K:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBlockAsm64K:
|
|
match_nolit_loop_encodeSnappyBlockAsm64K:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm64K:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm64K:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBlockAsm64K
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBlockAsm64K
|
|
BLO match_nolit_end_encodeSnappyBlockAsm64K
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBlockAsm64K
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeSnappyBlockAsm64K
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm64K:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBlockAsm64K
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm64K:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm64K:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBlockAsm64K
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm64K
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBlockAsm64K:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm64K
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm64K
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm64K
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBlockAsm64K:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm64K:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBlockAsm64K
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm64K:
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x10, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x32, R7, R7
|
|
LSL $0x10, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x32, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeSnappyBlockAsm64K
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBlockAsm64K
|
|
|
|
emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm64K:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBlockAsm64K
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBlockAsm64K
|
|
BLO three_bytes_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBlockAsm64K
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
one_byte_emit_remainder_encodeSnappyBlockAsm64K:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm64K:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm64K_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm64K:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm64Klarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBlockAsm64K:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm12B(dst []byte, src []byte, tmp *[16384]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBlockAsm12B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000080, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBlockAsm12B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBlockAsm12B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBlockAsm12B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x000000cf1bbcdcbb, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x18, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x18, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x18, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeSnappyBlockAsm12B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_encodeSnappyBlockAsm12B
|
|
|
|
repeat_extend_back_loop_encodeSnappyBlockAsm12B:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_encodeSnappyBlockAsm12B
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeSnappyBlockAsm12B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_encodeSnappyBlockAsm12B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm12B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeSnappyBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm12B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeSnappyBlockAsm12B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeSnappyBlockAsm12B
|
|
BLO three_bytes_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeSnappyBlockAsm12B
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
one_byte_repeat_emit_encodeSnappyBlockAsm12B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm12B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R8), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeSnappyBlockAsm12B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm12B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R11
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeSnappyBlockAsm12B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm12B:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm12B:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm12B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B
|
|
BLO repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm12B:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeSnappyBlockAsm12B
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm12B:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm12B:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm12B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm12B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm12B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm12B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBlockAsm12B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeSnappyBlockAsm12B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeSnappyBlockAsm12B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm12B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeSnappyBlockAsm12B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm12B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBlockAsm12B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm12B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBlockAsm12B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBlockAsm12B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm12B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm12B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeSnappyBlockAsm12B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeSnappyBlockAsm12B
|
|
BLO three_bytes_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeSnappyBlockAsm12B
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
one_byte_match_emit_encodeSnappyBlockAsm12B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm12B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBlockAsm12B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm12B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBlockAsm12B:
|
|
match_nolit_loop_encodeSnappyBlockAsm12B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm12B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm12B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBlockAsm12B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBlockAsm12B
|
|
BLO match_nolit_end_encodeSnappyBlockAsm12B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBlockAsm12B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeSnappyBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm12B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBlockAsm12B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm12B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm12B:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBlockAsm12B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm12B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBlockAsm12B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm12B
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm12B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm12B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBlockAsm12B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm12B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBlockAsm12B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm12B:
|
|
MOVD $0x000000cf1bbcdcbb, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x18, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x34, R7, R7
|
|
LSL $0x18, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x34, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeSnappyBlockAsm12B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBlockAsm12B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBlockAsm12B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBlockAsm12B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBlockAsm12B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBlockAsm12B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm12Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBlockAsm12B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm10B(dst []byte, src []byte, tmp *[4096]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBlockAsm10B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000020, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBlockAsm10B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBlockAsm10B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBlockAsm10B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeSnappyBlockAsm10B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_encodeSnappyBlockAsm10B
|
|
|
|
repeat_extend_back_loop_encodeSnappyBlockAsm10B:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_encodeSnappyBlockAsm10B
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeSnappyBlockAsm10B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_encodeSnappyBlockAsm10B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm10B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeSnappyBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm10B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeSnappyBlockAsm10B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeSnappyBlockAsm10B
|
|
BLO three_bytes_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeSnappyBlockAsm10B
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
one_byte_repeat_emit_encodeSnappyBlockAsm10B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm10B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R8), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeSnappyBlockAsm10B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm10B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R11
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeSnappyBlockAsm10B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm10B:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm10B:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm10B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B
|
|
BLO repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm10B:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeSnappyBlockAsm10B
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm10B:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm10B:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm10B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm10B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm10B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm10B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBlockAsm10B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeSnappyBlockAsm10B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeSnappyBlockAsm10B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm10B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeSnappyBlockAsm10B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm10B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBlockAsm10B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm10B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBlockAsm10B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBlockAsm10B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm10B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm10B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeSnappyBlockAsm10B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeSnappyBlockAsm10B
|
|
BLO three_bytes_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeSnappyBlockAsm10B
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
one_byte_match_emit_encodeSnappyBlockAsm10B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm10B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBlockAsm10B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm10B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBlockAsm10B:
|
|
match_nolit_loop_encodeSnappyBlockAsm10B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm10B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm10B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBlockAsm10B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBlockAsm10B
|
|
BLO match_nolit_end_encodeSnappyBlockAsm10B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBlockAsm10B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeSnappyBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm10B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBlockAsm10B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm10B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm10B:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBlockAsm10B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm10B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBlockAsm10B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm10B
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm10B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm10B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBlockAsm10B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm10B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBlockAsm10B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm10B:
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x20, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x36, R7, R7
|
|
LSL $0x20, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x36, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeSnappyBlockAsm10B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBlockAsm10B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBlockAsm10B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBlockAsm10B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBlockAsm10B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBlockAsm10B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm10Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBlockAsm10B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBlockAsm8B(dst []byte, src []byte, tmp *[1024]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBlockAsm8B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000008, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBlockAsm8B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBlockAsm8B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x04, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBlockAsm8B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x38, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x38, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x38, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_encodeSnappyBlockAsm8B
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_encodeSnappyBlockAsm8B
|
|
|
|
repeat_extend_back_loop_encodeSnappyBlockAsm8B:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_encodeSnappyBlockAsm8B
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_encodeSnappyBlockAsm8B
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_encodeSnappyBlockAsm8B
|
|
|
|
repeat_extend_back_end_encodeSnappyBlockAsm8B:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_encodeSnappyBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_encodeSnappyBlockAsm8B:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_encodeSnappyBlockAsm8B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_encodeSnappyBlockAsm8B
|
|
BLO three_bytes_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_repeat_emit_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_repeat_emit_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_encodeSnappyBlockAsm8B
|
|
JMP memmove_long_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
one_byte_repeat_emit_encodeSnappyBlockAsm8B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_encodeSnappyBlockAsm8B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R8), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R8), R9
|
|
ADD R7, R8, R15
|
|
MOVD -8(R15), R8
|
|
MOVD R9, (R1)
|
|
ADD R7, R1, R15
|
|
MOVD R8, -8(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R8), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_repeat_emit_encodeSnappyBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R8), F0
|
|
FMOVQ 16(R8), F1
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R7, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_repeat_emit_encodeSnappyBlockAsm8B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_repeat_emit_encodeSnappyBlockAsm8B:
|
|
ADD R7, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R8, R9
|
|
MOVD R1, R10
|
|
MOVD R7, R11
|
|
|
|
emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_repeat_emit_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
ADD R7, R8, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R8, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_repeat_emit_encodeSnappyBlockAsm8B:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_16repeat_extend_encodeSnappyBlockAsm8B:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match8_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_8_repeat_extend_encodeSnappyBlockAsm8B:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match4_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_encodeSnappyBlockAsm8B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B
|
|
BLO repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match1_repeat_extend_encodeSnappyBlockAsm8B:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_encodeSnappyBlockAsm8B
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_encodeSnappyBlockAsm8B:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm8B:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm8B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R6, 1(R1)
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_encodeSnappyBlockAsm8B
|
|
|
|
two_byte_offset_short_repeat_as_copy_encodeSnappyBlockAsm8B:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm8B
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R6, 1(R1)
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R7, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_copy_three_repeat_as_copy_encodeSnappyBlockAsm8B:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R1)
|
|
MOVH R6, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_encodeSnappyBlockAsm8B:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
no_repeat_found_encodeSnappyBlockAsm8B:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBlockAsm8B
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_encodeSnappyBlockAsm8B
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_encodeSnappyBlockAsm8B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
candidate3_match_encodeSnappyBlockAsm8B:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_encodeSnappyBlockAsm8B
|
|
|
|
candidate2_match_encodeSnappyBlockAsm8B:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBlockAsm8B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeSnappyBlockAsm8B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBlockAsm8B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBlockAsm8B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBlockAsm8B
|
|
JMP match_extend_back_loop_encodeSnappyBlockAsm8B
|
|
|
|
match_extend_back_end_encodeSnappyBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBlockAsm8B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R7
|
|
MOVWU R7, R7
|
|
CMPW $0x3c, R7
|
|
BLO one_byte_match_emit_encodeSnappyBlockAsm8B
|
|
CMPW $0x00000100, R7
|
|
BLO two_bytes_match_emit_encodeSnappyBlockAsm8B
|
|
BLO three_bytes_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R7, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R7
|
|
BLO memmove_match_emit_encodeSnappyBlockAsm8B
|
|
JMP memmove_long_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
one_byte_match_emit_encodeSnappyBlockAsm8B:
|
|
LSLW $0x02, R7, R16
|
|
BFI $0, R16, $8, R7
|
|
MOVB R7, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBlockAsm8B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R6), R9
|
|
MOVD R9, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R6), R9
|
|
ADD R8, R6, R15
|
|
MOVD -8(R15), R6
|
|
MOVD R9, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R6, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R6), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R6), F0
|
|
FMOVQ 16(R6), F1
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBlockAsm8B:
|
|
MOVD R7, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeSnappyBlockAsm8B:
|
|
ADD R8, R1, R7
|
|
|
|
// genMemMoveLong
|
|
MOVD R6, R9
|
|
MOVD R1, R10
|
|
MOVD R8, R11
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
FMOVQ F0, (R10)
|
|
FMOVQ F1, 16(R10)
|
|
ADD $0x20, R9, R9
|
|
ADD $0x20, R10, R10
|
|
SUB $0x20, R11, R11
|
|
CMP $0x20, R11
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
ADD R8, R6, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R6, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R7, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBlockAsm8B:
|
|
match_nolit_loop_encodeSnappyBlockAsm8B:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBlockAsm8B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBlockAsm8B:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBlockAsm8B
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBlockAsm8B
|
|
BLO match_nolit_end_encodeSnappyBlockAsm8B
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBlockAsm8B
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_encodeSnappyBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBlockAsm8B:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBlockAsm8B
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_encodeSnappyBlockAsm8B:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBlockAsm8B:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBlockAsm8B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBlockAsm8B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBlockAsm8B:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBlockAsm8B
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R5, 1(R1)
|
|
LSRW $0x08, R5, R5
|
|
LSLW $0x05, R5, R5
|
|
ORRW R5, R6, R6
|
|
MOVB R6, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBlockAsm8B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBlockAsm8B:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBlockAsm8B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBlockAsm8B
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBlockAsm8B:
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x20, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x38, R7, R7
|
|
LSL $0x20, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x38, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_encodeSnappyBlockAsm8B
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBlockAsm8B
|
|
|
|
emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBlockAsm8B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBlockAsm8B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBlockAsm8B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBlockAsm8B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBlockAsm8Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBlockAsm8B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm(dst []byte, src []byte, tmp *[589824]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBetterBlockAsm(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00001200, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBetterBlockAsm:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x07, R5, R5
|
|
CMPW $0x63, R5
|
|
BLS check_maxskip_ok_encodeSnappyBetterBlockAsm
|
|
ADD $100, R2, R5
|
|
MOVWU R5, R5
|
|
JMP check_maxskip_cont_encodeSnappyBetterBlockAsm
|
|
|
|
check_maxskip_ok_encodeSnappyBetterBlockAsm:
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
|
|
check_maxskip_cont_encodeSnappyBetterBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x00cf1bbcdcbfa563, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 524288(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 524288(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeSnappyBetterBlockAsm
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeSnappyBetterBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $5, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm
|
|
BLO match_nolit_end_encodeSnappyBetterBlockAsm
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeSnappyBetterBlockAsm
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBetterBlockAsm
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
CMPW $0x01, R11
|
|
BHI match_length_ok_encodeSnappyBetterBlockAsm
|
|
CMPW $0x0000ffff, R7
|
|
BLS match_length_ok_encodeSnappyBetterBlockAsm
|
|
MOVWU 28(RSP), R2
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm
|
|
|
|
match_length_ok_encodeSnappyBetterBlockAsm:
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeSnappyBetterBlockAsm
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_match_emit_encodeSnappyBetterBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R5, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_match_emit_encodeSnappyBetterBlockAsm:
|
|
MOVWU R5, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
MOVB R10, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeSnappyBetterBlockAsm
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
one_byte_match_emit_encodeSnappyBetterBlockAsm:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsmlarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBetterBlockAsm:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R7
|
|
BLO two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_loop_back_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x40, R11
|
|
BLS four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R1)
|
|
MOVW R7, 1(R1)
|
|
SUB $64, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R11
|
|
BLO four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm
|
|
JMP four_bytes_loop_back_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_remain_match_nolit_encodeSnappyBetterBlockAsm:
|
|
TSTW R11, R11
|
|
BEQ match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm
|
|
MOVD $0, R5
|
|
ADD R11<<2, R5, R11
|
|
SUB $1, R11, R11
|
|
MOVWU R11, R11
|
|
MOVB R11, (R1)
|
|
MOVW R7, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm
|
|
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm:
|
|
MOVD $0x00cf1bbcdcbfa563, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x32, R10, R10
|
|
LSL $0x08, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x2f, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x32, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 524288(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 524288(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeSnappyBetterBlockAsm:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeSnappyBetterBlockAsm
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x2f, R9, R9
|
|
LSL $0x08, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x2f, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeSnappyBetterBlockAsm
|
|
|
|
emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $5, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBetterBlockAsm
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPW $0x00010000, R2
|
|
BLO three_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
CMPW $0x01000000, R2
|
|
BLO four_bytes_emit_remainder_encodeSnappyBetterBlockAsm
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R1)
|
|
MOVW R2, 1(R1)
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
four_bytes_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVWU R2, R3
|
|
LSRW $0x10, R3, R3
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
MOVB R3, 3(R1)
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBetterBlockAsm
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
one_byte_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsmlarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm64K(dst []byte, src []byte, tmp *[294912]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBetterBlockAsm64K(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000900, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBetterBlockAsm64K:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBetterBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x07, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x00cf1bbcdcbfa563, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x30, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x33, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 262144(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 262144(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm64K
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeSnappyBetterBlockAsm64K
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm64K
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm64K:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm64K
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeSnappyBetterBlockAsm64K
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm64K
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm64K:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x08, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x30, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm64K
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm64K:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm64K
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm64K
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBetterBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
BLO match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBetterBlockAsm64K
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeSnappyBetterBlockAsm64K
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeSnappyBetterBlockAsm64K
|
|
BLO three_bytes_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeSnappyBetterBlockAsm64K
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
one_byte_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm64K_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm64Klarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBetterBlockAsm64K:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm64K:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm64K:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm64K:
|
|
MOVD $0x00cf1bbcdcbfa563, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x30, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x33, R10, R10
|
|
LSL $0x08, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x30, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x33, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 262144(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 262144(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeSnappyBetterBlockAsm64K:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeSnappyBetterBlockAsm64K
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x08, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x30, R9, R9
|
|
LSL $0x08, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x30, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBetterBlockAsm64K
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm64K:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
BLO three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
one_byte_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm64K_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm64Klarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm64K:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm12B(dst []byte, src []byte, tmp *[81920]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBetterBlockAsm12B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000280, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBetterBlockAsm12B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x06, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 65536(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 65536(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm12B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeSnappyBetterBlockAsm12B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm12B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm12B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm12B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeSnappyBetterBlockAsm12B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm12B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm12B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x32, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm12B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm12B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm12B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm12B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
BLO match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBetterBlockAsm12B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeSnappyBetterBlockAsm12B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeSnappyBetterBlockAsm12B
|
|
BLO three_bytes_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeSnappyBetterBlockAsm12B
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
one_byte_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm12Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBetterBlockAsm12B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm12B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm12B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm12B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x34, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x32, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x34, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 65536(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 65536(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeSnappyBetterBlockAsm12B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeSnappyBetterBlockAsm12B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x32, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x32, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBetterBlockAsm12B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm12B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm12B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm12Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm12B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm10B(dst []byte, src []byte, tmp *[20480]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBetterBlockAsm10B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x000000a0, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBetterBlockAsm10B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 16384(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 16384(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm10B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeSnappyBetterBlockAsm10B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm10B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm10B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm10B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeSnappyBetterBlockAsm10B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm10B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm10B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x34, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm10B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm10B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm10B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm10B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
BLO match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBetterBlockAsm10B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeSnappyBetterBlockAsm10B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeSnappyBetterBlockAsm10B
|
|
BLO three_bytes_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeSnappyBetterBlockAsm10B
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
one_byte_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm10Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBetterBlockAsm10B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm10B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm10B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm10B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x36, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x34, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x36, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 16384(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 16384(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeSnappyBetterBlockAsm10B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeSnappyBetterBlockAsm10B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x34, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x34, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBetterBlockAsm10B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm10B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm10B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm10Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm10B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func encodeSnappyBetterBlockAsm8B(dst []byte, src []byte, tmp *[5120]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·encodeSnappyBetterBlockAsm8B(SB), $24-64
|
|
MOVD tmp+48(FP), R0
|
|
MOVD dst_base+0(FP), R1
|
|
MOVD $0x00000028, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_encodeSnappyBetterBlockAsm8B:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_encodeSnappyBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+32(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 24(RSP)
|
|
MOVD src_base+24(FP), R3
|
|
|
|
search_loop_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x04, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD $0x9e3779b1, R5
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x38, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD R10<<2, R0, R15
|
|
MOVWU 4096(R15), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R2, 4096(R15)
|
|
MOVD (R3)(R5), R9
|
|
MOVD (R3)(R7), R10
|
|
CMP R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm8B
|
|
CMP R6, R10
|
|
BNE no_short_found_encodeSnappyBetterBlockAsm8B
|
|
MOVWU R7, R5
|
|
JMP candidate_match_encodeSnappyBetterBlockAsm8B
|
|
|
|
no_short_found_encodeSnappyBetterBlockAsm8B:
|
|
CMPW R6, R9
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm8B
|
|
CMPW R6, R10
|
|
BEQ candidateS_match_encodeSnappyBetterBlockAsm8B
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_encodeSnappyBetterBlockAsm8B
|
|
|
|
candidateS_match_encodeSnappyBetterBlockAsm8B:
|
|
LSR $0x08, R6, R6
|
|
MOVD R6, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x36, R9, R9
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADDW $1, R2, R2
|
|
MOVW R2, (R0)(R9<<2)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_encodeSnappyBetterBlockAsm8B
|
|
SUBW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
match_extend_back_loop_encodeSnappyBetterBlockAsm8B:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_encodeSnappyBetterBlockAsm8B
|
|
JMP match_extend_back_loop_encodeSnappyBetterBlockAsm8B
|
|
|
|
match_extend_back_end_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_encodeSnappyBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_dst_size_check_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU R2, R6
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+32(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R9
|
|
|
|
// matchLen
|
|
MOVD $0, R11
|
|
|
|
matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
MOVD (R8)(R11), R10
|
|
ADD R11, R8, R15
|
|
MOVD 8(R15), R12
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
ADD R11, R9, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R12, R12
|
|
TST R12, R12
|
|
BNE matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_loopback_16_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_bsf_16match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
RBIT R12, R12
|
|
CLZ R12, R12
|
|
ASR $0x03, R12, R12
|
|
ADD R12, R11, R11
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match8_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
MOVD (R8)(R11), R10
|
|
MOVD (R9)(R11), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R11, R11
|
|
MOVWU R11, R11
|
|
JMP matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_bsf_8_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R11, R11
|
|
MOVWU R11, R11
|
|
JMP match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match4_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
MOVWU (R8)(R11), R10
|
|
MOVWU (R9)(R11), R16
|
|
CMPW R10, R16
|
|
BNE matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
matchlen_match2_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
BLO match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
MOVHU (R8)(R11), R16
|
|
BFI $0, R16, $16, R10
|
|
ADD R11, R9, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R10, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
ADD $2, R11, R11
|
|
MOVWU R11, R11
|
|
SUBSW $0x02, R7, R7
|
|
BEQ match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
matchlen_match1_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
MOVBU (R8)(R11), R16
|
|
BFI $0, R16, $8, R10
|
|
ADD R11, R9, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R10, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_encodeSnappyBetterBlockAsm8B
|
|
ADD $1, R11, R11
|
|
MOVWU R11, R11
|
|
|
|
match_nolit_end_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU R2, R7
|
|
SUBW R5, R7, R7
|
|
|
|
// Check if repeat
|
|
MOVW R7, 24(RSP)
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R9
|
|
SUBW R5, R8, R8
|
|
SUB $1, R8, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_match_emit_encodeSnappyBetterBlockAsm8B
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_match_emit_encodeSnappyBetterBlockAsm8B
|
|
BLO three_bytes_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
three_bytes_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R5, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
two_bytes_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R5, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_match_emit_encodeSnappyBetterBlockAsm8B
|
|
JMP memmove_long_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
one_byte_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R9), R10
|
|
MOVD R10, (R1)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R9), R10
|
|
ADD R8, R9, R15
|
|
MOVD -8(R15), R9
|
|
MOVD R10, (R1)
|
|
ADD R8, R1, R15
|
|
MOVD R9, -8(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R9), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_match_emit_encodeSnappyBetterBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R9), F0
|
|
FMOVQ 16(R9), F1
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R8, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
MOVD R5, R1
|
|
JMP emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B
|
|
|
|
memmove_long_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
ADD R8, R1, R5
|
|
|
|
// genMemMoveLong
|
|
MOVD R9, R10
|
|
MOVD R1, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_match_emit_encodeSnappyBetterBlockAsm8Blarge_big_loop_back
|
|
ADD R8, R9, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R9, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R5, R1
|
|
|
|
emit_literal_done_match_emit_encodeSnappyBetterBlockAsm8B:
|
|
ADDW R11, R2, R2
|
|
ADDW $0x04, R11, R11
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
CMPW $0x40, R11
|
|
BLS two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R1)
|
|
MOVH R7, 1(R1)
|
|
SUB $60, R11, R11
|
|
MOVWU R11, R11
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
|
|
two_byte_offset_short_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU R11, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R11
|
|
BHS emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm8B
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R7, 1(R1)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R5, R5
|
|
MOVB R5, (R1)
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_copy_three_match_nolit_encodeSnappyBetterBlockAsm8B:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R1)
|
|
MOVH R7, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_encodeSnappyBetterBlockAsm8B:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_encodeSnappyBetterBlockAsm8B:
|
|
MOVD $0x0000cf1bbcdcbf9b, R5
|
|
MOVD $0x9e3779b1, R7
|
|
ADD $1, R6, R6
|
|
SUB $2, R2, R8
|
|
MOVD (R3)(R6), R9
|
|
ADD R6, R3, R15
|
|
MOVD 1(R15), R10
|
|
MOVD (R3)(R8), R11
|
|
ADD R8, R3, R15
|
|
MOVD 1(R15), R12
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R7, R10, R10
|
|
LSR $0x38, R10, R10
|
|
LSL $0x10, R11, R11
|
|
MUL R5, R11, R11
|
|
LSR $0x36, R11, R11
|
|
LSL $0x20, R12, R12
|
|
MUL R7, R12, R12
|
|
LSR $0x38, R12, R12
|
|
ADD $1, R6, R7
|
|
ADD $1, R8, R13
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R8, (R0)(R11<<2)
|
|
ADD R10<<2, R0, R15
|
|
MOVW R7, 4096(R15)
|
|
ADD R12<<2, R0, R15
|
|
MOVW R13, 4096(R15)
|
|
ADD R6, R8, R7
|
|
ADD $1, R7, R7
|
|
LSR $0x01, R7, R7
|
|
ADD $0x01, R6, R6
|
|
SUB $0x01, R8, R8
|
|
|
|
index_loop_encodeSnappyBetterBlockAsm8B:
|
|
CMP R8, R7
|
|
BHS search_loop_encodeSnappyBetterBlockAsm8B
|
|
MOVD (R3)(R6), R9
|
|
MOVD (R3)(R7), R10
|
|
LSL $0x10, R9, R9
|
|
MUL R5, R9, R9
|
|
LSR $0x36, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R5, R10, R10
|
|
LSR $0x36, R10, R10
|
|
MOVW R6, (R0)(R9<<2)
|
|
MOVW R7, (R0)(R10<<2)
|
|
ADD $0x02, R6, R6
|
|
ADD $0x02, R7, R7
|
|
JMP index_loop_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_encodeSnappyBetterBlockAsm8B
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+56(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_encodeSnappyBetterBlockAsm8B:
|
|
MOVD src_len+32(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x3c, R2
|
|
BLO one_byte_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
CMPW $0x00000100, R2
|
|
BLO two_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
BLO three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
three_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R1)
|
|
MOVH R2, 1(R1)
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
two_bytes_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R1)
|
|
MOVB R2, 1(R1)
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R2
|
|
BLO memmove_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
JMP memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
one_byte_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
LSLW $0x02, R2, R16
|
|
BFI $0, R16, $8, R2
|
|
MOVB R2, (R1)
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveShort
|
|
CMP $0x03, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_1or2
|
|
BEQ emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_3
|
|
CMP $0x08, R3
|
|
BLO emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_4through7
|
|
CMP $0x10, R3
|
|
BLS emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_8through16
|
|
CMP $0x20, R3
|
|
BLS 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:
|
|
MOVBU (R0), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R3, R0, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVB R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVB R0, -1(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_3:
|
|
MOVHU (R0), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R0), R16
|
|
BFI $0, R16, $8, R0
|
|
MOVH R5, (R1)
|
|
MOVB R0, 2(R1)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_4through7:
|
|
MOVWU (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVWU -4(R15), R0
|
|
MOVW R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVW R0, -4(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_8through16:
|
|
MOVD (R0), R5
|
|
ADD R3, R0, R15
|
|
MOVD -8(R15), R0
|
|
MOVD R5, (R1)
|
|
ADD R3, R1, R15
|
|
MOVD R0, -8(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_17through32:
|
|
FMOVQ (R0), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
emit_lit_memmove_emit_remainder_encodeSnappyBetterBlockAsm8B_memmove_move_33through64:
|
|
FMOVQ (R0), F0
|
|
FMOVQ 16(R0), F1
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R1)
|
|
FMOVQ F1, 16(R1)
|
|
ADD R3, R1, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVD R2, R1
|
|
JMP emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B
|
|
|
|
memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
ADD R5, R1, R2
|
|
MOVWU R5, R3
|
|
|
|
// genMemMoveLong
|
|
MOVD R0, R5
|
|
MOVD R1, R6
|
|
MOVD R3, R7
|
|
|
|
emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_emit_remainder_encodeSnappyBetterBlockAsm8Blarge_big_loop_back
|
|
ADD R3, R0, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R3, R0, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R3, R1, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R3, R1, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R2, R1
|
|
|
|
emit_literal_done_emit_remainder_encodeSnappyBetterBlockAsm8B:
|
|
MOVD dst_base+0(FP), R0
|
|
SUB R0, R1, R1
|
|
MOVD R1, ret+56(FP)
|
|
RET
|
|
|
|
// func calcBlockSize(src []byte, tmp *[32768]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·calcBlockSize(SB), $24-40
|
|
MOVD tmp+24(FP), R0
|
|
MOVD $0, R1
|
|
MOVD $0x00000100, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_calcBlockSize:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_calcBlockSize
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+8(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+0(FP), R3
|
|
|
|
search_loop_calcBlockSize:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x05, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_calcBlockSize
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x33, R9, R9
|
|
LSL $0x10, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x33, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x10, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x33, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_calcBlockSize
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_calcBlockSize
|
|
|
|
repeat_extend_back_loop_calcBlockSize:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_calcBlockSize
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_calcBlockSize
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_calcBlockSize
|
|
|
|
repeat_extend_back_end_calcBlockSize:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $5, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_calcBlockSize
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_calcBlockSize:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_calcBlockSize
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_calcBlockSize
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_calcBlockSize
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_repeat_emit_calcBlockSize
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_repeat_emit_calcBlockSize
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
four_bytes_repeat_emit_calcBlockSize:
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
three_bytes_repeat_emit_calcBlockSize:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
two_bytes_repeat_emit_calcBlockSize:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_calcBlockSize
|
|
JMP memmove_long_repeat_emit_calcBlockSize
|
|
|
|
one_byte_repeat_emit_calcBlockSize:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_calcBlockSize:
|
|
ADD R7, R1, R1
|
|
JMP emit_literal_done_repeat_emit_calcBlockSize
|
|
|
|
memmove_long_repeat_emit_calcBlockSize:
|
|
ADD R7, R1, R1
|
|
|
|
emit_literal_done_repeat_emit_calcBlockSize:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+8(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_calcBlockSize:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_calcBlockSize
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_calcBlockSize
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_calcBlockSize
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_calcBlockSize
|
|
|
|
matchlen_bsf_16repeat_extend_calcBlockSize:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match8_repeat_extend_calcBlockSize:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_calcBlockSize
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_calcBlockSize
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_calcBlockSize
|
|
|
|
matchlen_bsf_8_repeat_extend_calcBlockSize:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match4_repeat_extend_calcBlockSize:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_calcBlockSize
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_calcBlockSize
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_calcBlockSize:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_calcBlockSize
|
|
BLO repeat_extend_forward_end_calcBlockSize
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_calcBlockSize
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_calcBlockSize
|
|
|
|
matchlen_match1_repeat_extend_calcBlockSize:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_calcBlockSize
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_calcBlockSize:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R6
|
|
BLO two_byte_offset_repeat_as_copy_calcBlockSize
|
|
|
|
four_bytes_loop_back_repeat_as_copy_calcBlockSize:
|
|
CMPW $0x40, R5
|
|
BLS four_bytes_remain_repeat_as_copy_calcBlockSize
|
|
SUB $64, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R5
|
|
BLO four_bytes_remain_repeat_as_copy_calcBlockSize
|
|
JMP four_bytes_loop_back_repeat_as_copy_calcBlockSize
|
|
|
|
four_bytes_remain_repeat_as_copy_calcBlockSize:
|
|
TSTW R5, R5
|
|
BEQ repeat_end_emit_calcBlockSize
|
|
MOVD $0, R5
|
|
ADD $0x05, R1, R1
|
|
JMP repeat_end_emit_calcBlockSize
|
|
|
|
two_byte_offset_repeat_as_copy_calcBlockSize:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_calcBlockSize
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_calcBlockSize
|
|
|
|
two_byte_offset_short_repeat_as_copy_calcBlockSize:
|
|
MOVWU R5, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_calcBlockSize
|
|
CMPW $0x00000800, R6
|
|
BHS emit_copy_three_repeat_as_copy_calcBlockSize
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_calcBlockSize
|
|
|
|
emit_copy_three_repeat_as_copy_calcBlockSize:
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_calcBlockSize:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_calcBlockSize
|
|
|
|
no_repeat_found_calcBlockSize:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_calcBlockSize
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_calcBlockSize
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_calcBlockSize
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_calcBlockSize
|
|
|
|
candidate3_match_calcBlockSize:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_calcBlockSize
|
|
|
|
candidate2_match_calcBlockSize:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_calcBlockSize:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_calcBlockSize
|
|
|
|
match_extend_back_loop_calcBlockSize:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_calcBlockSize
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_calcBlockSize
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_calcBlockSize
|
|
JMP match_extend_back_loop_calcBlockSize
|
|
|
|
match_extend_back_end_calcBlockSize:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $5, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_calcBlockSize
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
match_dst_size_check_calcBlockSize:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_calcBlockSize
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R6
|
|
MOVWU R6, R6
|
|
CMPW $0x3c, R6
|
|
BLO one_byte_match_emit_calcBlockSize
|
|
CMPW $0x00000100, R6
|
|
BLO two_bytes_match_emit_calcBlockSize
|
|
CMPW $0x00010000, R6
|
|
BLO three_bytes_match_emit_calcBlockSize
|
|
CMPW $0x01000000, R6
|
|
BLO four_bytes_match_emit_calcBlockSize
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
four_bytes_match_emit_calcBlockSize:
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
three_bytes_match_emit_calcBlockSize:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
two_bytes_match_emit_calcBlockSize:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R6
|
|
BLO memmove_match_emit_calcBlockSize
|
|
JMP memmove_long_match_emit_calcBlockSize
|
|
|
|
one_byte_match_emit_calcBlockSize:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_calcBlockSize:
|
|
ADD R8, R1, R1
|
|
JMP emit_literal_done_match_emit_calcBlockSize
|
|
|
|
memmove_long_match_emit_calcBlockSize:
|
|
ADD R8, R1, R1
|
|
|
|
emit_literal_done_match_emit_calcBlockSize:
|
|
match_nolit_loop_calcBlockSize:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+8(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_calcBlockSize:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_calcBlockSize
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_calcBlockSize
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_calcBlockSize
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_calcBlockSize
|
|
|
|
matchlen_bsf_16match_nolit_calcBlockSize:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match8_match_nolit_calcBlockSize:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_calcBlockSize
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_calcBlockSize
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_calcBlockSize
|
|
|
|
matchlen_bsf_8_match_nolit_calcBlockSize:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match4_match_nolit_calcBlockSize:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_calcBlockSize
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_calcBlockSize
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_calcBlockSize:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_calcBlockSize
|
|
BLO match_nolit_end_calcBlockSize
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_calcBlockSize
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_calcBlockSize
|
|
|
|
matchlen_match1_match_nolit_calcBlockSize:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_calcBlockSize
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_calcBlockSize:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R5
|
|
BLO two_byte_offset_match_nolit_calcBlockSize
|
|
|
|
four_bytes_loop_back_match_nolit_calcBlockSize:
|
|
CMPW $0x40, R9
|
|
BLS four_bytes_remain_match_nolit_calcBlockSize
|
|
SUB $64, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x05, R1, R1
|
|
CMPW $0x04, R9
|
|
BLO four_bytes_remain_match_nolit_calcBlockSize
|
|
JMP four_bytes_loop_back_match_nolit_calcBlockSize
|
|
|
|
four_bytes_remain_match_nolit_calcBlockSize:
|
|
TSTW R9, R9
|
|
BEQ match_nolit_emitcopy_end_calcBlockSize
|
|
MOVD $0, R5
|
|
ADD $0x05, R1, R1
|
|
JMP match_nolit_emitcopy_end_calcBlockSize
|
|
|
|
two_byte_offset_match_nolit_calcBlockSize:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_calcBlockSize
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_calcBlockSize
|
|
|
|
two_byte_offset_short_match_nolit_calcBlockSize:
|
|
MOVWU R9, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_calcBlockSize
|
|
CMPW $0x00000800, R5
|
|
BHS emit_copy_three_match_nolit_calcBlockSize
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_calcBlockSize
|
|
|
|
emit_copy_three_match_nolit_calcBlockSize:
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_calcBlockSize:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_calcBlockSize
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_calcBlockSize
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_calcBlockSize:
|
|
MOVD $0x0000cf1bbcdcbf9b, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x10, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x33, R7, R7
|
|
LSL $0x10, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x33, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_calcBlockSize
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_calcBlockSize
|
|
|
|
emit_remainder_calcBlockSize:
|
|
MOVD src_len+8(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $5, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_calcBlockSize
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_calcBlockSize:
|
|
MOVD src_len+8(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_calcBlockSize
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R0
|
|
MOVWU R0, R0
|
|
CMPW $0x3c, R0
|
|
BLO one_byte_emit_remainder_calcBlockSize
|
|
CMPW $0x00000100, R0
|
|
BLO two_bytes_emit_remainder_calcBlockSize
|
|
CMPW $0x00010000, R0
|
|
BLO three_bytes_emit_remainder_calcBlockSize
|
|
CMPW $0x01000000, R0
|
|
BLO four_bytes_emit_remainder_calcBlockSize
|
|
ADD $0x05, R1, R1
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
four_bytes_emit_remainder_calcBlockSize:
|
|
ADD $0x04, R1, R1
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
three_bytes_emit_remainder_calcBlockSize:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
two_bytes_emit_remainder_calcBlockSize:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R0
|
|
BLO memmove_emit_remainder_calcBlockSize
|
|
JMP memmove_long_emit_remainder_calcBlockSize
|
|
|
|
one_byte_emit_remainder_calcBlockSize:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_calcBlockSize:
|
|
ADD R5, R1, R0
|
|
MOVD R0, R1
|
|
JMP emit_literal_done_emit_remainder_calcBlockSize
|
|
|
|
memmove_long_emit_remainder_calcBlockSize:
|
|
ADD R5, R1, R0
|
|
MOVD R0, R1
|
|
|
|
emit_literal_done_emit_remainder_calcBlockSize:
|
|
MOVD R1, ret+32(FP)
|
|
RET
|
|
|
|
// func calcBlockSizeSmall(src []byte, tmp *[2048]byte) int
|
|
// Requires: BMI, SSE2
|
|
TEXT ·calcBlockSizeSmall(SB), $24-40
|
|
MOVD tmp+24(FP), R0
|
|
MOVD $0, R1
|
|
MOVD $0x00000010, R2
|
|
MOVD R0, R3
|
|
VEOR V0.B16, V0.B16, V0.B16
|
|
|
|
zero_loop_calcBlockSizeSmall:
|
|
FMOVQ F0, (R3)
|
|
FMOVQ F0, 16(R3)
|
|
FMOVQ F0, 32(R3)
|
|
FMOVQ F0, 48(R3)
|
|
FMOVQ F0, 64(R3)
|
|
FMOVQ F0, 80(R3)
|
|
FMOVQ F0, 96(R3)
|
|
FMOVQ F0, 112(R3)
|
|
ADD $0x80, R3, R3
|
|
SUBS $1, R2, R2
|
|
BNE zero_loop_calcBlockSizeSmall
|
|
MOVD $0x00000000, R16
|
|
MOVW R16, 20(RSP)
|
|
MOVD src_len+8(FP), R2
|
|
SUB $9, R2, R3
|
|
SUB $8, R2, R5
|
|
MOVW R5, 16(RSP)
|
|
LSR $0x05, R2, R2
|
|
SUBW R2, R3, R3
|
|
ADD R3, R1, R3
|
|
MOVD R3, 8(RSP)
|
|
MOVD $0x00000001, R2
|
|
MOVW R2, 24(RSP)
|
|
MOVD src_base+0(FP), R3
|
|
|
|
search_loop_calcBlockSizeSmall:
|
|
MOVWU R2, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
LSRW $0x04, R5, R5
|
|
ADD R5, R2, R5
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R5
|
|
BHS emit_remainder_calcBlockSizeSmall
|
|
MOVD (R3)(R2), R6
|
|
MOVW R5, 28(RSP)
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R9
|
|
MOVD R6, R10
|
|
LSR $0x08, R10, R10
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x37, R9, R9
|
|
LSL $0x20, R10, R10
|
|
MUL R8, R10, R10
|
|
LSR $0x37, R10, R10
|
|
MOVWU (R0)(R9<<2), R5
|
|
MOVWU (R0)(R10<<2), R7
|
|
MOVW R2, (R0)(R9<<2)
|
|
ADD $1, R2, R9
|
|
MOVWU R9, R9
|
|
MOVW R9, (R0)(R10<<2)
|
|
MOVD R6, R9
|
|
LSR $0x10, R9, R9
|
|
LSL $0x20, R9, R9
|
|
MUL R8, R9, R9
|
|
LSR $0x37, R9, R9
|
|
MOVWU R2, R8
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R8, R8
|
|
ADD R8, R3, R15
|
|
MOVWU 1(R15), R10
|
|
MOVD R6, R8
|
|
LSR $0x08, R8, R8
|
|
CMPW R10, R8
|
|
BNE no_repeat_found_calcBlockSizeSmall
|
|
ADD $1, R2, R6
|
|
MOVWU R6, R6
|
|
MOVWU 20(RSP), R5
|
|
MOVWU R6, R7
|
|
MOVWU 24(RSP), R16
|
|
SUBSW R16, R7, R7
|
|
BEQ repeat_extend_back_end_calcBlockSizeSmall
|
|
|
|
repeat_extend_back_loop_calcBlockSizeSmall:
|
|
CMPW R5, R6
|
|
BLS repeat_extend_back_end_calcBlockSizeSmall
|
|
ADD R7, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R6, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R9
|
|
AND $0xff, R9, R16
|
|
AND $0xff, R8, R15
|
|
CMP R16, R15
|
|
BNE repeat_extend_back_end_calcBlockSizeSmall
|
|
SUB $1, R6, R6
|
|
MOVWU R6, R6
|
|
SUBSW $1, R7, R7
|
|
BNE repeat_extend_back_loop_calcBlockSizeSmall
|
|
|
|
repeat_extend_back_end_calcBlockSizeSmall:
|
|
MOVWU R6, R5
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R5, R5
|
|
ADD R5, R1, R5
|
|
ADD $3, R5, R5
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R5
|
|
BLO repeat_dst_size_check_calcBlockSizeSmall
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
repeat_dst_size_check_calcBlockSizeSmall:
|
|
MOVWU 20(RSP), R5
|
|
CMPW R6, R5
|
|
BEQ emit_literal_done_repeat_emit_calcBlockSizeSmall
|
|
MOVWU R6, R7
|
|
MOVW R6, 20(RSP)
|
|
ADD R5, R3, R8
|
|
SUBW R5, R7, R7
|
|
SUB $1, R7, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_repeat_emit_calcBlockSizeSmall
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_repeat_emit_calcBlockSizeSmall
|
|
BLO three_bytes_repeat_emit_calcBlockSizeSmall
|
|
|
|
three_bytes_repeat_emit_calcBlockSizeSmall:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_repeat_emit_calcBlockSizeSmall
|
|
|
|
two_bytes_repeat_emit_calcBlockSizeSmall:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R5
|
|
BLO memmove_repeat_emit_calcBlockSizeSmall
|
|
JMP memmove_long_repeat_emit_calcBlockSizeSmall
|
|
|
|
one_byte_repeat_emit_calcBlockSizeSmall:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_repeat_emit_calcBlockSizeSmall:
|
|
ADD R7, R1, R1
|
|
JMP emit_literal_done_repeat_emit_calcBlockSizeSmall
|
|
|
|
memmove_long_repeat_emit_calcBlockSizeSmall:
|
|
ADD R7, R1, R1
|
|
|
|
emit_literal_done_repeat_emit_calcBlockSizeSmall:
|
|
ADDW $0x05, R2, R2
|
|
MOVWU R2, R5
|
|
MOVWU 24(RSP), R16
|
|
SUBW R16, R5, R5
|
|
MOVD src_len+8(FP), R7
|
|
SUBW R2, R7, R7
|
|
ADD R2, R3, R8
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R10
|
|
|
|
matchlen_loopback_16_repeat_extend_calcBlockSizeSmall:
|
|
CMPW $0x10, R7
|
|
BLO matchlen_match8_repeat_extend_calcBlockSizeSmall
|
|
MOVD (R8)(R10), R9
|
|
ADD R10, R8, R15
|
|
MOVD 8(R15), R11
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_calcBlockSizeSmall
|
|
ADD R10, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R11, R11
|
|
TST R11, R11
|
|
BNE matchlen_bsf_16repeat_extend_calcBlockSizeSmall
|
|
SUB $16, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $16, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_loopback_16_repeat_extend_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_16repeat_extend_calcBlockSizeSmall:
|
|
RBIT R11, R11
|
|
CLZ R11, R11
|
|
ASR $0x03, R11, R11
|
|
ADD R11, R10, R10
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match8_repeat_extend_calcBlockSizeSmall:
|
|
CMPW $0x08, R7
|
|
BLO matchlen_match4_repeat_extend_calcBlockSizeSmall
|
|
MOVD (R8)(R10), R9
|
|
MOVD (R5)(R10), R16
|
|
EOR R16, R9, R9
|
|
TST R9, R9
|
|
BNE matchlen_bsf_8_repeat_extend_calcBlockSizeSmall
|
|
SUB $8, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $8, R10, R10
|
|
MOVWU R10, R10
|
|
JMP matchlen_match4_repeat_extend_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_8_repeat_extend_calcBlockSizeSmall:
|
|
RBIT R9, R9
|
|
CLZ R9, R9
|
|
ASR $0x03, R9, R9
|
|
ADD R9, R10, R10
|
|
MOVWU R10, R10
|
|
JMP repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match4_repeat_extend_calcBlockSizeSmall:
|
|
CMPW $0x04, R7
|
|
BLO matchlen_match2_repeat_extend_calcBlockSizeSmall
|
|
MOVWU (R8)(R10), R9
|
|
MOVWU (R5)(R10), R16
|
|
CMPW R9, R16
|
|
BNE matchlen_match2_repeat_extend_calcBlockSizeSmall
|
|
SUB $4, R7, R7
|
|
MOVWU R7, R7
|
|
ADD $4, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
matchlen_match2_repeat_extend_calcBlockSizeSmall:
|
|
CMPW $0x01, R7
|
|
BEQ matchlen_match1_repeat_extend_calcBlockSizeSmall
|
|
BLO repeat_extend_forward_end_calcBlockSizeSmall
|
|
MOVHU (R8)(R10), R16
|
|
BFI $0, R16, $16, R9
|
|
ADD R10, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R9, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_repeat_extend_calcBlockSizeSmall
|
|
ADD $2, R10, R10
|
|
MOVWU R10, R10
|
|
SUBSW $0x02, R7, R7
|
|
BEQ repeat_extend_forward_end_calcBlockSizeSmall
|
|
|
|
matchlen_match1_repeat_extend_calcBlockSizeSmall:
|
|
MOVBU (R8)(R10), R16
|
|
BFI $0, R16, $8, R9
|
|
ADD R10, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R9, R16
|
|
CMP R16, R15
|
|
BNE repeat_extend_forward_end_calcBlockSizeSmall
|
|
ADD $1, R10, R10
|
|
MOVWU R10, R10
|
|
|
|
repeat_extend_forward_end_calcBlockSizeSmall:
|
|
ADDW R10, R2, R2
|
|
MOVWU R2, R5
|
|
SUBW R6, R5, R5
|
|
MOVWU 24(RSP), R6
|
|
|
|
// emitCopy
|
|
two_byte_offset_repeat_as_copy_calcBlockSizeSmall:
|
|
CMPW $0x40, R5
|
|
BLS two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall
|
|
SUB $60, R5, R5
|
|
MOVWU R5, R5
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_repeat_as_copy_calcBlockSizeSmall
|
|
|
|
two_byte_offset_short_repeat_as_copy_calcBlockSizeSmall:
|
|
MOVWU R5, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R5
|
|
BHS emit_copy_three_repeat_as_copy_calcBlockSizeSmall
|
|
ADD $0x02, R1, R1
|
|
JMP repeat_end_emit_calcBlockSizeSmall
|
|
|
|
emit_copy_three_repeat_as_copy_calcBlockSizeSmall:
|
|
ADD $0x03, R1, R1
|
|
|
|
repeat_end_emit_calcBlockSizeSmall:
|
|
MOVW R2, 20(RSP)
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
no_repeat_found_calcBlockSizeSmall:
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate_match_calcBlockSizeSmall
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R0)(R9<<2), R5
|
|
ADD $2, R2, R8
|
|
MOVWU R8, R8
|
|
MOVWU (R3)(R7), R16
|
|
CMPW R6, R16
|
|
BEQ candidate2_match_calcBlockSizeSmall
|
|
MOVW R8, (R0)(R9<<2)
|
|
LSR $0x08, R6, R6
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ candidate3_match_calcBlockSizeSmall
|
|
MOVWU 28(RSP), R2
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
candidate3_match_calcBlockSizeSmall:
|
|
ADDW $0x02, R2, R2
|
|
JMP candidate_match_calcBlockSizeSmall
|
|
|
|
candidate2_match_calcBlockSizeSmall:
|
|
MOVW R8, (R0)(R9<<2)
|
|
ADDW $1, R2, R2
|
|
MOVWU R7, R5
|
|
|
|
candidate_match_calcBlockSizeSmall:
|
|
MOVWU 20(RSP), R6
|
|
TSTW R5, R5
|
|
BEQ match_extend_back_end_calcBlockSizeSmall
|
|
|
|
match_extend_back_loop_calcBlockSizeSmall:
|
|
CMPW R6, R2
|
|
BLS match_extend_back_end_calcBlockSizeSmall
|
|
ADD R5, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R7
|
|
ADD R2, R3, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R8
|
|
AND $0xff, R8, R16
|
|
AND $0xff, R7, R15
|
|
CMP R16, R15
|
|
BNE match_extend_back_end_calcBlockSizeSmall
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
SUBSW $1, R5, R5
|
|
BEQ match_extend_back_end_calcBlockSizeSmall
|
|
JMP match_extend_back_loop_calcBlockSizeSmall
|
|
|
|
match_extend_back_end_calcBlockSizeSmall:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R6, R6
|
|
ADD R6, R1, R6
|
|
ADD $3, R6, R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R6
|
|
BLO match_dst_size_check_calcBlockSizeSmall
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
match_dst_size_check_calcBlockSizeSmall:
|
|
MOVWU R2, R6
|
|
MOVWU 20(RSP), R7
|
|
CMPW R6, R7
|
|
BEQ emit_literal_done_match_emit_calcBlockSizeSmall
|
|
MOVWU R6, R8
|
|
MOVW R6, 20(RSP)
|
|
ADD R7, R3, R6
|
|
SUBW R7, R8, R8
|
|
SUB $1, R8, R6
|
|
MOVWU R6, R6
|
|
CMPW $0x3c, R6
|
|
BLO one_byte_match_emit_calcBlockSizeSmall
|
|
CMPW $0x00000100, R6
|
|
BLO two_bytes_match_emit_calcBlockSizeSmall
|
|
BLO three_bytes_match_emit_calcBlockSizeSmall
|
|
|
|
three_bytes_match_emit_calcBlockSizeSmall:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_match_emit_calcBlockSizeSmall
|
|
|
|
two_bytes_match_emit_calcBlockSizeSmall:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R6
|
|
BLO memmove_match_emit_calcBlockSizeSmall
|
|
JMP memmove_long_match_emit_calcBlockSizeSmall
|
|
|
|
one_byte_match_emit_calcBlockSizeSmall:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_match_emit_calcBlockSizeSmall:
|
|
ADD R8, R1, R1
|
|
JMP emit_literal_done_match_emit_calcBlockSizeSmall
|
|
|
|
memmove_long_match_emit_calcBlockSizeSmall:
|
|
ADD R8, R1, R1
|
|
|
|
emit_literal_done_match_emit_calcBlockSizeSmall:
|
|
match_nolit_loop_calcBlockSizeSmall:
|
|
MOVWU R2, R6
|
|
SUBW R5, R6, R6
|
|
MOVW R6, 24(RSP)
|
|
ADDW $0x04, R2, R2
|
|
ADDW $0x04, R5, R5
|
|
MOVD src_len+8(FP), R6
|
|
SUBW R2, R6, R6
|
|
ADD R2, R3, R7
|
|
ADD R5, R3, R5
|
|
|
|
// matchLen
|
|
MOVD $0, R9
|
|
|
|
matchlen_loopback_16_match_nolit_calcBlockSizeSmall:
|
|
CMPW $0x10, R6
|
|
BLO matchlen_match8_match_nolit_calcBlockSizeSmall
|
|
MOVD (R7)(R9), R8
|
|
ADD R9, R7, R15
|
|
MOVD 8(R15), R10
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_calcBlockSizeSmall
|
|
ADD R9, R5, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R10, R10
|
|
TST R10, R10
|
|
BNE matchlen_bsf_16match_nolit_calcBlockSizeSmall
|
|
SUB $16, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $16, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_loopback_16_match_nolit_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_16match_nolit_calcBlockSizeSmall:
|
|
RBIT R10, R10
|
|
CLZ R10, R10
|
|
ASR $0x03, R10, R10
|
|
ADD R10, R9, R9
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match8_match_nolit_calcBlockSizeSmall:
|
|
CMPW $0x08, R6
|
|
BLO matchlen_match4_match_nolit_calcBlockSizeSmall
|
|
MOVD (R7)(R9), R8
|
|
MOVD (R5)(R9), R16
|
|
EOR R16, R8, R8
|
|
TST R8, R8
|
|
BNE matchlen_bsf_8_match_nolit_calcBlockSizeSmall
|
|
SUB $8, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP matchlen_match4_match_nolit_calcBlockSizeSmall
|
|
|
|
matchlen_bsf_8_match_nolit_calcBlockSizeSmall:
|
|
RBIT R8, R8
|
|
CLZ R8, R8
|
|
ASR $0x03, R8, R8
|
|
ADD R8, R9, R9
|
|
MOVWU R9, R9
|
|
JMP match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match4_match_nolit_calcBlockSizeSmall:
|
|
CMPW $0x04, R6
|
|
BLO matchlen_match2_match_nolit_calcBlockSizeSmall
|
|
MOVWU (R7)(R9), R8
|
|
MOVWU (R5)(R9), R16
|
|
CMPW R8, R16
|
|
BNE matchlen_match2_match_nolit_calcBlockSizeSmall
|
|
SUB $4, R6, R6
|
|
MOVWU R6, R6
|
|
ADD $4, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
matchlen_match2_match_nolit_calcBlockSizeSmall:
|
|
CMPW $0x01, R6
|
|
BEQ matchlen_match1_match_nolit_calcBlockSizeSmall
|
|
BLO match_nolit_end_calcBlockSizeSmall
|
|
MOVHU (R7)(R9), R16
|
|
BFI $0, R16, $16, R8
|
|
ADD R9, R5, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R8, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_match_nolit_calcBlockSizeSmall
|
|
ADD $2, R9, R9
|
|
MOVWU R9, R9
|
|
SUBSW $0x02, R6, R6
|
|
BEQ match_nolit_end_calcBlockSizeSmall
|
|
|
|
matchlen_match1_match_nolit_calcBlockSizeSmall:
|
|
MOVBU (R7)(R9), R16
|
|
BFI $0, R16, $8, R8
|
|
ADD R9, R5, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R8, R16
|
|
CMP R16, R15
|
|
BNE match_nolit_end_calcBlockSizeSmall
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
|
|
match_nolit_end_calcBlockSizeSmall:
|
|
ADDW R9, R2, R2
|
|
MOVWU 24(RSP), R5
|
|
ADDW $0x04, R9, R9
|
|
MOVW R2, 20(RSP)
|
|
|
|
// emitCopy
|
|
two_byte_offset_match_nolit_calcBlockSizeSmall:
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_match_nolit_calcBlockSizeSmall
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R1, R1
|
|
JMP two_byte_offset_match_nolit_calcBlockSizeSmall
|
|
|
|
two_byte_offset_short_match_nolit_calcBlockSizeSmall:
|
|
MOVWU R9, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_match_nolit_calcBlockSizeSmall
|
|
ADD $0x02, R1, R1
|
|
JMP match_nolit_emitcopy_end_calcBlockSizeSmall
|
|
|
|
emit_copy_three_match_nolit_calcBlockSizeSmall:
|
|
ADD $0x03, R1, R1
|
|
|
|
match_nolit_emitcopy_end_calcBlockSizeSmall:
|
|
MOVWU 16(RSP), R16
|
|
CMPW R16, R2
|
|
BHS emit_remainder_calcBlockSizeSmall
|
|
ADD R2, R3, R15
|
|
MOVD -2(R15), R6
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R1
|
|
BLO match_nolit_dst_ok_calcBlockSizeSmall
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
match_nolit_dst_ok_calcBlockSizeSmall:
|
|
MOVD $0x9e3779b1, R8
|
|
MOVD R6, R7
|
|
LSR $0x10, R6, R6
|
|
MOVD R6, R5
|
|
LSL $0x20, R7, R7
|
|
MUL R8, R7, R7
|
|
LSR $0x37, R7, R7
|
|
LSL $0x20, R5, R5
|
|
MUL R8, R5, R5
|
|
LSR $0x37, R5, R5
|
|
SUB $2, R2, R8
|
|
MOVWU R8, R8
|
|
ADD R5<<2, R0, R9
|
|
MOVWU (R9), R5
|
|
MOVW R8, (R0)(R7<<2)
|
|
MOVW R2, (R9)
|
|
MOVWU (R3)(R5), R16
|
|
CMPW R6, R16
|
|
BEQ match_nolit_loop_calcBlockSizeSmall
|
|
ADDW $1, R2, R2
|
|
JMP search_loop_calcBlockSizeSmall
|
|
|
|
emit_remainder_calcBlockSizeSmall:
|
|
MOVD src_len+8(FP), R0
|
|
MOVWU 20(RSP), R16
|
|
SUBW R16, R0, R0
|
|
ADD R0, R1, R0
|
|
ADD $3, R0, R0
|
|
MOVD 8(RSP), R16
|
|
CMP R16, R0
|
|
BLO emit_remainder_ok_calcBlockSizeSmall
|
|
MOVD $0x00000000, R16
|
|
MOVD R16, ret+32(FP)
|
|
RET
|
|
|
|
emit_remainder_ok_calcBlockSizeSmall:
|
|
MOVD src_len+8(FP), R0
|
|
MOVWU 20(RSP), R2
|
|
CMPW R0, R2
|
|
BEQ emit_literal_done_emit_remainder_calcBlockSizeSmall
|
|
MOVWU R0, R5
|
|
MOVW R0, 20(RSP)
|
|
ADD R2, R3, R0
|
|
SUBW R2, R5, R5
|
|
SUB $1, R5, R0
|
|
MOVWU R0, R0
|
|
CMPW $0x3c, R0
|
|
BLO one_byte_emit_remainder_calcBlockSizeSmall
|
|
CMPW $0x00000100, R0
|
|
BLO two_bytes_emit_remainder_calcBlockSizeSmall
|
|
BLO three_bytes_emit_remainder_calcBlockSizeSmall
|
|
|
|
three_bytes_emit_remainder_calcBlockSizeSmall:
|
|
ADD $0x03, R1, R1
|
|
JMP memmove_long_emit_remainder_calcBlockSizeSmall
|
|
|
|
two_bytes_emit_remainder_calcBlockSizeSmall:
|
|
ADD $0x02, R1, R1
|
|
CMPW $0x40, R0
|
|
BLO memmove_emit_remainder_calcBlockSizeSmall
|
|
JMP memmove_long_emit_remainder_calcBlockSizeSmall
|
|
|
|
one_byte_emit_remainder_calcBlockSizeSmall:
|
|
ADD $0x01, R1, R1
|
|
|
|
memmove_emit_remainder_calcBlockSizeSmall:
|
|
ADD R5, R1, R0
|
|
MOVD R0, R1
|
|
JMP emit_literal_done_emit_remainder_calcBlockSizeSmall
|
|
|
|
memmove_long_emit_remainder_calcBlockSizeSmall:
|
|
ADD R5, R1, R0
|
|
MOVD R0, R1
|
|
|
|
emit_literal_done_emit_remainder_calcBlockSizeSmall:
|
|
MOVD R1, ret+32(FP)
|
|
RET
|
|
|
|
// func emitLiteral(dst []byte, lit []byte) int
|
|
// Requires: SSE2
|
|
TEXT ·emitLiteral(SB), NOSPLIT, $0-56
|
|
MOVD lit_len+32(FP), R2
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD lit_base+24(FP), R1
|
|
TST R2, R2
|
|
BEQ emit_literal_end_standalone_skip
|
|
MOVWU R2, R3
|
|
SUB $1, R2, R5
|
|
MOVWU R5, R5
|
|
CMPW $0x3c, R5
|
|
BLO one_byte_standalone
|
|
CMPW $0x00000100, R5
|
|
BLO two_bytes_standalone
|
|
CMPW $0x00010000, R5
|
|
BLO three_bytes_standalone
|
|
CMPW $0x01000000, R5
|
|
BLO four_bytes_standalone
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R0)
|
|
MOVW R5, 1(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP memmove_long_standalone
|
|
|
|
four_bytes_standalone:
|
|
MOVWU R5, R6
|
|
LSRW $0x10, R6, R6
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R0)
|
|
MOVH R5, 1(R0)
|
|
MOVB R6, 3(R0)
|
|
ADD $0x04, R3, R3
|
|
ADD $0x04, R0, R0
|
|
JMP memmove_long_standalone
|
|
|
|
three_bytes_standalone:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R0)
|
|
MOVH R5, 1(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
JMP memmove_long_standalone
|
|
|
|
two_bytes_standalone:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R0)
|
|
MOVB R5, 1(R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
CMPW $0x40, R5
|
|
BLO memmove_standalone
|
|
JMP memmove_long_standalone
|
|
|
|
one_byte_standalone:
|
|
LSLW $0x02, R5, R16
|
|
BFI $0, R16, $8, R5
|
|
MOVB R5, (R0)
|
|
ADD $0x01, R3, R3
|
|
ADD $0x01, R0, R0
|
|
|
|
memmove_standalone:
|
|
// genMemMoveShort
|
|
CMP $0x03, R2
|
|
BLO emit_lit_memmove_standalone_memmove_move_1or2
|
|
BEQ emit_lit_memmove_standalone_memmove_move_3
|
|
CMP $0x08, R2
|
|
BLO emit_lit_memmove_standalone_memmove_move_4through7
|
|
CMP $0x10, R2
|
|
BLS emit_lit_memmove_standalone_memmove_move_8through16
|
|
CMP $0x20, R2
|
|
BLS emit_lit_memmove_standalone_memmove_move_17through32
|
|
JMP emit_lit_memmove_standalone_memmove_move_33through64
|
|
|
|
emit_lit_memmove_standalone_memmove_move_1or2:
|
|
MOVBU (R1), R16
|
|
BFI $0, R16, $8, R5
|
|
ADD R2, R1, R15
|
|
MOVBU -1(R15), R16
|
|
BFI $0, R16, $8, R1
|
|
MOVB R5, (R0)
|
|
ADD R2, R0, R15
|
|
MOVB R1, -1(R15)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_3:
|
|
MOVHU (R1), R16
|
|
BFI $0, R16, $16, R5
|
|
MOVBU 2(R1), R16
|
|
BFI $0, R16, $8, R1
|
|
MOVH R5, (R0)
|
|
MOVB R1, 2(R0)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_4through7:
|
|
MOVWU (R1), R5
|
|
ADD R2, R1, R15
|
|
MOVWU -4(R15), R1
|
|
MOVW R5, (R0)
|
|
ADD R2, R0, R15
|
|
MOVW R1, -4(R15)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_8through16:
|
|
MOVD (R1), R5
|
|
ADD R2, R1, R15
|
|
MOVD -8(R15), R1
|
|
MOVD R5, (R0)
|
|
ADD R2, R0, R15
|
|
MOVD R1, -8(R15)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_17through32:
|
|
FMOVQ (R1), F0
|
|
ADD R2, R1, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R0)
|
|
ADD R2, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_lit_memmove_standalone_memmove_move_33through64:
|
|
FMOVQ (R1), F0
|
|
FMOVQ 16(R1), F1
|
|
ADD R2, R1, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R2, R1, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R0)
|
|
FMOVQ F1, 16(R0)
|
|
ADD R2, R0, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R2, R0, R15
|
|
FMOVQ F3, -16(R15)
|
|
JMP emit_literal_end_standalone
|
|
JMP emit_literal_end_standalone
|
|
|
|
memmove_long_standalone:
|
|
// genMemMoveLong
|
|
MOVD R1, R5
|
|
MOVD R0, R6
|
|
MOVD R2, R7
|
|
|
|
emit_lit_memmove_long_standalonelarge_big_loop_back:
|
|
FMOVQ (R5), F0
|
|
FMOVQ 16(R5), F1
|
|
FMOVQ F0, (R6)
|
|
FMOVQ F1, 16(R6)
|
|
ADD $0x20, R5, R5
|
|
ADD $0x20, R6, R6
|
|
SUB $0x20, R7, R7
|
|
CMP $0x20, R7
|
|
BHS emit_lit_memmove_long_standalonelarge_big_loop_back
|
|
ADD R2, R1, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R2, R1, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R2, R0, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R2, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP emit_literal_end_standalone
|
|
JMP emit_literal_end_standalone
|
|
|
|
emit_literal_end_standalone_skip:
|
|
MOVD $0, R3
|
|
|
|
emit_literal_end_standalone:
|
|
MOVD R3, ret+48(FP)
|
|
RET
|
|
|
|
// func emitRepeat(dst []byte, offset int, length int) int
|
|
TEXT ·emitRepeat(SB), NOSPLIT, $0-48
|
|
MOVD $0, R3
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD offset+24(FP), R1
|
|
MOVD length+32(FP), R2
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone:
|
|
MOVWU R2, R5
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_standalone
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_standalone
|
|
CMPW $0x00000800, R1
|
|
BLO repeat_two_offset_standalone
|
|
|
|
cant_repeat_two_offset_standalone:
|
|
CMPW $0x00000104, R2
|
|
BLO repeat_three_standalone
|
|
CMPW $0x00010100, R2
|
|
BLO repeat_four_standalone
|
|
CMPW $0x0100ffff, R2
|
|
BLO repeat_five_standalone
|
|
SUB $16842747, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
ADD $0x05, R3, R3
|
|
JMP emit_repeat_again_standalone
|
|
|
|
repeat_five_standalone:
|
|
SUB $65536, R2, R2
|
|
MOVWU R2, R2
|
|
MOVWU R2, R1
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ASRW $0x10, R1, R1
|
|
MOVB R1, 4(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_four_standalone:
|
|
SUB $256, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ADD $0x04, R3, R3
|
|
ADD $0x04, R0, R0
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_three_standalone:
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R2, 2(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_two_standalone:
|
|
LSLW $0x02, R2, R2
|
|
ORRW $0x01, R2, R2
|
|
MOVH R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_repeat_end
|
|
|
|
repeat_two_offset_standalone:
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
ADD $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R1, 1(R0)
|
|
ASRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R2, R2
|
|
MOVB R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
|
|
gen_emit_repeat_end:
|
|
MOVD R3, ret+40(FP)
|
|
RET
|
|
|
|
// func emitCopy(dst []byte, offset int, length int) int
|
|
TEXT ·emitCopy(SB), NOSPLIT, $0-48
|
|
MOVD $0, R3
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD offset+24(FP), R1
|
|
MOVD length+32(FP), R2
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R1
|
|
BLO two_byte_offset_standalone
|
|
CMPW $0x40, R2
|
|
BLS four_bytes_remain_standalone
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R0)
|
|
MOVW R1, 1(R0)
|
|
SUB $64, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
CMPW $0x04, R2
|
|
BLO four_bytes_remain_standalone
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone_emit_copy:
|
|
MOVWU R2, R5
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_standalone_emit_copy
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_standalone_emit_copy
|
|
CMPW $0x00000800, R1
|
|
BLO repeat_two_offset_standalone_emit_copy
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy:
|
|
CMPW $0x00000104, R2
|
|
BLO repeat_three_standalone_emit_copy
|
|
CMPW $0x00010100, R2
|
|
BLO repeat_four_standalone_emit_copy
|
|
CMPW $0x0100ffff, R2
|
|
BLO repeat_five_standalone_emit_copy
|
|
SUB $16842747, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
ADD $0x05, R3, R3
|
|
JMP emit_repeat_again_standalone_emit_copy
|
|
|
|
repeat_five_standalone_emit_copy:
|
|
SUB $65536, R2, R2
|
|
MOVWU R2, R2
|
|
MOVWU R2, R1
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ASRW $0x10, R1, R1
|
|
MOVB R1, 4(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy:
|
|
SUB $256, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ADD $0x04, R3, R3
|
|
ADD $0x04, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy:
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R2, 2(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy:
|
|
LSLW $0x02, R2, R2
|
|
ORRW $0x01, R2, R2
|
|
MOVH R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy:
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
ADD $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R1, 1(R0)
|
|
ASRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R2, R2
|
|
MOVB R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
four_bytes_remain_standalone:
|
|
TSTW R2, R2
|
|
BEQ gen_emit_copy_end
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R2, (R0)
|
|
MOVW R1, 1(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
two_byte_offset_standalone:
|
|
CMPW $0x40, R2
|
|
BLS two_byte_offset_short_standalone
|
|
CMPW $0x00000800, R1
|
|
BHS long_offset_short_standalone
|
|
MOVD $0x00000001, R5
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R1, 1(R0)
|
|
MOVWU R1, R6
|
|
LSRW $0x08, R6, R6
|
|
LSLW $0x05, R6, R6
|
|
ORRW R6, R5, R5
|
|
MOVB R5, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
SUBW $0x08, R2, R2
|
|
|
|
// emitRepeat
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
JMP cant_repeat_two_offset_standalone_emit_copy_short_2b
|
|
|
|
emit_repeat_again_standalone_emit_copy_short_2b:
|
|
MOVWU R2, R5
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_standalone_emit_copy_short_2b
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_standalone_emit_copy_short_2b
|
|
CMPW $0x00000800, R1
|
|
BLO repeat_two_offset_standalone_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy_short_2b:
|
|
CMPW $0x00000104, R2
|
|
BLO repeat_three_standalone_emit_copy_short_2b
|
|
CMPW $0x00010100, R2
|
|
BLO repeat_four_standalone_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R2
|
|
BLO repeat_five_standalone_emit_copy_short_2b
|
|
SUB $16842747, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
ADD $0x05, R3, R3
|
|
JMP emit_repeat_again_standalone_emit_copy_short_2b
|
|
|
|
repeat_five_standalone_emit_copy_short_2b:
|
|
SUB $65536, R2, R2
|
|
MOVWU R2, R2
|
|
MOVWU R2, R1
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ASRW $0x10, R1, R1
|
|
MOVB R1, 4(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy_short_2b:
|
|
SUB $256, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ADD $0x04, R3, R3
|
|
ADD $0x04, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy_short_2b:
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R2, 2(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy_short_2b:
|
|
LSLW $0x02, R2, R2
|
|
ORRW $0x01, R2, R2
|
|
MOVH R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy_short_2b:
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
ADD $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R1, 1(R0)
|
|
ASRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R2, R2
|
|
MOVB R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
long_offset_short_standalone:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R1, 1(R0)
|
|
SUB $60, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $0x03, R0, R0
|
|
ADD $0x03, R3, R3
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_standalone_emit_copy_short:
|
|
MOVWU R2, R5
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
CMPW $0x08, R5
|
|
BLS repeat_two_standalone_emit_copy_short
|
|
CMPW $0x0c, R5
|
|
BHS cant_repeat_two_offset_standalone_emit_copy_short
|
|
CMPW $0x00000800, R1
|
|
BLO repeat_two_offset_standalone_emit_copy_short
|
|
|
|
cant_repeat_two_offset_standalone_emit_copy_short:
|
|
CMPW $0x00000104, R2
|
|
BLO repeat_three_standalone_emit_copy_short
|
|
CMPW $0x00010100, R2
|
|
BLO repeat_four_standalone_emit_copy_short
|
|
CMPW $0x0100ffff, R2
|
|
BLO repeat_five_standalone_emit_copy_short
|
|
SUB $16842747, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
ADD $0x05, R3, R3
|
|
JMP emit_repeat_again_standalone_emit_copy_short
|
|
|
|
repeat_five_standalone_emit_copy_short:
|
|
SUB $65536, R2, R2
|
|
MOVWU R2, R2
|
|
MOVWU R2, R1
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ASRW $0x10, R1, R1
|
|
MOVB R1, 4(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_four_standalone_emit_copy_short:
|
|
SUB $256, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R2, 2(R0)
|
|
ADD $0x04, R3, R3
|
|
ADD $0x04, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_three_standalone_emit_copy_short:
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R2, 2(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_standalone_emit_copy_short:
|
|
LSLW $0x02, R2, R2
|
|
ORRW $0x01, R2, R2
|
|
MOVH R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
repeat_two_offset_standalone_emit_copy_short:
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
ADD $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R1, 1(R0)
|
|
ASRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R2, R2
|
|
MOVB R2, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
two_byte_offset_short_standalone:
|
|
MOVWU R2, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R2
|
|
BHS emit_copy_three_standalone
|
|
CMPW $0x00000800, R1
|
|
BHS emit_copy_three_standalone
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R1, 1(R0)
|
|
LSRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R5, R5
|
|
MOVB R5, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end
|
|
|
|
emit_copy_three_standalone:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R0)
|
|
MOVH R1, 1(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
|
|
gen_emit_copy_end:
|
|
MOVD R3, ret+40(FP)
|
|
RET
|
|
|
|
// func emitCopyNoRepeat(dst []byte, offset int, length int) int
|
|
TEXT ·emitCopyNoRepeat(SB), NOSPLIT, $0-48
|
|
MOVD $0, R3
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD offset+24(FP), R1
|
|
MOVD length+32(FP), R2
|
|
|
|
// emitCopy
|
|
CMPW $0x00010000, R1
|
|
BLO two_byte_offset_standalone_snappy
|
|
|
|
four_bytes_loop_back_standalone_snappy:
|
|
CMPW $0x40, R2
|
|
BLS four_bytes_remain_standalone_snappy
|
|
MOVD $0xff, R16
|
|
MOVB R16, (R0)
|
|
MOVW R1, 1(R0)
|
|
SUB $64, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
CMPW $0x04, R2
|
|
BLO four_bytes_remain_standalone_snappy
|
|
JMP four_bytes_loop_back_standalone_snappy
|
|
|
|
four_bytes_remain_standalone_snappy:
|
|
TSTW R2, R2
|
|
BEQ gen_emit_copy_end_snappy
|
|
MOVD $0, R5
|
|
ADD R2<<2, R5, R2
|
|
SUB $1, R2, R2
|
|
MOVWU R2, R2
|
|
MOVB R2, (R0)
|
|
MOVW R1, 1(R0)
|
|
ADD $0x05, R3, R3
|
|
ADD $0x05, R0, R0
|
|
JMP gen_emit_copy_end_snappy
|
|
|
|
two_byte_offset_standalone_snappy:
|
|
CMPW $0x40, R2
|
|
BLS two_byte_offset_short_standalone_snappy
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R1, 1(R0)
|
|
SUB $60, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $0x03, R0, R0
|
|
ADD $0x03, R3, R3
|
|
JMP two_byte_offset_standalone_snappy
|
|
|
|
two_byte_offset_short_standalone_snappy:
|
|
MOVWU R2, R5
|
|
LSLW $0x02, R5, R5
|
|
CMPW $0x0c, R2
|
|
BHS emit_copy_three_standalone_snappy
|
|
CMPW $0x00000800, R1
|
|
BHS emit_copy_three_standalone_snappy
|
|
SUB $15, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R1, 1(R0)
|
|
LSRW $0x08, R1, R1
|
|
LSLW $0x05, R1, R1
|
|
ORRW R1, R5, R5
|
|
MOVB R5, (R0)
|
|
ADD $0x02, R3, R3
|
|
ADD $0x02, R0, R0
|
|
JMP gen_emit_copy_end_snappy
|
|
|
|
emit_copy_three_standalone_snappy:
|
|
SUB $2, R5, R5
|
|
MOVWU R5, R5
|
|
MOVB R5, (R0)
|
|
MOVH R1, 1(R0)
|
|
ADD $0x03, R3, R3
|
|
ADD $0x03, R0, R0
|
|
|
|
gen_emit_copy_end_snappy:
|
|
MOVD R3, ret+40(FP)
|
|
RET
|
|
|
|
// func matchLen(a []byte, b []byte) int
|
|
// Requires: BMI
|
|
TEXT ·matchLen(SB), NOSPLIT, $0-56
|
|
MOVD a_base+0(FP), R0
|
|
MOVD b_base+24(FP), R1
|
|
MOVD a_len+8(FP), R2
|
|
|
|
// matchLen
|
|
MOVD $0, R5
|
|
|
|
matchlen_loopback_16_standalone:
|
|
CMPW $0x10, R2
|
|
BLO matchlen_match8_standalone
|
|
MOVD (R0)(R5), R3
|
|
ADD R5, R0, R15
|
|
MOVD 8(R15), R6
|
|
MOVD (R1)(R5), R16
|
|
EOR R16, R3, R3
|
|
TST R3, R3
|
|
BNE matchlen_bsf_8_standalone
|
|
ADD R5, R1, R15
|
|
MOVD 8(R15), R16
|
|
EOR R16, R6, R6
|
|
TST R6, R6
|
|
BNE matchlen_bsf_16standalone
|
|
SUB $16, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $16, R5, R5
|
|
MOVWU R5, R5
|
|
JMP matchlen_loopback_16_standalone
|
|
|
|
matchlen_bsf_16standalone:
|
|
RBIT R6, R6
|
|
CLZ R6, R6
|
|
ASR $0x03, R6, R6
|
|
ADD R6, R5, R5
|
|
ADD $8, R5, R5
|
|
MOVWU R5, R5
|
|
JMP gen_match_len_end
|
|
|
|
matchlen_match8_standalone:
|
|
CMPW $0x08, R2
|
|
BLO matchlen_match4_standalone
|
|
MOVD (R0)(R5), R3
|
|
MOVD (R1)(R5), R16
|
|
EOR R16, R3, R3
|
|
TST R3, R3
|
|
BNE matchlen_bsf_8_standalone
|
|
SUB $8, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $8, R5, R5
|
|
MOVWU R5, R5
|
|
JMP matchlen_match4_standalone
|
|
|
|
matchlen_bsf_8_standalone:
|
|
RBIT R3, R3
|
|
CLZ R3, R3
|
|
ASR $0x03, R3, R3
|
|
ADD R3, R5, R5
|
|
MOVWU R5, R5
|
|
JMP gen_match_len_end
|
|
|
|
matchlen_match4_standalone:
|
|
CMPW $0x04, R2
|
|
BLO matchlen_match2_standalone
|
|
MOVWU (R0)(R5), R3
|
|
MOVWU (R1)(R5), R16
|
|
CMPW R3, R16
|
|
BNE matchlen_match2_standalone
|
|
SUB $4, R2, R2
|
|
MOVWU R2, R2
|
|
ADD $4, R5, R5
|
|
MOVWU R5, R5
|
|
|
|
matchlen_match2_standalone:
|
|
CMPW $0x01, R2
|
|
BEQ matchlen_match1_standalone
|
|
BLO gen_match_len_end
|
|
MOVHU (R0)(R5), R16
|
|
BFI $0, R16, $16, R3
|
|
ADD R5, R1, R15
|
|
MOVHU (R15), R15
|
|
AND $0xffff, R3, R16
|
|
CMP R16, R15
|
|
BNE matchlen_match1_standalone
|
|
ADD $2, R5, R5
|
|
MOVWU R5, R5
|
|
SUBSW $0x02, R2, R2
|
|
BEQ gen_match_len_end
|
|
|
|
matchlen_match1_standalone:
|
|
MOVBU (R0)(R5), R16
|
|
BFI $0, R16, $8, R3
|
|
ADD R5, R1, R15
|
|
MOVBU (R15), R15
|
|
AND $0xff, R3, R16
|
|
CMP R16, R15
|
|
BNE gen_match_len_end
|
|
ADD $1, R5, R5
|
|
MOVWU R5, R5
|
|
|
|
gen_match_len_end:
|
|
MOVD R5, ret+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4BlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4BlockAsm(SB), NOSPLIT, $0-64
|
|
MOVD $0, R5
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD dst_len+8(FP), R1
|
|
MOVD src_base+24(FP), R2
|
|
MOVD src_len+32(FP), R3
|
|
ADD R3, R2, R3
|
|
ADD R1, R0, R1
|
|
SUB $8, R1, R1
|
|
MOVD $0, R6
|
|
|
|
lz4_s2_loop:
|
|
CMP R3, R2
|
|
BHS lz4_s2_corrupt
|
|
CMP R1, R0
|
|
BHS lz4_s2_dstfull
|
|
MOVBU (R2), R7
|
|
MOVD R7, R8
|
|
MOVD R7, R9
|
|
LSR $0x04, R8, R8
|
|
AND $0x0f, R9, R9
|
|
CMP $0xf0, R7
|
|
BLO lz4_s2_ll_end
|
|
|
|
lz4_s2_ll_loop:
|
|
ADD $1, R2, R2
|
|
CMP R3, R2
|
|
BHS lz4_s2_corrupt
|
|
MOVBU (R2), R7
|
|
ADD R7, R8, R8
|
|
CMP $0xff, R7
|
|
BEQ lz4_s2_ll_loop
|
|
|
|
lz4_s2_ll_end:
|
|
ADD R8, R2, R7
|
|
ADD $0x04, R9, R9
|
|
CMP R3, R7
|
|
BHS lz4_s2_corrupt
|
|
ADD $1, R2, R2
|
|
ADD $1, R7, R7
|
|
TST R8, R8
|
|
BEQ lz4_s2_lits_done
|
|
ADD R8, R0, R10
|
|
CMP R1, R10
|
|
BHS lz4_s2_dstfull
|
|
ADD R8, R5, R5
|
|
SUB $1, R8, R10
|
|
MOVWU R10, R10
|
|
CMPW $0x3c, R10
|
|
BLO one_byte_lz4_s2
|
|
CMPW $0x00000100, R10
|
|
BLO two_bytes_lz4_s2
|
|
CMPW $0x00010000, R10
|
|
BLO three_bytes_lz4_s2
|
|
CMPW $0x01000000, R10
|
|
BLO four_bytes_lz4_s2
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R0)
|
|
MOVW R10, 1(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP memmove_long_lz4_s2
|
|
|
|
four_bytes_lz4_s2:
|
|
MOVWU R10, R11
|
|
LSRW $0x10, R11, R11
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R0)
|
|
MOVH R10, 1(R0)
|
|
MOVB R11, 3(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP memmove_long_lz4_s2
|
|
|
|
three_bytes_lz4_s2:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R0)
|
|
MOVH R10, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP memmove_long_lz4_s2
|
|
|
|
two_bytes_lz4_s2:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R0)
|
|
MOVB R10, 1(R0)
|
|
ADD $0x02, R0, R0
|
|
CMPW $0x40, R10
|
|
BLO memmove_lz4_s2
|
|
JMP memmove_long_lz4_s2
|
|
|
|
one_byte_lz4_s2:
|
|
LSLW $0x02, R10, R16
|
|
BFI $0, R16, $8, R10
|
|
MOVB R10, (R0)
|
|
ADD $0x01, R0, R0
|
|
|
|
memmove_lz4_s2:
|
|
ADD R8, R0, R10
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_lz4_s2_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_lz4_s2_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R2), R11
|
|
MOVD R11, (R0)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_8through16:
|
|
MOVD (R2), R11
|
|
ADD R8, R2, R15
|
|
MOVD -8(R15), R2
|
|
MOVD R11, (R0)
|
|
ADD R8, R0, R15
|
|
MOVD R2, -8(R15)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_17through32:
|
|
FMOVQ (R2), F0
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R0)
|
|
ADD R8, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_lz4_s2
|
|
|
|
emit_lit_memmove_lz4_s2_memmove_move_33through64:
|
|
FMOVQ (R2), F0
|
|
FMOVQ 16(R2), F1
|
|
ADD R8, R2, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R0)
|
|
FMOVQ F1, 16(R0)
|
|
ADD R8, R0, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R0, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_lz4_s2:
|
|
MOVD R10, R0
|
|
JMP lz4_s2_lits_emit_done
|
|
|
|
memmove_long_lz4_s2:
|
|
ADD R8, R0, R10
|
|
|
|
// genMemMoveLong
|
|
MOVD R2, R11
|
|
MOVD R0, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_lz4_s2large_big_loop_back:
|
|
FMOVQ (R11), F0
|
|
FMOVQ 16(R11), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R11, R11
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_lz4_s2large_big_loop_back
|
|
ADD R8, R2, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R0, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R10, R0
|
|
|
|
lz4_s2_lits_emit_done:
|
|
MOVD R7, R2
|
|
|
|
lz4_s2_lits_done:
|
|
CMP R3, R2
|
|
BNE lz4_s2_match
|
|
CMP $0x04, R9
|
|
BEQ lz4_s2_done
|
|
JMP lz4_s2_corrupt
|
|
|
|
lz4_s2_match:
|
|
ADD $2, R2, R7
|
|
CMP R3, R7
|
|
BHS lz4_s2_corrupt
|
|
MOVHU (R2), R8
|
|
MOVD R7, R2
|
|
TST R8, R8
|
|
BEQ lz4_s2_corrupt
|
|
CMP R5, R8
|
|
BHI lz4_s2_corrupt
|
|
CMP $0x13, R9
|
|
BNE lz4_s2_ml_done
|
|
|
|
lz4_s2_ml_loop:
|
|
MOVBU (R2), R7
|
|
ADD $1, R2, R2
|
|
ADD R7, R9, R9
|
|
CMP R3, R2
|
|
BHS lz4_s2_corrupt
|
|
CMP $0xff, R7
|
|
BEQ lz4_s2_ml_loop
|
|
|
|
lz4_s2_ml_done:
|
|
ADD R9, R5, R5
|
|
CMP R6, R8
|
|
BNE lz4_s2_docopy
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2
|
|
|
|
cant_repeat_two_offset_lz4_s2:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2
|
|
|
|
repeat_five_lz4_s2:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
lz4_s2_docopy:
|
|
MOVD R8, R6
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BHS long_offset_short_lz4_s2
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R8, 1(R0)
|
|
MOVWU R8, R10
|
|
LSRW $0x08, R10, R10
|
|
LSLW $0x05, R10, R10
|
|
ORRW R10, R7, R7
|
|
MOVB R7, (R0)
|
|
ADD $0x02, R0, R0
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
emit_repeat_again_lz4_s2_emit_copy_short_2b:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2_emit_copy_short_2b
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short_2b
|
|
|
|
repeat_five_lz4_s2_emit_copy_short_2b:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short_2b:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
long_offset_short_lz4_s2:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R8, 1(R0)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R0, R0
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2_emit_copy_short:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2_emit_copy_short
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2_emit_copy_short
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2_emit_copy_short
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2_emit_copy_short
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2_emit_copy_short
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short
|
|
|
|
repeat_five_lz4_s2_emit_copy_short:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVWU R9, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BHS emit_copy_three_lz4_s2
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R8, 1(R0)
|
|
LSRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R7, R7
|
|
MOVB R7, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R0)
|
|
MOVH R8, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4_s2_loop
|
|
|
|
lz4_s2_done:
|
|
MOVD dst_base+0(FP), R1
|
|
SUB R1, R0, R0
|
|
MOVD R5, uncompressed+48(FP)
|
|
MOVD R0, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4_s2_corrupt:
|
|
MOVD $0, R0
|
|
SUB $1, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4_s2_dstfull:
|
|
MOVD $0, R0
|
|
SUB $2, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4sBlockAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4sBlockAsm(SB), NOSPLIT, $0-64
|
|
MOVD $0, R5
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD dst_len+8(FP), R1
|
|
MOVD src_base+24(FP), R2
|
|
MOVD src_len+32(FP), R3
|
|
ADD R3, R2, R3
|
|
ADD R1, R0, R1
|
|
SUB $8, R1, R1
|
|
MOVD $0, R6
|
|
|
|
lz4s_s2_loop:
|
|
CMP R3, R2
|
|
BHS lz4s_s2_corrupt
|
|
CMP R1, R0
|
|
BHS lz4s_s2_dstfull
|
|
MOVBU (R2), R7
|
|
MOVD R7, R8
|
|
MOVD R7, R9
|
|
LSR $0x04, R8, R8
|
|
AND $0x0f, R9, R9
|
|
CMP $0xf0, R7
|
|
BLO lz4s_s2_ll_end
|
|
|
|
lz4s_s2_ll_loop:
|
|
ADD $1, R2, R2
|
|
CMP R3, R2
|
|
BHS lz4s_s2_corrupt
|
|
MOVBU (R2), R7
|
|
ADD R7, R8, R8
|
|
CMP $0xff, R7
|
|
BEQ lz4s_s2_ll_loop
|
|
|
|
lz4s_s2_ll_end:
|
|
ADD R8, R2, R7
|
|
ADD $0x03, R9, R9
|
|
CMP R3, R7
|
|
BHS lz4s_s2_corrupt
|
|
ADD $1, R2, R2
|
|
ADD $1, R7, R7
|
|
TST R8, R8
|
|
BEQ lz4s_s2_lits_done
|
|
ADD R8, R0, R10
|
|
CMP R1, R10
|
|
BHS lz4s_s2_dstfull
|
|
ADD R8, R5, R5
|
|
SUB $1, R8, R10
|
|
MOVWU R10, R10
|
|
CMPW $0x3c, R10
|
|
BLO one_byte_lz4s_s2
|
|
CMPW $0x00000100, R10
|
|
BLO two_bytes_lz4s_s2
|
|
CMPW $0x00010000, R10
|
|
BLO three_bytes_lz4s_s2
|
|
CMPW $0x01000000, R10
|
|
BLO four_bytes_lz4s_s2
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R0)
|
|
MOVW R10, 1(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
four_bytes_lz4s_s2:
|
|
MOVWU R10, R11
|
|
LSRW $0x10, R11, R11
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R0)
|
|
MOVH R10, 1(R0)
|
|
MOVB R11, 3(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
three_bytes_lz4s_s2:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R0)
|
|
MOVH R10, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
two_bytes_lz4s_s2:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R0)
|
|
MOVB R10, 1(R0)
|
|
ADD $0x02, R0, R0
|
|
CMPW $0x40, R10
|
|
BLO memmove_lz4s_s2
|
|
JMP memmove_long_lz4s_s2
|
|
|
|
one_byte_lz4s_s2:
|
|
LSLW $0x02, R10, R16
|
|
BFI $0, R16, $8, R10
|
|
MOVB R10, (R0)
|
|
ADD $0x01, R0, R0
|
|
|
|
memmove_lz4s_s2:
|
|
ADD R8, R0, R10
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R8
|
|
BLS emit_lit_memmove_lz4s_s2_memmove_move_8
|
|
CMP $0x10, R8
|
|
BLS emit_lit_memmove_lz4s_s2_memmove_move_8through16
|
|
CMP $0x20, R8
|
|
BLS 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:
|
|
MOVD (R2), R11
|
|
MOVD R11, (R0)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_8through16:
|
|
MOVD (R2), R11
|
|
ADD R8, R2, R15
|
|
MOVD -8(R15), R2
|
|
MOVD R11, (R0)
|
|
ADD R8, R0, R15
|
|
MOVD R2, -8(R15)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_17through32:
|
|
FMOVQ (R2), F0
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R0)
|
|
ADD R8, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_lz4s_s2
|
|
|
|
emit_lit_memmove_lz4s_s2_memmove_move_33through64:
|
|
FMOVQ (R2), F0
|
|
FMOVQ 16(R2), F1
|
|
ADD R8, R2, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R0)
|
|
FMOVQ F1, 16(R0)
|
|
ADD R8, R0, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R8, R0, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_lz4s_s2:
|
|
MOVD R10, R0
|
|
JMP lz4s_s2_lits_emit_done
|
|
|
|
memmove_long_lz4s_s2:
|
|
ADD R8, R0, R10
|
|
|
|
// genMemMoveLong
|
|
MOVD R2, R11
|
|
MOVD R0, R12
|
|
MOVD R8, R13
|
|
|
|
emit_lit_memmove_long_lz4s_s2large_big_loop_back:
|
|
FMOVQ (R11), F0
|
|
FMOVQ 16(R11), F1
|
|
FMOVQ F0, (R12)
|
|
FMOVQ F1, 16(R12)
|
|
ADD $0x20, R11, R11
|
|
ADD $0x20, R12, R12
|
|
SUB $0x20, R13, R13
|
|
CMP $0x20, R13
|
|
BHS emit_lit_memmove_long_lz4s_s2large_big_loop_back
|
|
ADD R8, R2, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R8, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R8, R0, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R8, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R10, R0
|
|
|
|
lz4s_s2_lits_emit_done:
|
|
MOVD R7, R2
|
|
|
|
lz4s_s2_lits_done:
|
|
CMP R3, R2
|
|
BNE lz4s_s2_match
|
|
CMP $0x03, R9
|
|
BEQ lz4s_s2_done
|
|
JMP lz4s_s2_corrupt
|
|
|
|
lz4s_s2_match:
|
|
CMP $0x03, R9
|
|
BEQ lz4s_s2_loop
|
|
ADD $2, R2, R7
|
|
CMP R3, R7
|
|
BHS lz4s_s2_corrupt
|
|
MOVHU (R2), R8
|
|
MOVD R7, R2
|
|
TST R8, R8
|
|
BEQ lz4s_s2_corrupt
|
|
CMP R5, R8
|
|
BHI lz4s_s2_corrupt
|
|
CMP $0x12, R9
|
|
BNE lz4s_s2_ml_done
|
|
|
|
lz4s_s2_ml_loop:
|
|
MOVBU (R2), R7
|
|
ADD $1, R2, R2
|
|
ADD R7, R9, R9
|
|
CMP R3, R2
|
|
BHS lz4s_s2_corrupt
|
|
CMP $0xff, R7
|
|
BEQ lz4s_s2_ml_loop
|
|
|
|
lz4s_s2_ml_done:
|
|
ADD R9, R5, R5
|
|
CMP R6, R8
|
|
BNE lz4s_s2_docopy
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2
|
|
|
|
cant_repeat_two_offset_lz4_s2:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2
|
|
|
|
repeat_five_lz4_s2:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
lz4s_s2_docopy:
|
|
MOVD R8, R6
|
|
|
|
// emitCopy
|
|
CMPW $0x40, R9
|
|
BLS two_byte_offset_short_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BHS long_offset_short_lz4_s2
|
|
MOVD $0x00000001, R7
|
|
ADD $16, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R8, 1(R0)
|
|
MOVWU R8, R10
|
|
LSRW $0x08, R10, R10
|
|
LSLW $0x05, R10, R10
|
|
ORRW R10, R7, R7
|
|
MOVB R7, (R0)
|
|
ADD $0x02, R0, R0
|
|
SUBW $0x08, R9, R9
|
|
|
|
// emitRepeat
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
JMP cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
emit_repeat_again_lz4_s2_emit_copy_short_2b:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2_emit_copy_short_2b
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2_emit_copy_short_2b
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2_emit_copy_short_2b
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short_2b
|
|
|
|
repeat_five_lz4_s2_emit_copy_short_2b:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short_2b:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short_2b:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short_2b:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short_2b:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
long_offset_short_lz4_s2:
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R8, 1(R0)
|
|
SUB $60, R9, R9
|
|
MOVWU R9, R9
|
|
ADD $0x03, R0, R0
|
|
|
|
// emitRepeat
|
|
emit_repeat_again_lz4_s2_emit_copy_short:
|
|
MOVWU R9, R7
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x08, R7
|
|
BLS repeat_two_lz4_s2_emit_copy_short
|
|
CMPW $0x0c, R7
|
|
BHS cant_repeat_two_offset_lz4_s2_emit_copy_short
|
|
CMPW $0x00000800, R8
|
|
BLO repeat_two_offset_lz4_s2_emit_copy_short
|
|
|
|
cant_repeat_two_offset_lz4_s2_emit_copy_short:
|
|
CMPW $0x00000104, R9
|
|
BLO repeat_three_lz4_s2_emit_copy_short
|
|
CMPW $0x00010100, R9
|
|
BLO repeat_four_lz4_s2_emit_copy_short
|
|
CMPW $0x0100ffff, R9
|
|
BLO repeat_five_lz4_s2_emit_copy_short
|
|
SUB $16842747, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0xfffb001d, R16
|
|
MOVW R16, (R0)
|
|
MOVD $0xff, R16
|
|
MOVB R16, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP emit_repeat_again_lz4_s2_emit_copy_short
|
|
|
|
repeat_five_lz4_s2_emit_copy_short:
|
|
SUB $65536, R9, R9
|
|
MOVWU R9, R9
|
|
MOVWU R9, R8
|
|
MOVD $0x001d, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ASRW $0x10, R8, R8
|
|
MOVB R8, 4(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_four_lz4_s2_emit_copy_short:
|
|
SUB $256, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0019, R16
|
|
MOVH R16, (R0)
|
|
MOVH R9, 2(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_three_lz4_s2_emit_copy_short:
|
|
SUB $4, R9, R9
|
|
MOVWU R9, R9
|
|
MOVD $0x0015, R16
|
|
MOVH R16, (R0)
|
|
MOVB R9, 2(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_lz4_s2_emit_copy_short:
|
|
LSLW $0x02, R9, R9
|
|
ORRW $0x01, R9, R9
|
|
MOVH R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
repeat_two_offset_lz4_s2_emit_copy_short:
|
|
MOVD $0, R7
|
|
ADD R9<<2, R7, R9
|
|
ADD $1, R9, R9
|
|
MOVWU R9, R9
|
|
MOVB R8, 1(R0)
|
|
ASRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R9, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVWU R9, R7
|
|
LSLW $0x02, R7, R7
|
|
CMPW $0x0c, R9
|
|
BHS emit_copy_three_lz4_s2
|
|
CMPW $0x00000800, R8
|
|
BHS emit_copy_three_lz4_s2
|
|
SUB $15, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R8, 1(R0)
|
|
LSRW $0x08, R8, R8
|
|
LSLW $0x05, R8, R8
|
|
ORRW R8, R7, R7
|
|
MOVB R7, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
SUB $2, R7, R7
|
|
MOVWU R7, R7
|
|
MOVB R7, (R0)
|
|
MOVH R8, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4s_s2_loop
|
|
|
|
lz4s_s2_done:
|
|
MOVD dst_base+0(FP), R1
|
|
SUB R1, R0, R0
|
|
MOVD R5, uncompressed+48(FP)
|
|
MOVD R0, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4s_s2_corrupt:
|
|
MOVD $0, R0
|
|
SUB $1, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4s_s2_dstfull:
|
|
MOVD $0, R0
|
|
SUB $2, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4BlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4BlockSnappyAsm(SB), NOSPLIT, $0-64
|
|
MOVD $0, R5
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD dst_len+8(FP), R1
|
|
MOVD src_base+24(FP), R2
|
|
MOVD src_len+32(FP), R3
|
|
ADD R3, R2, R3
|
|
ADD R1, R0, R1
|
|
SUB $8, R1, R1
|
|
|
|
lz4_snappy_loop:
|
|
CMP R3, R2
|
|
BHS lz4_snappy_corrupt
|
|
CMP R1, R0
|
|
BHS lz4_snappy_dstfull
|
|
MOVBU (R2), R6
|
|
MOVD R6, R7
|
|
MOVD R6, R8
|
|
LSR $0x04, R7, R7
|
|
AND $0x0f, R8, R8
|
|
CMP $0xf0, R6
|
|
BLO lz4_snappy_ll_end
|
|
|
|
lz4_snappy_ll_loop:
|
|
ADD $1, R2, R2
|
|
CMP R3, R2
|
|
BHS lz4_snappy_corrupt
|
|
MOVBU (R2), R6
|
|
ADD R6, R7, R7
|
|
CMP $0xff, R6
|
|
BEQ lz4_snappy_ll_loop
|
|
|
|
lz4_snappy_ll_end:
|
|
ADD R7, R2, R6
|
|
ADD $0x04, R8, R8
|
|
CMP R3, R6
|
|
BHS lz4_snappy_corrupt
|
|
ADD $1, R2, R2
|
|
ADD $1, R6, R6
|
|
TST R7, R7
|
|
BEQ lz4_snappy_lits_done
|
|
ADD R7, R0, R9
|
|
CMP R1, R9
|
|
BHS lz4_snappy_dstfull
|
|
ADD R7, R5, R5
|
|
SUB $1, R7, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x3c, R9
|
|
BLO one_byte_lz4_snappy
|
|
CMPW $0x00000100, R9
|
|
BLO two_bytes_lz4_snappy
|
|
CMPW $0x00010000, R9
|
|
BLO three_bytes_lz4_snappy
|
|
CMPW $0x01000000, R9
|
|
BLO four_bytes_lz4_snappy
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R0)
|
|
MOVW R9, 1(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
four_bytes_lz4_snappy:
|
|
MOVWU R9, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R0)
|
|
MOVH R9, 1(R0)
|
|
MOVB R10, 3(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
three_bytes_lz4_snappy:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R0)
|
|
MOVH R9, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
two_bytes_lz4_snappy:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R0)
|
|
MOVB R9, 1(R0)
|
|
ADD $0x02, R0, R0
|
|
CMPW $0x40, R9
|
|
BLO memmove_lz4_snappy
|
|
JMP memmove_long_lz4_snappy
|
|
|
|
one_byte_lz4_snappy:
|
|
LSLW $0x02, R9, R16
|
|
BFI $0, R16, $8, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x01, R0, R0
|
|
|
|
memmove_lz4_snappy:
|
|
ADD R7, R0, R9
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_lz4_snappy_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_lz4_snappy_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R2), R10
|
|
MOVD R10, (R0)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_8through16:
|
|
MOVD (R2), R10
|
|
ADD R7, R2, R15
|
|
MOVD -8(R15), R2
|
|
MOVD R10, (R0)
|
|
ADD R7, R0, R15
|
|
MOVD R2, -8(R15)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_17through32:
|
|
FMOVQ (R2), F0
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R0)
|
|
ADD R7, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_lz4_snappy
|
|
|
|
emit_lit_memmove_lz4_snappy_memmove_move_33through64:
|
|
FMOVQ (R2), F0
|
|
FMOVQ 16(R2), F1
|
|
ADD R7, R2, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R0)
|
|
FMOVQ F1, 16(R0)
|
|
ADD R7, R0, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R0, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_lz4_snappy:
|
|
MOVD R9, R0
|
|
JMP lz4_snappy_lits_emit_done
|
|
|
|
memmove_long_lz4_snappy:
|
|
ADD R7, R0, R9
|
|
|
|
// genMemMoveLong
|
|
MOVD R2, R10
|
|
MOVD R0, R11
|
|
MOVD R7, R12
|
|
|
|
emit_lit_memmove_long_lz4_snappylarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_lz4_snappylarge_big_loop_back
|
|
ADD R7, R2, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R0, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R9, R0
|
|
|
|
lz4_snappy_lits_emit_done:
|
|
MOVD R6, R2
|
|
|
|
lz4_snappy_lits_done:
|
|
CMP R3, R2
|
|
BNE lz4_snappy_match
|
|
CMP $0x04, R8
|
|
BEQ lz4_snappy_done
|
|
JMP lz4_snappy_corrupt
|
|
|
|
lz4_snappy_match:
|
|
ADD $2, R2, R6
|
|
CMP R3, R6
|
|
BHS lz4_snappy_corrupt
|
|
MOVHU (R2), R7
|
|
MOVD R6, R2
|
|
TST R7, R7
|
|
BEQ lz4_snappy_corrupt
|
|
CMP R5, R7
|
|
BHI lz4_snappy_corrupt
|
|
CMP $0x13, R8
|
|
BNE lz4_snappy_ml_done
|
|
|
|
lz4_snappy_ml_loop:
|
|
MOVBU (R2), R6
|
|
ADD $1, R2, R2
|
|
ADD R6, R8, R8
|
|
CMP R3, R2
|
|
BHS lz4_snappy_corrupt
|
|
CMP $0xff, R6
|
|
BEQ lz4_snappy_ml_loop
|
|
|
|
lz4_snappy_ml_done:
|
|
ADD R8, R5, R5
|
|
|
|
// emitCopy
|
|
two_byte_offset_lz4_s2:
|
|
CMPW $0x40, R8
|
|
BLS two_byte_offset_short_lz4_s2
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R7, 1(R0)
|
|
SUB $60, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $0x03, R0, R0
|
|
CMP R1, R0
|
|
BHS lz4_snappy_loop
|
|
JMP two_byte_offset_lz4_s2
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVWU R8, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R8
|
|
BHS emit_copy_three_lz4_s2
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_lz4_s2
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R7, 1(R0)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R6, R6
|
|
MOVB R6, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4_snappy_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R0)
|
|
MOVH R7, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4_snappy_loop
|
|
|
|
lz4_snappy_done:
|
|
MOVD dst_base+0(FP), R1
|
|
SUB R1, R0, R0
|
|
MOVD R5, uncompressed+48(FP)
|
|
MOVD R0, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4_snappy_corrupt:
|
|
MOVD $0, R0
|
|
SUB $1, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4_snappy_dstfull:
|
|
MOVD $0, R0
|
|
SUB $2, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
// func cvtLZ4sBlockSnappyAsm(dst []byte, src []byte) (uncompressed int, dstUsed int)
|
|
// Requires: SSE2
|
|
TEXT ·cvtLZ4sBlockSnappyAsm(SB), NOSPLIT, $0-64
|
|
MOVD $0, R5
|
|
MOVD dst_base+0(FP), R0
|
|
MOVD dst_len+8(FP), R1
|
|
MOVD src_base+24(FP), R2
|
|
MOVD src_len+32(FP), R3
|
|
ADD R3, R2, R3
|
|
ADD R1, R0, R1
|
|
SUB $8, R1, R1
|
|
|
|
lz4s_snappy_loop:
|
|
CMP R3, R2
|
|
BHS lz4s_snappy_corrupt
|
|
CMP R1, R0
|
|
BHS lz4s_snappy_dstfull
|
|
MOVBU (R2), R6
|
|
MOVD R6, R7
|
|
MOVD R6, R8
|
|
LSR $0x04, R7, R7
|
|
AND $0x0f, R8, R8
|
|
CMP $0xf0, R6
|
|
BLO lz4s_snappy_ll_end
|
|
|
|
lz4s_snappy_ll_loop:
|
|
ADD $1, R2, R2
|
|
CMP R3, R2
|
|
BHS lz4s_snappy_corrupt
|
|
MOVBU (R2), R6
|
|
ADD R6, R7, R7
|
|
CMP $0xff, R6
|
|
BEQ lz4s_snappy_ll_loop
|
|
|
|
lz4s_snappy_ll_end:
|
|
ADD R7, R2, R6
|
|
ADD $0x03, R8, R8
|
|
CMP R3, R6
|
|
BHS lz4s_snappy_corrupt
|
|
ADD $1, R2, R2
|
|
ADD $1, R6, R6
|
|
TST R7, R7
|
|
BEQ lz4s_snappy_lits_done
|
|
ADD R7, R0, R9
|
|
CMP R1, R9
|
|
BHS lz4s_snappy_dstfull
|
|
ADD R7, R5, R5
|
|
SUB $1, R7, R9
|
|
MOVWU R9, R9
|
|
CMPW $0x3c, R9
|
|
BLO one_byte_lz4s_snappy
|
|
CMPW $0x00000100, R9
|
|
BLO two_bytes_lz4s_snappy
|
|
CMPW $0x00010000, R9
|
|
BLO three_bytes_lz4s_snappy
|
|
CMPW $0x01000000, R9
|
|
BLO four_bytes_lz4s_snappy
|
|
MOVD $0xfc, R16
|
|
MOVB R16, (R0)
|
|
MOVW R9, 1(R0)
|
|
ADD $0x05, R0, R0
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
four_bytes_lz4s_snappy:
|
|
MOVWU R9, R10
|
|
LSRW $0x10, R10, R10
|
|
MOVD $0xf8, R16
|
|
MOVB R16, (R0)
|
|
MOVH R9, 1(R0)
|
|
MOVB R10, 3(R0)
|
|
ADD $0x04, R0, R0
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
three_bytes_lz4s_snappy:
|
|
MOVD $0xf4, R16
|
|
MOVB R16, (R0)
|
|
MOVH R9, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
two_bytes_lz4s_snappy:
|
|
MOVD $0xf0, R16
|
|
MOVB R16, (R0)
|
|
MOVB R9, 1(R0)
|
|
ADD $0x02, R0, R0
|
|
CMPW $0x40, R9
|
|
BLO memmove_lz4s_snappy
|
|
JMP memmove_long_lz4s_snappy
|
|
|
|
one_byte_lz4s_snappy:
|
|
LSLW $0x02, R9, R16
|
|
BFI $0, R16, $8, R9
|
|
MOVB R9, (R0)
|
|
ADD $0x01, R0, R0
|
|
|
|
memmove_lz4s_snappy:
|
|
ADD R7, R0, R9
|
|
|
|
// genMemMoveShort
|
|
CMP $0x08, R7
|
|
BLS emit_lit_memmove_lz4s_snappy_memmove_move_8
|
|
CMP $0x10, R7
|
|
BLS emit_lit_memmove_lz4s_snappy_memmove_move_8through16
|
|
CMP $0x20, R7
|
|
BLS 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:
|
|
MOVD (R2), R10
|
|
MOVD R10, (R0)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_8through16:
|
|
MOVD (R2), R10
|
|
ADD R7, R2, R15
|
|
MOVD -8(R15), R2
|
|
MOVD R10, (R0)
|
|
ADD R7, R0, R15
|
|
MOVD R2, -8(R15)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_17through32:
|
|
FMOVQ (R2), F0
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
FMOVQ F0, (R0)
|
|
ADD R7, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
JMP memmove_end_copy_lz4s_snappy
|
|
|
|
emit_lit_memmove_lz4s_snappy_memmove_move_33through64:
|
|
FMOVQ (R2), F0
|
|
FMOVQ 16(R2), F1
|
|
ADD R7, R2, R15
|
|
FMOVQ -32(R15), F2
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F3
|
|
FMOVQ F0, (R0)
|
|
FMOVQ F1, 16(R0)
|
|
ADD R7, R0, R15
|
|
FMOVQ F2, -32(R15)
|
|
ADD R7, R0, R15
|
|
FMOVQ F3, -16(R15)
|
|
|
|
memmove_end_copy_lz4s_snappy:
|
|
MOVD R9, R0
|
|
JMP lz4s_snappy_lits_emit_done
|
|
|
|
memmove_long_lz4s_snappy:
|
|
ADD R7, R0, R9
|
|
|
|
// genMemMoveLong
|
|
MOVD R2, R10
|
|
MOVD R0, R11
|
|
MOVD R7, R12
|
|
|
|
emit_lit_memmove_long_lz4s_snappylarge_big_loop_back:
|
|
FMOVQ (R10), F0
|
|
FMOVQ 16(R10), F1
|
|
FMOVQ F0, (R11)
|
|
FMOVQ F1, 16(R11)
|
|
ADD $0x20, R10, R10
|
|
ADD $0x20, R11, R11
|
|
SUB $0x20, R12, R12
|
|
CMP $0x20, R12
|
|
BHS emit_lit_memmove_long_lz4s_snappylarge_big_loop_back
|
|
ADD R7, R2, R15
|
|
FMOVQ -32(R15), F0
|
|
ADD R7, R2, R15
|
|
FMOVQ -16(R15), F1
|
|
ADD R7, R0, R15
|
|
FMOVQ F0, -32(R15)
|
|
ADD R7, R0, R15
|
|
FMOVQ F1, -16(R15)
|
|
MOVD R9, R0
|
|
|
|
lz4s_snappy_lits_emit_done:
|
|
MOVD R6, R2
|
|
|
|
lz4s_snappy_lits_done:
|
|
CMP R3, R2
|
|
BNE lz4s_snappy_match
|
|
CMP $0x03, R8
|
|
BEQ lz4s_snappy_done
|
|
JMP lz4s_snappy_corrupt
|
|
|
|
lz4s_snappy_match:
|
|
CMP $0x03, R8
|
|
BEQ lz4s_snappy_loop
|
|
ADD $2, R2, R6
|
|
CMP R3, R6
|
|
BHS lz4s_snappy_corrupt
|
|
MOVHU (R2), R7
|
|
MOVD R6, R2
|
|
TST R7, R7
|
|
BEQ lz4s_snappy_corrupt
|
|
CMP R5, R7
|
|
BHI lz4s_snappy_corrupt
|
|
CMP $0x12, R8
|
|
BNE lz4s_snappy_ml_done
|
|
|
|
lz4s_snappy_ml_loop:
|
|
MOVBU (R2), R6
|
|
ADD $1, R2, R2
|
|
ADD R6, R8, R8
|
|
CMP R3, R2
|
|
BHS lz4s_snappy_corrupt
|
|
CMP $0xff, R6
|
|
BEQ lz4s_snappy_ml_loop
|
|
|
|
lz4s_snappy_ml_done:
|
|
ADD R8, R5, R5
|
|
|
|
// emitCopy
|
|
two_byte_offset_lz4_s2:
|
|
CMPW $0x40, R8
|
|
BLS two_byte_offset_short_lz4_s2
|
|
MOVD $0xee, R16
|
|
MOVB R16, (R0)
|
|
MOVH R7, 1(R0)
|
|
SUB $60, R8, R8
|
|
MOVWU R8, R8
|
|
ADD $0x03, R0, R0
|
|
CMP R1, R0
|
|
BHS lz4s_snappy_loop
|
|
JMP two_byte_offset_lz4_s2
|
|
|
|
two_byte_offset_short_lz4_s2:
|
|
MOVWU R8, R6
|
|
LSLW $0x02, R6, R6
|
|
CMPW $0x0c, R8
|
|
BHS emit_copy_three_lz4_s2
|
|
CMPW $0x00000800, R7
|
|
BHS emit_copy_three_lz4_s2
|
|
SUB $15, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R7, 1(R0)
|
|
LSRW $0x08, R7, R7
|
|
LSLW $0x05, R7, R7
|
|
ORRW R7, R6, R6
|
|
MOVB R6, (R0)
|
|
ADD $0x02, R0, R0
|
|
JMP lz4s_snappy_loop
|
|
|
|
emit_copy_three_lz4_s2:
|
|
SUB $2, R6, R6
|
|
MOVWU R6, R6
|
|
MOVB R6, (R0)
|
|
MOVH R7, 1(R0)
|
|
ADD $0x03, R0, R0
|
|
JMP lz4s_snappy_loop
|
|
|
|
lz4s_snappy_done:
|
|
MOVD dst_base+0(FP), R1
|
|
SUB R1, R0, R0
|
|
MOVD R5, uncompressed+48(FP)
|
|
MOVD R0, dstUsed+56(FP)
|
|
RET
|
|
|
|
lz4s_snappy_corrupt:
|
|
MOVD $0, R0
|
|
SUB $1, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|
|
|
|
lz4s_snappy_dstfull:
|
|
MOVD $0, R0
|
|
SUB $2, R0, R5
|
|
MOVD R5, uncompressed+48(FP)
|
|
RET
|