Files
opencloud/vendor/github.com/klauspost/compress/zstd/seqdec_arm64.s
T
Jörn Friedrich Dreyer 076a3b0212 build(deps): bump go-micro to v4.11.4-0.20260929213538-cd412c159a26
Point the go-micro.dev/v4 replace at the latest main-v4 maintenance
branch commit in butonic/go-micro (cd412c15) instead of the v4.11.3
tag. The new base is upstream v4.11.1 plus the registry cache
node-TTL fixes (upstream #2715, #2736, #2740), the concurrent map
access fix (upstream #2794), plus further dependency updates and test
fixes on the maintenance branch.

The branch also modernizes go-micro's own go.mod (go 1.26, lego,
dario.cat/mergo v1, x/deque v2, ...), and MVS pulls the aligned
versions into this module: lego v4.35.2 -> lego/v5 v5.5.2,
go-jose/go-jose/v4 -> v4.1.5, gofrs/flock -> v0.13.1,
mattn/go-isatty -> v0.0.24, go.uber.org/zap -> v1.28.0, x/net ->
0.59.0, miekg/dns -> 1.1.73, moby api/client, ProtonMail/go-crypto
-> 1.5.2, klauspost/compress -> 1.20.1, gorilla/handlers -> 1.5.2,
gobwas/ws -> 1.4.0, nxadm/tail -> 1.4.11, ...

Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2026-10-01 11:14:15 +02:00

2588 lines
50 KiB
ArmAsm

// Code generated by command: go run gen.go -out ../seqdec.s -arch amd64,arm64 -pkg=zstd. DO NOT EDIT.
// EXPERIMENTAL arm64 output lowered from an amd64 avo program.
//go:build arm64 && (!appengine && !noasm && gc && !noasm)
// func sequenceDecs_decode_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
// Requires: CMOV
TEXT ·sequenceDecs_decode_arm64(SB), $40-32
MOVD br+8(FP), R1
MOVD 24(R1), R2
MOVBU 40(R1), R3
MOVD (R1), R0
MOVD 32(R1), R5
ADD R5, R0, R0
MOVD R0, 8(RSP)
MOVD ctx+16(FP), R0
MOVD 72(R0), R6
MOVD 80(R0), R7
MOVD 88(R0), R8
MOVD (R0), R1
MOVD R1, 16(RSP)
MOVD 24(R0), R1
MOVD R1, 24(RSP)
MOVD 48(R0), R1
MOVD R1, 32(RSP)
MOVD 96(R0), R1
MOVD R1, 40(RSP)
MOVD 104(R0), R9
MOVD s+0(FP), R0
MOVD 144(R0), R10
MOVD 152(R0), R11
MOVD 160(R0), R12
sequenceDecs_decode_amd64_main_loop:
MOVD 8(RSP), R13
// Fill bitreader to have enough for the offset and match length.
CMP $0x08, R5
BLT sequenceDecs_decode_amd64_fill_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R13, R13
MOVD (R13), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decode_amd64_fill_end
sequenceDecs_decode_amd64_fill_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decode_amd64_fill_check_overread
CMP $0x07, R3
BLE sequenceDecs_decode_amd64_fill_end
LSL $0x08, R2, R2
SUB $0x01, R13, R13
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R13), R0
ORR R0, R2, R2
JMP sequenceDecs_decode_amd64_fill_byte_by_byte
sequenceDecs_decode_amd64_fill_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decode_amd64_fill_end:
// Update offset
MOVD R8, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, 16(R9)
// Update match length
MOVD R7, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, 8(R9)
// Fill bitreader to have enough for the remaining
CMP $0x08, R5
BLT sequenceDecs_decode_amd64_fill_2_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R13, R13
MOVD (R13), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decode_amd64_fill_2_end
sequenceDecs_decode_amd64_fill_2_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decode_amd64_fill_2_check_overread
CMP $0x07, R3
BLE sequenceDecs_decode_amd64_fill_2_end
LSL $0x08, R2, R2
SUB $0x01, R13, R13
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R13), R0
ORR R0, R2, R2
JMP sequenceDecs_decode_amd64_fill_2_byte_by_byte
sequenceDecs_decode_amd64_fill_2_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decode_amd64_fill_2_end:
// Update literal length
MOVD R6, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, (R9)
// Fill bitreader for state updates
MOVD R13, 8(RSP)
UBFX $8, R8, $8, R0
MOVD 40(RSP), R16
CMP $0x00, R16
BEQ sequenceDecs_decode_amd64_skip_update
// Update Literal Length State
MOVBU R6, R13
LSRW $0x10, R6, R6
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R6, R6
// Load ctx.llTable
MOVD 16(RSP), R1
MOVD (R1)(R6<<3), R6
// Update Match Length State
MOVBU R7, R13
LSRW $0x10, R7, R7
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R7, R7
// Load ctx.mlTable
MOVD 24(RSP), R1
MOVD (R1)(R7<<3), R7
// Update Offset State
MOVBU R8, R13
LSRW $0x10, R8, R8
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R8, R8
// Load ctx.ofTable
MOVD 32(RSP), R1
MOVD (R1)(R8<<3), R8
sequenceDecs_decode_amd64_skip_update:
// Adjust offset
MOVD 16(R9), R1
CMP $0x01, R0
BLS sequenceDecs_decode_amd64_adjust_offsetB_1_or_0
MOVD R11, R12
MOVD R10, R11
MOVD R1, R10
JMP sequenceDecs_decode_amd64_after_adjust
sequenceDecs_decode_amd64_adjust_offsetB_1_or_0:
MOVD (R9), R16
CMP $0x00000000, R16
BNE sequenceDecs_decode_amd64_adjust_offset_maybezero
ADD $1, R1, R1
JMP sequenceDecs_decode_amd64_adjust_offset_nonzero
sequenceDecs_decode_amd64_adjust_offset_maybezero:
TST R1, R1
BNE sequenceDecs_decode_amd64_adjust_offset_nonzero
MOVD R10, R1
JMP sequenceDecs_decode_amd64_after_adjust
sequenceDecs_decode_amd64_adjust_offset_nonzero:
CMP $0x01, R1
BLO sequenceDecs_decode_amd64_adjust_zero
BEQ sequenceDecs_decode_amd64_adjust_one
CMP $0x02, R1
BHI sequenceDecs_decode_amd64_adjust_three
JMP sequenceDecs_decode_amd64_adjust_two
sequenceDecs_decode_amd64_adjust_zero:
MOVD R10, R0
JMP sequenceDecs_decode_amd64_adjust_test_temp_valid
sequenceDecs_decode_amd64_adjust_one:
MOVD R11, R0
JMP sequenceDecs_decode_amd64_adjust_test_temp_valid
sequenceDecs_decode_amd64_adjust_two:
MOVD R12, R0
JMP sequenceDecs_decode_amd64_adjust_test_temp_valid
sequenceDecs_decode_amd64_adjust_three:
SUB $1, R10, R0
sequenceDecs_decode_amd64_adjust_test_temp_valid:
TST R0, R0
BNE sequenceDecs_decode_amd64_adjust_temp_valid
MOVD $0x00000001, R0
sequenceDecs_decode_amd64_adjust_temp_valid:
CMP $0x01, R1
CSEL NE, R11, R12, R12
MOVD R10, R11
MOVD R0, R10
MOVD R0, R1
sequenceDecs_decode_amd64_after_adjust:
MOVD R1, 16(R9)
// Check values
MOVD 8(R9), R0
MOVD (R9), R13
ADD R13, R0, R14
MOVD s+0(FP), R4
MOVD 256(R4), R16
ADD R14, R16, R16
MOVD R16, 256(R4)
MOVD ctx+16(FP), R14
MOVD 128(R14), R16
SUBS R13, R16, R16
MOVD R16, 128(R14)
BMI error_not_enough_literals
CMP $0x00020002, R0
BHI sequenceDecs_decode_amd64_error_match_len_too_big
TST R1, R1
BNE sequenceDecs_decode_amd64_match_len_ofs_ok
TST R0, R0
BNE sequenceDecs_decode_amd64_error_match_len_ofs_mismatch
sequenceDecs_decode_amd64_match_len_ofs_ok:
ADD $0x18, R9, R9
MOVD 40(RSP), R16
SUBS $1, R16, R16
MOVD R16, 40(RSP)
BPL sequenceDecs_decode_amd64_main_loop
MOVD s+0(FP), R0
MOVD R10, 144(R0)
MOVD R11, 152(R0)
MOVD R12, 160(R0)
MOVD br+8(FP), R0
MOVD R2, 24(R0)
MOVB R3, 40(R0)
MOVD R5, 32(R0)
// Return success
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000000, R16
MOVD R16, ret+24(FP)
RET
// Return with match length error
sequenceDecs_decode_amd64_error_match_len_ofs_mismatch:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000001, R16
MOVD R16, ret+24(FP)
RET
// Return with match too long error
sequenceDecs_decode_amd64_error_match_len_too_big:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000002, R16
MOVD R16, ret+24(FP)
RET
// Return with match offset too long error
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000003, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough literals error
error_not_enough_literals:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000004, R16
MOVD R16, ret+24(FP)
RET
// Return with overread error
error_overread:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000006, R16
MOVD R16, ret+24(FP)
RET
// func sequenceDecs_decode_56_amd64(s *sequenceDecs, br *bitReader, ctx *decodeAsmContext) int
// Requires: CMOV
TEXT ·sequenceDecs_decode_56_arm64(SB), $40-32
MOVD br+8(FP), R1
MOVD 24(R1), R2
MOVBU 40(R1), R3
MOVD (R1), R0
MOVD 32(R1), R5
ADD R5, R0, R0
MOVD R0, 8(RSP)
MOVD ctx+16(FP), R0
MOVD 72(R0), R6
MOVD 80(R0), R7
MOVD 88(R0), R8
MOVD (R0), R1
MOVD R1, 16(RSP)
MOVD 24(R0), R1
MOVD R1, 24(RSP)
MOVD 48(R0), R1
MOVD R1, 32(RSP)
MOVD 96(R0), R1
MOVD R1, 40(RSP)
MOVD 104(R0), R9
MOVD s+0(FP), R0
MOVD 144(R0), R10
MOVD 152(R0), R11
MOVD 160(R0), R12
sequenceDecs_decode_56_amd64_main_loop:
MOVD 8(RSP), R13
// Fill bitreader to have enough for the offset and match length.
CMP $0x08, R5
BLT sequenceDecs_decode_56_amd64_fill_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R13, R13
MOVD (R13), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decode_56_amd64_fill_end
sequenceDecs_decode_56_amd64_fill_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decode_56_amd64_fill_check_overread
CMP $0x07, R3
BLE sequenceDecs_decode_56_amd64_fill_end
LSL $0x08, R2, R2
SUB $0x01, R13, R13
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R13), R0
ORR R0, R2, R2
JMP sequenceDecs_decode_56_amd64_fill_byte_by_byte
sequenceDecs_decode_56_amd64_fill_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decode_56_amd64_fill_end:
// Update offset
MOVD R8, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, 16(R9)
// Update match length
MOVD R7, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, 8(R9)
// Update literal length
MOVD R6, R0
LSL R3, R2, R14
LSR $0x01, R14, R14
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R14, R14
ADD R14, R0, R0
MOVD R0, (R9)
// Fill bitreader for state updates
MOVD R13, 8(RSP)
UBFX $8, R8, $8, R0
MOVD 40(RSP), R16
CMP $0x00, R16
BEQ sequenceDecs_decode_56_amd64_skip_update
// Update Literal Length State
MOVBU R6, R13
LSRW $0x10, R6, R6
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R6, R6
// Load ctx.llTable
MOVD 16(RSP), R1
MOVD (R1)(R6<<3), R6
// Update Match Length State
MOVBU R7, R13
LSRW $0x10, R7, R7
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R7, R7
// Load ctx.mlTable
MOVD 24(RSP), R1
MOVD (R1)(R7<<3), R7
// Update Offset State
MOVBU R8, R13
LSRW $0x10, R8, R8
LSL R3, R2, R14
LSR $0x01, R14, R14
ADD R13, R3, R3
EOR $0x3f, R13, R13
LSR R13, R14, R14
ADD R14, R8, R8
// Load ctx.ofTable
MOVD 32(RSP), R1
MOVD (R1)(R8<<3), R8
sequenceDecs_decode_56_amd64_skip_update:
// Adjust offset
MOVD 16(R9), R1
CMP $0x01, R0
BLS sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0
MOVD R11, R12
MOVD R10, R11
MOVD R1, R10
JMP sequenceDecs_decode_56_amd64_after_adjust
sequenceDecs_decode_56_amd64_adjust_offsetB_1_or_0:
MOVD (R9), R16
CMP $0x00000000, R16
BNE sequenceDecs_decode_56_amd64_adjust_offset_maybezero
ADD $1, R1, R1
JMP sequenceDecs_decode_56_amd64_adjust_offset_nonzero
sequenceDecs_decode_56_amd64_adjust_offset_maybezero:
TST R1, R1
BNE sequenceDecs_decode_56_amd64_adjust_offset_nonzero
MOVD R10, R1
JMP sequenceDecs_decode_56_amd64_after_adjust
sequenceDecs_decode_56_amd64_adjust_offset_nonzero:
CMP $0x01, R1
BLO sequenceDecs_decode_56_amd64_adjust_zero
BEQ sequenceDecs_decode_56_amd64_adjust_one
CMP $0x02, R1
BHI sequenceDecs_decode_56_amd64_adjust_three
JMP sequenceDecs_decode_56_amd64_adjust_two
sequenceDecs_decode_56_amd64_adjust_zero:
MOVD R10, R0
JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid
sequenceDecs_decode_56_amd64_adjust_one:
MOVD R11, R0
JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid
sequenceDecs_decode_56_amd64_adjust_two:
MOVD R12, R0
JMP sequenceDecs_decode_56_amd64_adjust_test_temp_valid
sequenceDecs_decode_56_amd64_adjust_three:
SUB $1, R10, R0
sequenceDecs_decode_56_amd64_adjust_test_temp_valid:
TST R0, R0
BNE sequenceDecs_decode_56_amd64_adjust_temp_valid
MOVD $0x00000001, R0
sequenceDecs_decode_56_amd64_adjust_temp_valid:
CMP $0x01, R1
CSEL NE, R11, R12, R12
MOVD R10, R11
MOVD R0, R10
MOVD R0, R1
sequenceDecs_decode_56_amd64_after_adjust:
MOVD R1, 16(R9)
// Check values
MOVD 8(R9), R0
MOVD (R9), R13
ADD R13, R0, R14
MOVD s+0(FP), R4
MOVD 256(R4), R16
ADD R14, R16, R16
MOVD R16, 256(R4)
MOVD ctx+16(FP), R14
MOVD 128(R14), R16
SUBS R13, R16, R16
MOVD R16, 128(R14)
BMI error_not_enough_literals
CMP $0x00020002, R0
BHI sequenceDecs_decode_56_amd64_error_match_len_too_big
TST R1, R1
BNE sequenceDecs_decode_56_amd64_match_len_ofs_ok
TST R0, R0
BNE sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch
sequenceDecs_decode_56_amd64_match_len_ofs_ok:
ADD $0x18, R9, R9
MOVD 40(RSP), R16
SUBS $1, R16, R16
MOVD R16, 40(RSP)
BPL sequenceDecs_decode_56_amd64_main_loop
MOVD s+0(FP), R0
MOVD R10, 144(R0)
MOVD R11, 152(R0)
MOVD R12, 160(R0)
MOVD br+8(FP), R0
MOVD R2, 24(R0)
MOVB R3, 40(R0)
MOVD R5, 32(R0)
// Return success
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000000, R16
MOVD R16, ret+24(FP)
RET
// Return with match length error
sequenceDecs_decode_56_amd64_error_match_len_ofs_mismatch:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000001, R16
MOVD R16, ret+24(FP)
RET
// Return with match too long error
sequenceDecs_decode_56_amd64_error_match_len_too_big:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000002, R16
MOVD R16, ret+24(FP)
RET
// Return with match offset too long error
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000003, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough literals error
error_not_enough_literals:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000004, R16
MOVD R16, ret+24(FP)
RET
// Return with overread error
error_overread:
MOVD 40(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 96(R1)
MOVD $0x00000006, R16
MOVD R16, ret+24(FP)
RET
// skipped sequenceDecs_decode_bmi2 (generic twin preferred on arm64)
// skipped sequenceDecs_decode_56_bmi2 (generic twin preferred on arm64)
// func sequenceDecs_executeSimple_amd64(ctx *executeAsmContext) bool
// Requires: SSE
TEXT ·sequenceDecs_executeSimple_arm64(SB), $8-9
MOVD ctx+0(FP), R9
MOVD 8(R9), R1
TST R1, R1
BEQ empty_seqs
MOVD (R9), R0
MOVD 24(R9), R2
MOVD 32(R9), R3
MOVD 80(R9), R5
MOVD 104(R9), R6
MOVD 120(R9), R7
MOVD 56(R9), R8
MOVD 64(R9), R9
ADD R9, R8, R8
// seqsBase += 24 * seqIndex
ADD R2<<1, R2, R10
LSL $0x03, R10, R10
ADD R10, R0, R0
// outBase += outPosition
ADD R6, R3, R3
main_loop:
MOVD (R0), R10
MOVD 16(R0), R11
MOVD 8(R0), R12
// Copy literals
FMOVQ (R5), F0
FMOVQ F0, (R3)
CMP $0x10, R10
BLS copy_1_end
MOVD $0x00000010, R13
copy_1:
ADD R13, R5, R15
FMOVQ (R15), F0
ADD R13, R3, R15
FMOVQ F0, (R15)
ADD $0x10, R13, R13
CMP R10, R13
BLO copy_1
copy_1_end:
ADD R10, R5, R5
ADD R10, R3, R3
ADD R10, R6, R6
// Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize)
ADD R9, R6, R10
CMP R10, R11
BGT error_match_off_too_big
CMP R7, R11
BGT error_match_off_too_big
// Copy match from history
MOVD R11, R10
SUBS R6, R10, R10
BLS copy_match
MOVD R8, R13
SUB R10, R13, R13
CMP R10, R12
BGT copy_all_from_history
MOVD R12, R10
SUBS $0x10, R10, R10
BLO copy_4_small
copy_4_loop:
FMOVQ (R13), F0
FMOVQ F0, (R3)
ADD $0x10, R13, R13
ADD $0x10, R3, R3
SUBS $0x10, R10, R10
BHS copy_4_loop
ADD R10, R13, R13
ADD $16, R13, R13
ADD R10, R3, R3
ADD $16, R3, R3
FMOVQ -16(R13), F0
FMOVQ F0, -16(R3)
JMP copy_4_end
copy_4_small:
CMP $0x03, R12
BEQ copy_4_move_3
CMP $0x08, R12
BLO copy_4_move_4through7
JMP copy_4_move_8through16
copy_4_move_3:
MOVHU (R13), R10
MOVBU 2(R13), R16
BFI $0, R16, $8, R11
MOVH R10, (R3)
MOVB R11, 2(R3)
ADD R12, R13, R13
ADD R12, R3, R3
JMP copy_4_end
copy_4_move_4through7:
MOVWU (R13), R10
ADD R12, R13, R15
MOVWU -4(R15), R11
MOVW R10, (R3)
ADD R12, R3, R15
MOVW R11, -4(R15)
ADD R12, R13, R13
ADD R12, R3, R3
JMP copy_4_end
copy_4_move_8through16:
MOVD (R13), R10
ADD R12, R13, R15
MOVD -8(R15), R11
MOVD R10, (R3)
ADD R12, R3, R15
MOVD R11, -8(R15)
ADD R12, R13, R13
ADD R12, R3, R3
copy_4_end:
ADD R12, R6, R6
ADD $0x18, R0, R0
ADD $1, R2, R2
CMP R1, R2
BLO main_loop
JMP loop_finished
copy_all_from_history:
MOVD R10, R14
SUBS $0x10, R14, R14
BLO copy_5_small
copy_5_loop:
FMOVQ (R13), F0
FMOVQ F0, (R3)
ADD $0x10, R13, R13
ADD $0x10, R3, R3
SUBS $0x10, R14, R14
BHS copy_5_loop
ADD R14, R13, R13
ADD $16, R13, R13
ADD R14, R3, R3
ADD $16, R3, R3
FMOVQ -16(R13), F0
FMOVQ F0, -16(R3)
JMP copy_5_end
copy_5_small:
CMP $0x03, R10
BEQ copy_5_move_3
BLO copy_5_move_1or2
CMP $0x08, R10
BLO copy_5_move_4through7
JMP copy_5_move_8through16
copy_5_move_1or2:
MOVBU (R13), R16
BFI $0, R16, $8, R14
ADD R10, R13, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R4
MOVB R14, (R3)
ADD R10, R3, R15
MOVB R4, -1(R15)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_3:
MOVHU (R13), R14
MOVBU 2(R13), R16
BFI $0, R16, $8, R4
MOVH R14, (R3)
MOVB R4, 2(R3)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_4through7:
MOVWU (R13), R14
ADD R10, R13, R15
MOVWU -4(R15), R4
MOVW R14, (R3)
ADD R10, R3, R15
MOVW R4, -4(R15)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_8through16:
MOVD (R13), R14
ADD R10, R13, R15
MOVD -8(R15), R4
MOVD R14, (R3)
ADD R10, R3, R15
MOVD R4, -8(R15)
ADD R10, R13, R13
ADD R10, R3, R3
copy_5_end:
ADD R10, R6, R6
SUB R10, R12, R12
// Copy match from the current buffer
copy_match:
MOVD R3, R10
SUB R11, R10, R10
// ml <= mo
CMP R11, R12
BHI copy_overlapping_match
// Copy non-overlapping match
ADD R12, R6, R6
FMOVQ (R10), F0
FMOVQ F0, (R3)
CMP $0x10, R12
BHI copy_2_long
ADD R12, R3, R3
JMP handle_loop
copy_2_long:
ADD $16, R3, R11
ADD R12, R3, R3
ADD $0x10, R10, R10
SUB $0x10, R12, R12
copy_2:
FMOVQ (R10), F0
FMOVQ F0, (R11)
ADD $0x10, R10, R10
ADD $0x10, R11, R11
SUBS $0x10, R12, R12
BHI copy_2
JMP handle_loop
// Copy overlapping match
copy_overlapping_match:
ADD R12, R6, R6
copy_slow_3:
MOVBU (R10), R11
MOVB R11, (R3)
ADD $1, R10, R10
ADD $1, R3, R3
SUBS $1, R12, R12
BNE copy_slow_3
handle_loop:
ADD $0x18, R0, R0
ADD $1, R2, R2
CMP R1, R2
BLO main_loop
loop_finished:
// Return value
MOVD $0x01, R16
MOVB R16, ret+8(FP)
// Update the context
MOVD ctx+0(FP), R0
MOVD R2, 24(R0)
MOVD R6, 104(R0)
MOVD 80(R0), R16
SUB R16, R5, R5
MOVD R5, 112(R0)
RET
error_match_off_too_big:
// Return value
MOVD $0x00, R16
MOVB R16, ret+8(FP)
// Update the context
MOVD ctx+0(FP), R0
MOVD R2, 24(R0)
MOVD R6, 104(R0)
MOVD 80(R0), R16
SUB R16, R5, R5
MOVD R5, 112(R0)
RET
empty_seqs:
// Return value
MOVD $0x01, R16
MOVB R16, ret+8(FP)
RET
// func sequenceDecs_executeSimple_safe_amd64(ctx *executeAsmContext) bool
// Requires: SSE
TEXT ·sequenceDecs_executeSimple_safe_arm64(SB), $8-9
MOVD ctx+0(FP), R9
MOVD 8(R9), R1
TST R1, R1
BEQ empty_seqs
MOVD (R9), R0
MOVD 24(R9), R2
MOVD 32(R9), R3
MOVD 80(R9), R5
MOVD 104(R9), R6
MOVD 120(R9), R7
MOVD 56(R9), R8
MOVD 64(R9), R9
ADD R9, R8, R8
// seqsBase += 24 * seqIndex
ADD R2<<1, R2, R10
LSL $0x03, R10, R10
ADD R10, R0, R0
// outBase += outPosition
ADD R6, R3, R3
main_loop:
MOVD (R0), R10
MOVD 16(R0), R11
MOVD 8(R0), R12
// Copy literals
TST R10, R10
BEQ check_offset
MOVD R10, R13
SUBS $0x10, R13, R13
BLO copy_1_small
copy_1_loop:
FMOVQ (R5), F0
FMOVQ F0, (R3)
ADD $0x10, R5, R5
ADD $0x10, R3, R3
SUBS $0x10, R13, R13
BHS copy_1_loop
ADD R13, R5, R5
ADD $16, R5, R5
ADD R13, R3, R3
ADD $16, R3, R3
FMOVQ -16(R5), F0
FMOVQ F0, -16(R3)
JMP copy_1_end
copy_1_small:
CMP $0x03, R10
BEQ copy_1_move_3
BLO copy_1_move_1or2
CMP $0x08, R10
BLO copy_1_move_4through7
JMP copy_1_move_8through16
copy_1_move_1or2:
MOVBU (R5), R16
BFI $0, R16, $8, R13
ADD R10, R5, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R14
MOVB R13, (R3)
ADD R10, R3, R15
MOVB R14, -1(R15)
ADD R10, R5, R5
ADD R10, R3, R3
JMP copy_1_end
copy_1_move_3:
MOVHU (R5), R13
MOVBU 2(R5), R16
BFI $0, R16, $8, R14
MOVH R13, (R3)
MOVB R14, 2(R3)
ADD R10, R5, R5
ADD R10, R3, R3
JMP copy_1_end
copy_1_move_4through7:
MOVWU (R5), R13
ADD R10, R5, R15
MOVWU -4(R15), R14
MOVW R13, (R3)
ADD R10, R3, R15
MOVW R14, -4(R15)
ADD R10, R5, R5
ADD R10, R3, R3
JMP copy_1_end
copy_1_move_8through16:
MOVD (R5), R13
ADD R10, R5, R15
MOVD -8(R15), R14
MOVD R13, (R3)
ADD R10, R3, R15
MOVD R14, -8(R15)
ADD R10, R5, R5
ADD R10, R3, R3
copy_1_end:
ADD R10, R6, R6
// Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize)
check_offset:
ADD R9, R6, R10
CMP R10, R11
BGT error_match_off_too_big
CMP R7, R11
BGT error_match_off_too_big
// Copy match from history
MOVD R11, R10
SUBS R6, R10, R10
BLS copy_match
MOVD R8, R13
SUB R10, R13, R13
CMP R10, R12
BGT copy_all_from_history
MOVD R12, R10
SUBS $0x10, R10, R10
BLO copy_4_small
copy_4_loop:
FMOVQ (R13), F0
FMOVQ F0, (R3)
ADD $0x10, R13, R13
ADD $0x10, R3, R3
SUBS $0x10, R10, R10
BHS copy_4_loop
ADD R10, R13, R13
ADD $16, R13, R13
ADD R10, R3, R3
ADD $16, R3, R3
FMOVQ -16(R13), F0
FMOVQ F0, -16(R3)
JMP copy_4_end
copy_4_small:
CMP $0x03, R12
BEQ copy_4_move_3
CMP $0x08, R12
BLO copy_4_move_4through7
JMP copy_4_move_8through16
copy_4_move_3:
MOVHU (R13), R10
MOVBU 2(R13), R16
BFI $0, R16, $8, R11
MOVH R10, (R3)
MOVB R11, 2(R3)
ADD R12, R13, R13
ADD R12, R3, R3
JMP copy_4_end
copy_4_move_4through7:
MOVWU (R13), R10
ADD R12, R13, R15
MOVWU -4(R15), R11
MOVW R10, (R3)
ADD R12, R3, R15
MOVW R11, -4(R15)
ADD R12, R13, R13
ADD R12, R3, R3
JMP copy_4_end
copy_4_move_8through16:
MOVD (R13), R10
ADD R12, R13, R15
MOVD -8(R15), R11
MOVD R10, (R3)
ADD R12, R3, R15
MOVD R11, -8(R15)
ADD R12, R13, R13
ADD R12, R3, R3
copy_4_end:
ADD R12, R6, R6
ADD $0x18, R0, R0
ADD $1, R2, R2
CMP R1, R2
BLO main_loop
JMP loop_finished
copy_all_from_history:
MOVD R10, R14
SUBS $0x10, R14, R14
BLO copy_5_small
copy_5_loop:
FMOVQ (R13), F0
FMOVQ F0, (R3)
ADD $0x10, R13, R13
ADD $0x10, R3, R3
SUBS $0x10, R14, R14
BHS copy_5_loop
ADD R14, R13, R13
ADD $16, R13, R13
ADD R14, R3, R3
ADD $16, R3, R3
FMOVQ -16(R13), F0
FMOVQ F0, -16(R3)
JMP copy_5_end
copy_5_small:
CMP $0x03, R10
BEQ copy_5_move_3
BLO copy_5_move_1or2
CMP $0x08, R10
BLO copy_5_move_4through7
JMP copy_5_move_8through16
copy_5_move_1or2:
MOVBU (R13), R16
BFI $0, R16, $8, R14
ADD R10, R13, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R4
MOVB R14, (R3)
ADD R10, R3, R15
MOVB R4, -1(R15)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_3:
MOVHU (R13), R14
MOVBU 2(R13), R16
BFI $0, R16, $8, R4
MOVH R14, (R3)
MOVB R4, 2(R3)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_4through7:
MOVWU (R13), R14
ADD R10, R13, R15
MOVWU -4(R15), R4
MOVW R14, (R3)
ADD R10, R3, R15
MOVW R4, -4(R15)
ADD R10, R13, R13
ADD R10, R3, R3
JMP copy_5_end
copy_5_move_8through16:
MOVD (R13), R14
ADD R10, R13, R15
MOVD -8(R15), R4
MOVD R14, (R3)
ADD R10, R3, R15
MOVD R4, -8(R15)
ADD R10, R13, R13
ADD R10, R3, R3
copy_5_end:
ADD R10, R6, R6
SUB R10, R12, R12
// Copy match from the current buffer
copy_match:
MOVD R3, R10
SUB R11, R10, R10
// ml <= mo
CMP R11, R12
BHI copy_overlapping_match
// Copy non-overlapping match
ADD R12, R6, R6
MOVD R12, R11
SUBS $0x10, R11, R11
BLO copy_2_small
copy_2_loop:
FMOVQ (R10), F0
FMOVQ F0, (R3)
ADD $0x10, R10, R10
ADD $0x10, R3, R3
SUBS $0x10, R11, R11
BHS copy_2_loop
ADD R11, R10, R10
ADD $16, R10, R10
ADD R11, R3, R3
ADD $16, R3, R3
FMOVQ -16(R10), F0
FMOVQ F0, -16(R3)
JMP copy_2_end
copy_2_small:
CMP $0x03, R12
BEQ copy_2_move_3
BLO copy_2_move_1or2
CMP $0x08, R12
BLO copy_2_move_4through7
JMP copy_2_move_8through16
copy_2_move_1or2:
MOVBU (R10), R16
BFI $0, R16, $8, R11
ADD R12, R10, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R13
MOVB R11, (R3)
ADD R12, R3, R15
MOVB R13, -1(R15)
ADD R12, R10, R10
ADD R12, R3, R3
JMP copy_2_end
copy_2_move_3:
MOVHU (R10), R11
MOVBU 2(R10), R16
BFI $0, R16, $8, R13
MOVH R11, (R3)
MOVB R13, 2(R3)
ADD R12, R10, R10
ADD R12, R3, R3
JMP copy_2_end
copy_2_move_4through7:
MOVWU (R10), R11
ADD R12, R10, R15
MOVWU -4(R15), R13
MOVW R11, (R3)
ADD R12, R3, R15
MOVW R13, -4(R15)
ADD R12, R10, R10
ADD R12, R3, R3
JMP copy_2_end
copy_2_move_8through16:
MOVD (R10), R11
ADD R12, R10, R15
MOVD -8(R15), R13
MOVD R11, (R3)
ADD R12, R3, R15
MOVD R13, -8(R15)
ADD R12, R10, R10
ADD R12, R3, R3
copy_2_end:
JMP handle_loop
// Copy overlapping match
copy_overlapping_match:
ADD R12, R6, R6
copy_slow_3:
MOVBU (R10), R11
MOVB R11, (R3)
ADD $1, R10, R10
ADD $1, R3, R3
SUBS $1, R12, R12
BNE copy_slow_3
handle_loop:
ADD $0x18, R0, R0
ADD $1, R2, R2
CMP R1, R2
BLO main_loop
loop_finished:
// Return value
MOVD $0x01, R16
MOVB R16, ret+8(FP)
// Update the context
MOVD ctx+0(FP), R0
MOVD R2, 24(R0)
MOVD R6, 104(R0)
MOVD 80(R0), R16
SUB R16, R5, R5
MOVD R5, 112(R0)
RET
error_match_off_too_big:
// Return value
MOVD $0x00, R16
MOVB R16, ret+8(FP)
// Update the context
MOVD ctx+0(FP), R0
MOVD R2, 24(R0)
MOVD R6, 104(R0)
MOVD 80(R0), R16
SUB R16, R5, R5
MOVD R5, 112(R0)
RET
empty_seqs:
// Return value
MOVD $0x01, R16
MOVB R16, ret+8(FP)
RET
// func sequenceDecs_decodeSync_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
// Requires: CMOV, SSE
TEXT ·sequenceDecs_decodeSync_arm64(SB), $96-32
MOVD br+8(FP), R1
MOVD 24(R1), R2
MOVBU 40(R1), R3
MOVD (R1), R0
MOVD 32(R1), R5
ADD R5, R0, R0
MOVD R0, 8(RSP)
MOVD ctx+16(FP), R0
MOVD 72(R0), R6
MOVD 80(R0), R7
MOVD 88(R0), R8
MOVD (R0), R1
MOVD R1, 16(RSP)
MOVD 24(R0), R1
MOVD R1, 24(RSP)
MOVD 48(R0), R1
MOVD R1, 32(RSP)
MOVD 96(R0), R1
MOVD R1, 40(RSP)
MOVD $0, R1
MOVD R1, 48(RSP)
MOVD R1, 56(RSP)
MOVD R1, 64(RSP)
MOVD 112(R0), R9
MOVD 128(R0), R1
MOVD R1, 72(RSP)
MOVD 144(R0), R10
MOVD 136(R0), R11
MOVD 200(R0), R1
MOVD R1, 96(RSP)
MOVD 176(R0), R1
MOVD R1, 88(RSP)
MOVD 184(R0), R0
MOVD R0, 80(RSP)
MOVD 80(RSP), R0
MOVD 88(RSP), R16
ADD R0, R16, R16
MOVD R16, 88(RSP)
// Calculate pointer to s.out[cap(s.out)] (a past-end pointer)
MOVD 72(RSP), R16
ADD R9, R16, R16
MOVD R16, 72(RSP)
// outBase += outPosition
ADD R11, R9, R9
sequenceDecs_decodeSync_amd64_main_loop:
MOVD 8(RSP), R12
// Fill bitreader to have enough for the offset and match length.
CMP $0x08, R5
BLT sequenceDecs_decodeSync_amd64_fill_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R12, R12
MOVD (R12), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decodeSync_amd64_fill_end
sequenceDecs_decodeSync_amd64_fill_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decodeSync_amd64_fill_check_overread
CMP $0x07, R3
BLE sequenceDecs_decodeSync_amd64_fill_end
LSL $0x08, R2, R2
SUB $0x01, R12, R12
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R12), R0
ORR R0, R2, R2
JMP sequenceDecs_decodeSync_amd64_fill_byte_by_byte
sequenceDecs_decodeSync_amd64_fill_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decodeSync_amd64_fill_end:
// Update offset
MOVD R8, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 48(RSP)
// Update match length
MOVD R7, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 56(RSP)
// Fill bitreader to have enough for the remaining
CMP $0x08, R5
BLT sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R12, R12
MOVD (R12), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decodeSync_amd64_fill_2_end
sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decodeSync_amd64_fill_2_check_overread
CMP $0x07, R3
BLE sequenceDecs_decodeSync_amd64_fill_2_end
LSL $0x08, R2, R2
SUB $0x01, R12, R12
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R12), R0
ORR R0, R2, R2
JMP sequenceDecs_decodeSync_amd64_fill_2_byte_by_byte
sequenceDecs_decodeSync_amd64_fill_2_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decodeSync_amd64_fill_2_end:
// Update literal length
MOVD R6, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 64(RSP)
// Fill bitreader for state updates
MOVD R12, 8(RSP)
UBFX $8, R8, $8, R0
MOVD 40(RSP), R16
CMP $0x00, R16
BEQ sequenceDecs_decodeSync_amd64_skip_update
// Update Literal Length State
MOVBU R6, R12
LSRW $0x10, R6, R6
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R6, R6
// Load ctx.llTable
MOVD 16(RSP), R1
MOVD (R1)(R6<<3), R6
// Update Match Length State
MOVBU R7, R12
LSRW $0x10, R7, R7
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R7, R7
// Load ctx.mlTable
MOVD 24(RSP), R1
MOVD (R1)(R7<<3), R7
// Update Offset State
MOVBU R8, R12
LSRW $0x10, R8, R8
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R8, R8
// Load ctx.ofTable
MOVD 32(RSP), R1
MOVD (R1)(R8<<3), R8
sequenceDecs_decodeSync_amd64_skip_update:
// Adjust offset
MOVD s+0(FP), R1
MOVD 48(RSP), R12
CMP $0x01, R0
BLS sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0
FMOVQ 144(R1), F0
MOVD R12, 144(R1)
FMOVQ F0, 152(R1)
JMP sequenceDecs_decodeSync_amd64_after_adjust
sequenceDecs_decodeSync_amd64_adjust_offsetB_1_or_0:
MOVD 64(RSP), R16
CMP $0x00000000, R16
BNE sequenceDecs_decodeSync_amd64_adjust_offset_maybezero
ADD $1, R12, R12
JMP sequenceDecs_decodeSync_amd64_adjust_offset_nonzero
sequenceDecs_decodeSync_amd64_adjust_offset_maybezero:
TST R12, R12
BNE sequenceDecs_decodeSync_amd64_adjust_offset_nonzero
MOVD 144(R1), R12
JMP sequenceDecs_decodeSync_amd64_after_adjust
sequenceDecs_decodeSync_amd64_adjust_offset_nonzero:
MOVD R12, R0
MOVD $0, R13
MOVD $-1, R14
CMP $0x03, R12
CSEL EQ, R13, R0, R0
CSEL EQ, R14, R13, R13
ADD R0<<3, R1, R15
MOVD 144(R15), R16
ADDS R16, R13, R13
BNE sequenceDecs_decodeSync_amd64_adjust_temp_valid
MOVD $0x00000001, R13
sequenceDecs_decodeSync_amd64_adjust_temp_valid:
CMP $0x01, R12
BEQ sequenceDecs_decodeSync_amd64_adjust_skip
MOVD 152(R1), R0
MOVD R0, 160(R1)
sequenceDecs_decodeSync_amd64_adjust_skip:
MOVD 144(R1), R0
MOVD R0, 152(R1)
MOVD R13, 144(R1)
MOVD R13, R12
sequenceDecs_decodeSync_amd64_after_adjust:
MOVD R12, 48(RSP)
// Check values
MOVD 56(RSP), R0
MOVD 64(RSP), R1
MOVD ctx+16(FP), R13
MOVD 104(R13), R16
SUBS R1, R16, R16
MOVD R16, 104(R13)
BMI error_not_enough_literals
CMP $0x00020002, R0
BHI sequenceDecs_decodeSync_amd64_error_match_len_too_big
TST R12, R12
BNE sequenceDecs_decodeSync_amd64_match_len_ofs_ok
TST R0, R0
BNE sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch
sequenceDecs_decodeSync_amd64_match_len_ofs_ok:
// Check if we have enough space in s.out
ADD R0, R1, R13
ADD $16, R13, R13
ADD R9, R13, R13
MOVD 72(RSP), R16
CMP R16, R13
BHI error_not_enough_space
// Copy literals
FMOVQ (R10), F0
FMOVQ F0, (R9)
CMP $0x10, R1
BLS copy_1_end
MOVD $0x00000010, R13
copy_1:
ADD R13, R10, R15
FMOVQ (R15), F0
ADD R13, R9, R15
FMOVQ F0, (R15)
ADD $0x10, R13, R13
CMP R1, R13
BLO copy_1
copy_1_end:
ADD R1, R10, R10
ADD R1, R9, R9
ADD R1, R11, R11
// Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize)
MOVD R11, R1
MOVD 80(RSP), R16
ADD R16, R1, R1
CMP R1, R12
BGT error_match_off_too_big
MOVD 96(RSP), R16
CMP R16, R12
BGT error_match_off_too_big
// Copy match from history
MOVD R12, R1
SUBS R11, R1, R1
BLS copy_match
MOVD 88(RSP), R13
SUB R1, R13, R13
CMP R1, R0
BGT copy_all_from_history
MOVD R0, R1
SUBS $0x10, R1, R1
BLO copy_4_small
copy_4_loop:
FMOVQ (R13), F0
FMOVQ F0, (R9)
ADD $0x10, R13, R13
ADD $0x10, R9, R9
SUBS $0x10, R1, R1
BHS copy_4_loop
ADD R1, R13, R13
ADD $16, R13, R13
ADD R1, R9, R9
ADD $16, R9, R9
FMOVQ -16(R13), F0
FMOVQ F0, -16(R9)
JMP copy_4_end
copy_4_small:
CMP $0x03, R0
BEQ copy_4_move_3
CMP $0x08, R0
BLO copy_4_move_4through7
JMP copy_4_move_8through16
copy_4_move_3:
MOVHU (R13), R1
MOVBU 2(R13), R16
BFI $0, R16, $8, R12
MOVH R1, (R9)
MOVB R12, 2(R9)
ADD R0, R13, R13
ADD R0, R9, R9
JMP copy_4_end
copy_4_move_4through7:
MOVWU (R13), R1
ADD R0, R13, R15
MOVWU -4(R15), R12
MOVW R1, (R9)
ADD R0, R9, R15
MOVW R12, -4(R15)
ADD R0, R13, R13
ADD R0, R9, R9
JMP copy_4_end
copy_4_move_8through16:
MOVD (R13), R1
ADD R0, R13, R15
MOVD -8(R15), R12
MOVD R1, (R9)
ADD R0, R9, R15
MOVD R12, -8(R15)
ADD R0, R13, R13
ADD R0, R9, R9
copy_4_end:
ADD R0, R11, R11
JMP handle_loop
JMP loop_finished
copy_all_from_history:
MOVD R1, R14
SUBS $0x10, R14, R14
BLO copy_5_small
copy_5_loop:
FMOVQ (R13), F0
FMOVQ F0, (R9)
ADD $0x10, R13, R13
ADD $0x10, R9, R9
SUBS $0x10, R14, R14
BHS copy_5_loop
ADD R14, R13, R13
ADD $16, R13, R13
ADD R14, R9, R9
ADD $16, R9, R9
FMOVQ -16(R13), F0
FMOVQ F0, -16(R9)
JMP copy_5_end
copy_5_small:
CMP $0x03, R1
BEQ copy_5_move_3
BLO copy_5_move_1or2
CMP $0x08, R1
BLO copy_5_move_4through7
JMP copy_5_move_8through16
copy_5_move_1or2:
MOVBU (R13), R16
BFI $0, R16, $8, R14
ADD R1, R13, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R4
MOVB R14, (R9)
ADD R1, R9, R15
MOVB R4, -1(R15)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_3:
MOVHU (R13), R14
MOVBU 2(R13), R16
BFI $0, R16, $8, R4
MOVH R14, (R9)
MOVB R4, 2(R9)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_4through7:
MOVWU (R13), R14
ADD R1, R13, R15
MOVWU -4(R15), R4
MOVW R14, (R9)
ADD R1, R9, R15
MOVW R4, -4(R15)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_8through16:
MOVD (R13), R14
ADD R1, R13, R15
MOVD -8(R15), R4
MOVD R14, (R9)
ADD R1, R9, R15
MOVD R4, -8(R15)
ADD R1, R13, R13
ADD R1, R9, R9
copy_5_end:
ADD R1, R11, R11
SUB R1, R0, R0
// Copy match from the current buffer
copy_match:
MOVD R9, R1
SUB R12, R1, R1
// ml <= mo
CMP R12, R0
BHI copy_overlapping_match
// Copy non-overlapping match
ADD R0, R11, R11
FMOVQ (R1), F0
FMOVQ F0, (R9)
CMP $0x10, R0
BHI copy_2_long
ADD R0, R9, R9
JMP handle_loop
copy_2_long:
ADD $16, R9, R12
ADD R0, R9, R9
ADD $0x10, R1, R1
SUB $0x10, R0, R0
copy_2:
FMOVQ (R1), F0
FMOVQ F0, (R12)
ADD $0x10, R1, R1
ADD $0x10, R12, R12
SUBS $0x10, R0, R0
BHI copy_2
JMP handle_loop
// Copy overlapping match
copy_overlapping_match:
ADD R0, R11, R11
copy_slow_3:
MOVBU (R1), R12
MOVB R12, (R9)
ADD $1, R1, R1
ADD $1, R9, R9
SUBS $1, R0, R0
BNE copy_slow_3
handle_loop:
MOVD 40(RSP), R16
SUBS $1, R16, R16
MOVD R16, 40(RSP)
BPL sequenceDecs_decodeSync_amd64_main_loop
loop_finished:
MOVD br+8(FP), R0
MOVD R2, 24(R0)
MOVB R3, 40(R0)
MOVD R5, 32(R0)
// s.seqSize += outPosition - ctx.outPosition
MOVD ctx+16(FP), R0
MOVD s+0(FP), R1
MOVD R11, R2
MOVD 136(R0), R16
SUB R16, R2, R2
MOVD 256(R1), R16
ADD R2, R16, R16
MOVD R16, 256(R1)
// Update the context
MOVD ctx+16(FP), R0
MOVD R11, 136(R0)
MOVD 144(R0), R1
SUB R1, R10, R10
MOVD R10, 168(R0)
// Return success
MOVD $0x00000000, R16
MOVD R16, ret+24(FP)
RET
// Return with match length error
sequenceDecs_decodeSync_amd64_error_match_len_ofs_mismatch:
MOVD 56(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 216(R1)
MOVD $0x00000001, R16
MOVD R16, ret+24(FP)
RET
// Return with match too long error
sequenceDecs_decodeSync_amd64_error_match_len_too_big:
MOVD ctx+16(FP), R0
MOVD 56(RSP), R1
MOVD R1, 216(R0)
MOVD $0x00000002, R16
MOVD R16, ret+24(FP)
RET
// Return with match offset too long error
error_match_off_too_big:
MOVD ctx+16(FP), R0
MOVD 48(RSP), R1
MOVD R1, 224(R0)
MOVD R11, 136(R0)
MOVD $0x00000003, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough literals error
error_not_enough_literals:
MOVD ctx+16(FP), R0
MOVD 64(RSP), R1
MOVD R1, 208(R0)
MOVD $0x00000004, R16
MOVD R16, ret+24(FP)
RET
// Return with overread error
error_overread:
MOVD $0x00000006, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough output space error
error_not_enough_space:
MOVD ctx+16(FP), R0
MOVD 64(RSP), R1
MOVD R1, 208(R0)
MOVD 56(RSP), R1
MOVD R1, 216(R0)
MOVD R11, 136(R0)
MOVD $0x00000005, R16
MOVD R16, ret+24(FP)
RET
// skipped sequenceDecs_decodeSync_bmi2 (generic twin preferred on arm64)
// func sequenceDecs_decodeSync_safe_amd64(s *sequenceDecs, br *bitReader, ctx *decodeSyncAsmContext) int
// Requires: CMOV, SSE
TEXT ·sequenceDecs_decodeSync_safe_arm64(SB), $96-32
MOVD br+8(FP), R1
MOVD 24(R1), R2
MOVBU 40(R1), R3
MOVD (R1), R0
MOVD 32(R1), R5
ADD R5, R0, R0
MOVD R0, 8(RSP)
MOVD ctx+16(FP), R0
MOVD 72(R0), R6
MOVD 80(R0), R7
MOVD 88(R0), R8
MOVD (R0), R1
MOVD R1, 16(RSP)
MOVD 24(R0), R1
MOVD R1, 24(RSP)
MOVD 48(R0), R1
MOVD R1, 32(RSP)
MOVD 96(R0), R1
MOVD R1, 40(RSP)
MOVD $0, R1
MOVD R1, 48(RSP)
MOVD R1, 56(RSP)
MOVD R1, 64(RSP)
MOVD 112(R0), R9
MOVD 128(R0), R1
MOVD R1, 72(RSP)
MOVD 144(R0), R10
MOVD 136(R0), R11
MOVD 200(R0), R1
MOVD R1, 96(RSP)
MOVD 176(R0), R1
MOVD R1, 88(RSP)
MOVD 184(R0), R0
MOVD R0, 80(RSP)
MOVD 80(RSP), R0
MOVD 88(RSP), R16
ADD R0, R16, R16
MOVD R16, 88(RSP)
// Calculate pointer to s.out[cap(s.out)] (a past-end pointer)
MOVD 72(RSP), R16
ADD R9, R16, R16
MOVD R16, 72(RSP)
// outBase += outPosition
ADD R11, R9, R9
sequenceDecs_decodeSync_safe_amd64_main_loop:
MOVD 8(RSP), R12
// Fill bitreader to have enough for the offset and match length.
CMP $0x08, R5
BLT sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R12, R12
MOVD (R12), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decodeSync_safe_amd64_fill_end
sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decodeSync_safe_amd64_fill_check_overread
CMP $0x07, R3
BLE sequenceDecs_decodeSync_safe_amd64_fill_end
LSL $0x08, R2, R2
SUB $0x01, R12, R12
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R12), R0
ORR R0, R2, R2
JMP sequenceDecs_decodeSync_safe_amd64_fill_byte_by_byte
sequenceDecs_decodeSync_safe_amd64_fill_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decodeSync_safe_amd64_fill_end:
// Update offset
MOVD R8, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 48(RSP)
// Update match length
MOVD R7, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 56(RSP)
// Fill bitreader to have enough for the remaining
CMP $0x08, R5
BLT sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte
LSR $0x03, R3, R0
SUB R0, R12, R12
MOVD (R12), R2
SUB R0, R5, R5
AND $0x07, R3, R3
JMP sequenceDecs_decodeSync_safe_amd64_fill_2_end
sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte:
CMP $0x00, R5
BLE sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread
CMP $0x07, R3
BLE sequenceDecs_decodeSync_safe_amd64_fill_2_end
LSL $0x08, R2, R2
SUB $0x01, R12, R12
SUB $0x01, R5, R5
SUB $0x08, R3, R3
MOVBU (R12), R0
ORR R0, R2, R2
JMP sequenceDecs_decodeSync_safe_amd64_fill_2_byte_by_byte
sequenceDecs_decodeSync_safe_amd64_fill_2_check_overread:
CMP $0x40, R3
BHI error_overread
sequenceDecs_decodeSync_safe_amd64_fill_2_end:
// Update literal length
MOVD R6, R0
LSL R3, R2, R13
LSR $0x01, R13, R13
UBFX $8, R0, $8, R1
LSR $0x20, R0, R0
ADD R1, R3, R3
EOR $0x3f, R1, R1
LSR R1, R13, R13
ADD R13, R0, R0
MOVD R0, 64(RSP)
// Fill bitreader for state updates
MOVD R12, 8(RSP)
UBFX $8, R8, $8, R0
MOVD 40(RSP), R16
CMP $0x00, R16
BEQ sequenceDecs_decodeSync_safe_amd64_skip_update
// Update Literal Length State
MOVBU R6, R12
LSRW $0x10, R6, R6
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R6, R6
// Load ctx.llTable
MOVD 16(RSP), R1
MOVD (R1)(R6<<3), R6
// Update Match Length State
MOVBU R7, R12
LSRW $0x10, R7, R7
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R7, R7
// Load ctx.mlTable
MOVD 24(RSP), R1
MOVD (R1)(R7<<3), R7
// Update Offset State
MOVBU R8, R12
LSRW $0x10, R8, R8
LSL R3, R2, R13
LSR $0x01, R13, R13
ADD R12, R3, R3
EOR $0x3f, R12, R12
LSR R12, R13, R13
ADD R13, R8, R8
// Load ctx.ofTable
MOVD 32(RSP), R1
MOVD (R1)(R8<<3), R8
sequenceDecs_decodeSync_safe_amd64_skip_update:
// Adjust offset
MOVD s+0(FP), R1
MOVD 48(RSP), R12
CMP $0x01, R0
BLS sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0
FMOVQ 144(R1), F0
MOVD R12, 144(R1)
FMOVQ F0, 152(R1)
JMP sequenceDecs_decodeSync_safe_amd64_after_adjust
sequenceDecs_decodeSync_safe_amd64_adjust_offsetB_1_or_0:
MOVD 64(RSP), R16
CMP $0x00000000, R16
BNE sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero
ADD $1, R12, R12
JMP sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero
sequenceDecs_decodeSync_safe_amd64_adjust_offset_maybezero:
TST R12, R12
BNE sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero
MOVD 144(R1), R12
JMP sequenceDecs_decodeSync_safe_amd64_after_adjust
sequenceDecs_decodeSync_safe_amd64_adjust_offset_nonzero:
MOVD R12, R0
MOVD $0, R13
MOVD $-1, R14
CMP $0x03, R12
CSEL EQ, R13, R0, R0
CSEL EQ, R14, R13, R13
ADD R0<<3, R1, R15
MOVD 144(R15), R16
ADDS R16, R13, R13
BNE sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid
MOVD $0x00000001, R13
sequenceDecs_decodeSync_safe_amd64_adjust_temp_valid:
CMP $0x01, R12
BEQ sequenceDecs_decodeSync_safe_amd64_adjust_skip
MOVD 152(R1), R0
MOVD R0, 160(R1)
sequenceDecs_decodeSync_safe_amd64_adjust_skip:
MOVD 144(R1), R0
MOVD R0, 152(R1)
MOVD R13, 144(R1)
MOVD R13, R12
sequenceDecs_decodeSync_safe_amd64_after_adjust:
MOVD R12, 48(RSP)
// Check values
MOVD 56(RSP), R0
MOVD 64(RSP), R1
MOVD ctx+16(FP), R13
MOVD 104(R13), R16
SUBS R1, R16, R16
MOVD R16, 104(R13)
BMI error_not_enough_literals
CMP $0x00020002, R0
BHI sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big
TST R12, R12
BNE sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok
TST R0, R0
BNE sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch
sequenceDecs_decodeSync_safe_amd64_match_len_ofs_ok:
// Check if we have enough space in s.out
ADD R0, R1, R13
ADD R9, R13, R13
MOVD 72(RSP), R16
CMP R16, R13
BHI error_not_enough_space
// Copy literals
TST R1, R1
BEQ check_offset
MOVD R1, R13
SUBS $0x10, R13, R13
BLO copy_1_small
copy_1_loop:
FMOVQ (R10), F0
FMOVQ F0, (R9)
ADD $0x10, R10, R10
ADD $0x10, R9, R9
SUBS $0x10, R13, R13
BHS copy_1_loop
ADD R13, R10, R10
ADD $16, R10, R10
ADD R13, R9, R9
ADD $16, R9, R9
FMOVQ -16(R10), F0
FMOVQ F0, -16(R9)
JMP copy_1_end
copy_1_small:
CMP $0x03, R1
BEQ copy_1_move_3
BLO copy_1_move_1or2
CMP $0x08, R1
BLO copy_1_move_4through7
JMP copy_1_move_8through16
copy_1_move_1or2:
MOVBU (R10), R16
BFI $0, R16, $8, R13
ADD R1, R10, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R14
MOVB R13, (R9)
ADD R1, R9, R15
MOVB R14, -1(R15)
ADD R1, R10, R10
ADD R1, R9, R9
JMP copy_1_end
copy_1_move_3:
MOVHU (R10), R13
MOVBU 2(R10), R16
BFI $0, R16, $8, R14
MOVH R13, (R9)
MOVB R14, 2(R9)
ADD R1, R10, R10
ADD R1, R9, R9
JMP copy_1_end
copy_1_move_4through7:
MOVWU (R10), R13
ADD R1, R10, R15
MOVWU -4(R15), R14
MOVW R13, (R9)
ADD R1, R9, R15
MOVW R14, -4(R15)
ADD R1, R10, R10
ADD R1, R9, R9
JMP copy_1_end
copy_1_move_8through16:
MOVD (R10), R13
ADD R1, R10, R15
MOVD -8(R15), R14
MOVD R13, (R9)
ADD R1, R9, R15
MOVD R14, -8(R15)
ADD R1, R10, R10
ADD R1, R9, R9
copy_1_end:
ADD R1, R11, R11
// Malformed input if seq.mo > t+len(hist) || seq.mo > s.windowSize)
check_offset:
MOVD R11, R1
MOVD 80(RSP), R16
ADD R16, R1, R1
CMP R1, R12
BGT error_match_off_too_big
MOVD 96(RSP), R16
CMP R16, R12
BGT error_match_off_too_big
// Copy match from history
MOVD R12, R1
SUBS R11, R1, R1
BLS copy_match
MOVD 88(RSP), R13
SUB R1, R13, R13
CMP R1, R0
BGT copy_all_from_history
MOVD R0, R1
SUBS $0x10, R1, R1
BLO copy_4_small
copy_4_loop:
FMOVQ (R13), F0
FMOVQ F0, (R9)
ADD $0x10, R13, R13
ADD $0x10, R9, R9
SUBS $0x10, R1, R1
BHS copy_4_loop
ADD R1, R13, R13
ADD $16, R13, R13
ADD R1, R9, R9
ADD $16, R9, R9
FMOVQ -16(R13), F0
FMOVQ F0, -16(R9)
JMP copy_4_end
copy_4_small:
CMP $0x03, R0
BEQ copy_4_move_3
CMP $0x08, R0
BLO copy_4_move_4through7
JMP copy_4_move_8through16
copy_4_move_3:
MOVHU (R13), R1
MOVBU 2(R13), R16
BFI $0, R16, $8, R12
MOVH R1, (R9)
MOVB R12, 2(R9)
ADD R0, R13, R13
ADD R0, R9, R9
JMP copy_4_end
copy_4_move_4through7:
MOVWU (R13), R1
ADD R0, R13, R15
MOVWU -4(R15), R12
MOVW R1, (R9)
ADD R0, R9, R15
MOVW R12, -4(R15)
ADD R0, R13, R13
ADD R0, R9, R9
JMP copy_4_end
copy_4_move_8through16:
MOVD (R13), R1
ADD R0, R13, R15
MOVD -8(R15), R12
MOVD R1, (R9)
ADD R0, R9, R15
MOVD R12, -8(R15)
ADD R0, R13, R13
ADD R0, R9, R9
copy_4_end:
ADD R0, R11, R11
JMP handle_loop
JMP loop_finished
copy_all_from_history:
MOVD R1, R14
SUBS $0x10, R14, R14
BLO copy_5_small
copy_5_loop:
FMOVQ (R13), F0
FMOVQ F0, (R9)
ADD $0x10, R13, R13
ADD $0x10, R9, R9
SUBS $0x10, R14, R14
BHS copy_5_loop
ADD R14, R13, R13
ADD $16, R13, R13
ADD R14, R9, R9
ADD $16, R9, R9
FMOVQ -16(R13), F0
FMOVQ F0, -16(R9)
JMP copy_5_end
copy_5_small:
CMP $0x03, R1
BEQ copy_5_move_3
BLO copy_5_move_1or2
CMP $0x08, R1
BLO copy_5_move_4through7
JMP copy_5_move_8through16
copy_5_move_1or2:
MOVBU (R13), R16
BFI $0, R16, $8, R14
ADD R1, R13, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R4
MOVB R14, (R9)
ADD R1, R9, R15
MOVB R4, -1(R15)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_3:
MOVHU (R13), R14
MOVBU 2(R13), R16
BFI $0, R16, $8, R4
MOVH R14, (R9)
MOVB R4, 2(R9)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_4through7:
MOVWU (R13), R14
ADD R1, R13, R15
MOVWU -4(R15), R4
MOVW R14, (R9)
ADD R1, R9, R15
MOVW R4, -4(R15)
ADD R1, R13, R13
ADD R1, R9, R9
JMP copy_5_end
copy_5_move_8through16:
MOVD (R13), R14
ADD R1, R13, R15
MOVD -8(R15), R4
MOVD R14, (R9)
ADD R1, R9, R15
MOVD R4, -8(R15)
ADD R1, R13, R13
ADD R1, R9, R9
copy_5_end:
ADD R1, R11, R11
SUB R1, R0, R0
// Copy match from the current buffer
copy_match:
MOVD R9, R1
SUB R12, R1, R1
// ml <= mo
CMP R12, R0
BHI copy_overlapping_match
// Copy non-overlapping match
ADD R0, R11, R11
MOVD R0, R12
SUBS $0x10, R12, R12
BLO copy_2_small
copy_2_loop:
FMOVQ (R1), F0
FMOVQ F0, (R9)
ADD $0x10, R1, R1
ADD $0x10, R9, R9
SUBS $0x10, R12, R12
BHS copy_2_loop
ADD R12, R1, R1
ADD $16, R1, R1
ADD R12, R9, R9
ADD $16, R9, R9
FMOVQ -16(R1), F0
FMOVQ F0, -16(R9)
JMP copy_2_end
copy_2_small:
CMP $0x03, R0
BEQ copy_2_move_3
BLO copy_2_move_1or2
CMP $0x08, R0
BLO copy_2_move_4through7
JMP copy_2_move_8through16
copy_2_move_1or2:
MOVBU (R1), R16
BFI $0, R16, $8, R12
ADD R0, R1, R15
MOVBU -1(R15), R16
BFI $0, R16, $8, R13
MOVB R12, (R9)
ADD R0, R9, R15
MOVB R13, -1(R15)
ADD R0, R1, R1
ADD R0, R9, R9
JMP copy_2_end
copy_2_move_3:
MOVHU (R1), R12
MOVBU 2(R1), R16
BFI $0, R16, $8, R13
MOVH R12, (R9)
MOVB R13, 2(R9)
ADD R0, R1, R1
ADD R0, R9, R9
JMP copy_2_end
copy_2_move_4through7:
MOVWU (R1), R12
ADD R0, R1, R15
MOVWU -4(R15), R13
MOVW R12, (R9)
ADD R0, R9, R15
MOVW R13, -4(R15)
ADD R0, R1, R1
ADD R0, R9, R9
JMP copy_2_end
copy_2_move_8through16:
MOVD (R1), R12
ADD R0, R1, R15
MOVD -8(R15), R13
MOVD R12, (R9)
ADD R0, R9, R15
MOVD R13, -8(R15)
ADD R0, R1, R1
ADD R0, R9, R9
copy_2_end:
JMP handle_loop
// Copy overlapping match
copy_overlapping_match:
ADD R0, R11, R11
copy_slow_3:
MOVBU (R1), R12
MOVB R12, (R9)
ADD $1, R1, R1
ADD $1, R9, R9
SUBS $1, R0, R0
BNE copy_slow_3
handle_loop:
MOVD 40(RSP), R16
SUBS $1, R16, R16
MOVD R16, 40(RSP)
BPL sequenceDecs_decodeSync_safe_amd64_main_loop
loop_finished:
MOVD br+8(FP), R0
MOVD R2, 24(R0)
MOVB R3, 40(R0)
MOVD R5, 32(R0)
// s.seqSize += outPosition - ctx.outPosition
MOVD ctx+16(FP), R0
MOVD s+0(FP), R1
MOVD R11, R2
MOVD 136(R0), R16
SUB R16, R2, R2
MOVD 256(R1), R16
ADD R2, R16, R16
MOVD R16, 256(R1)
// Update the context
MOVD ctx+16(FP), R0
MOVD R11, 136(R0)
MOVD 144(R0), R1
SUB R1, R10, R10
MOVD R10, 168(R0)
// Return success
MOVD $0x00000000, R16
MOVD R16, ret+24(FP)
RET
// Return with match length error
sequenceDecs_decodeSync_safe_amd64_error_match_len_ofs_mismatch:
MOVD 56(RSP), R0
MOVD ctx+16(FP), R1
MOVD R0, 216(R1)
MOVD $0x00000001, R16
MOVD R16, ret+24(FP)
RET
// Return with match too long error
sequenceDecs_decodeSync_safe_amd64_error_match_len_too_big:
MOVD ctx+16(FP), R0
MOVD 56(RSP), R1
MOVD R1, 216(R0)
MOVD $0x00000002, R16
MOVD R16, ret+24(FP)
RET
// Return with match offset too long error
error_match_off_too_big:
MOVD ctx+16(FP), R0
MOVD 48(RSP), R1
MOVD R1, 224(R0)
MOVD R11, 136(R0)
MOVD $0x00000003, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough literals error
error_not_enough_literals:
MOVD ctx+16(FP), R0
MOVD 64(RSP), R1
MOVD R1, 208(R0)
MOVD $0x00000004, R16
MOVD R16, ret+24(FP)
RET
// Return with overread error
error_overread:
MOVD $0x00000006, R16
MOVD R16, ret+24(FP)
RET
// Return with not enough output space error
error_not_enough_space:
MOVD ctx+16(FP), R0
MOVD 64(RSP), R1
MOVD R1, 208(R0)
MOVD 56(RSP), R1
MOVD R1, 216(R0)
MOVD R11, 136(R0)
MOVD $0x00000005, R16
MOVD R16, ret+24(FP)
RET
// skipped sequenceDecs_decodeSync_safe_bmi2 (generic twin preferred on arm64)