127 lines
2.3 KiB
ArmAsm
127 lines
2.3 KiB
ArmAsm
// Code generated by command: go run gen_fse.go -out ../fse_decoder_amd64.s -pkg=zstd. DO NOT EDIT.
|
|
|
|
//go:build !appengine && !noasm && gc && !noasm
|
|
|
|
// func buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int
|
|
TEXT ·buildDtable_asm(SB), $0-24
|
|
MOVQ ctx+8(FP), CX
|
|
MOVQ s+0(FP), DI
|
|
|
|
// Load values
|
|
MOVBQZX 4098(DI), DX
|
|
XORQ AX, AX
|
|
BTSQ DX, AX
|
|
MOVQ (CX), BX
|
|
MOVQ 16(CX), SI
|
|
LEAQ -1(AX), R8
|
|
MOVQ 8(CX), CX
|
|
MOVWQZX 4096(DI), DI
|
|
|
|
// End load values
|
|
// Init, lay down lowprob symbols
|
|
XORQ R9, R9
|
|
JMP init_main_loop_condition
|
|
|
|
init_main_loop:
|
|
MOVWQSX (CX)(R9*2), R10
|
|
CMPW R10, $-1
|
|
JNE do_not_update_high_threshold
|
|
MOVB R9, 1(SI)(R8*8)
|
|
DECQ R8
|
|
MOVQ $0x0000000000000001, R10
|
|
|
|
do_not_update_high_threshold:
|
|
MOVW R10, (BX)(R9*2)
|
|
INCQ R9
|
|
|
|
init_main_loop_condition:
|
|
CMPQ R9, DI
|
|
JL init_main_loop
|
|
|
|
// Spread symbols
|
|
// Calculate table step
|
|
MOVQ AX, R9
|
|
SHRQ $0x01, R9
|
|
MOVQ AX, R10
|
|
SHRQ $0x03, R10
|
|
LEAQ 3(R9)(R10*1), R9
|
|
|
|
// Fill add bits values
|
|
LEAQ -1(AX), R10
|
|
XORQ R11, R11
|
|
XORQ R12, R12
|
|
JMP spread_main_loop_condition
|
|
|
|
spread_main_loop:
|
|
XORQ R13, R13
|
|
MOVWQSX (CX)(R12*2), R14
|
|
JMP spread_inner_loop_condition
|
|
|
|
spread_inner_loop:
|
|
MOVB R12, 1(SI)(R11*8)
|
|
|
|
adjust_position:
|
|
ADDQ R9, R11
|
|
ANDQ R10, R11
|
|
CMPQ R11, R8
|
|
JG adjust_position
|
|
INCQ R13
|
|
|
|
spread_inner_loop_condition:
|
|
CMPQ R13, R14
|
|
JL spread_inner_loop
|
|
INCQ R12
|
|
|
|
spread_main_loop_condition:
|
|
CMPQ R12, DI
|
|
JL spread_main_loop
|
|
TESTQ R11, R11
|
|
JZ spread_check_ok
|
|
MOVQ ctx+8(FP), AX
|
|
MOVQ R11, 24(AX)
|
|
MOVQ $+1, ret+16(FP)
|
|
RET
|
|
|
|
spread_check_ok:
|
|
// Build Decoding table
|
|
XORQ DI, DI
|
|
|
|
build_table_main_table:
|
|
MOVBQZX 1(SI)(DI*8), CX
|
|
MOVWQZX (BX)(CX*2), R8
|
|
LEAQ 1(R8), R9
|
|
MOVW R9, (BX)(CX*2)
|
|
MOVQ R8, R9
|
|
BSRQ R9, R9
|
|
MOVQ DX, CX
|
|
SUBQ R9, CX
|
|
SHLQ CL, R8
|
|
SUBQ AX, R8
|
|
MOVB CL, (SI)(DI*8)
|
|
MOVW R8, 2(SI)(DI*8)
|
|
CMPQ R8, AX
|
|
JLE build_table_check1_ok
|
|
MOVQ ctx+8(FP), CX
|
|
MOVQ R8, 24(CX)
|
|
MOVQ AX, 32(CX)
|
|
MOVQ $+2, ret+16(FP)
|
|
RET
|
|
|
|
build_table_check1_ok:
|
|
TESTB CL, CL
|
|
JNZ build_table_check2_ok
|
|
CMPW R8, DI
|
|
JNE build_table_check2_ok
|
|
MOVQ ctx+8(FP), AX
|
|
MOVQ R8, 24(AX)
|
|
MOVQ DI, 32(AX)
|
|
MOVQ $+3, ret+16(FP)
|
|
RET
|
|
|
|
build_table_check2_ok:
|
|
INCQ DI
|
|
CMPQ DI, AX
|
|
JL build_table_main_table
|
|
MOVQ $+0, ret+16(FP)
|
|
RET
|