154 lines
2.8 KiB
ArmAsm
154 lines
2.8 KiB
ArmAsm
// Code generated by command: go run gen_fse.go -out ../fse_decoder.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 buildDtable_asm(s *fseDecoder, ctx *buildDtableAsmContext) int
|
|
TEXT ·buildDtable_asm(SB), $0-24
|
|
MOVD ctx+8(FP), R1
|
|
MOVD s+0(FP), R6
|
|
|
|
// Load values
|
|
MOVBU 4098(R6), R2
|
|
MOVD $0, R0
|
|
MOVD $1, R16
|
|
LSL R2, R16, R16
|
|
ORR R16, R0, R0
|
|
MOVD (R1), R3
|
|
MOVD 16(R1), R5
|
|
SUB $1, R0, R7
|
|
MOVD 8(R1), R1
|
|
MOVHU 4096(R6), R6
|
|
|
|
// End load values
|
|
// Init, lay down lowprob symbols
|
|
MOVD $0, R8
|
|
JMP init_main_loop_condition
|
|
|
|
init_main_loop:
|
|
ADD R8<<1, R1, R15
|
|
MOVH (R15), R9
|
|
AND $0xffff, R9, R15
|
|
MOVD $-1, R16
|
|
AND $0xffff, R16, R16
|
|
CMP R16, R15
|
|
BNE do_not_update_high_threshold
|
|
ADD R7<<3, R5, R15
|
|
MOVB R8, 1(R15)
|
|
SUB $1, R7, R7
|
|
MOVD $0x0000000000000001, R9
|
|
|
|
do_not_update_high_threshold:
|
|
ADD R8<<1, R3, R15
|
|
MOVH R9, (R15)
|
|
ADD $1, R8, R8
|
|
|
|
init_main_loop_condition:
|
|
CMP R6, R8
|
|
BLT init_main_loop
|
|
|
|
// Spread symbols
|
|
// Calculate table step
|
|
MOVD R0, R8
|
|
LSR $0x01, R8, R8
|
|
MOVD R0, R9
|
|
LSR $0x03, R9, R9
|
|
ADD R9, R8, R8
|
|
ADD $3, R8, R8
|
|
|
|
// Fill add bits values
|
|
SUB $1, R0, R9
|
|
MOVD $0, R10
|
|
MOVD $0, R11
|
|
JMP spread_main_loop_condition
|
|
|
|
spread_main_loop:
|
|
MOVD $0, R12
|
|
ADD R11<<1, R1, R15
|
|
MOVH (R15), R13
|
|
JMP spread_inner_loop_condition
|
|
|
|
spread_inner_loop:
|
|
ADD R10<<3, R5, R15
|
|
MOVB R11, 1(R15)
|
|
|
|
adjust_position:
|
|
ADD R8, R10, R10
|
|
AND R9, R10, R10
|
|
CMP R7, R10
|
|
BGT adjust_position
|
|
ADD $1, R12, R12
|
|
|
|
spread_inner_loop_condition:
|
|
CMP R13, R12
|
|
BLT spread_inner_loop
|
|
ADD $1, R11, R11
|
|
|
|
spread_main_loop_condition:
|
|
CMP R6, R11
|
|
BLT spread_main_loop
|
|
TST R10, R10
|
|
BEQ spread_check_ok
|
|
MOVD ctx+8(FP), R0
|
|
MOVD R10, 24(R0)
|
|
MOVD $+1, R16
|
|
MOVD R16, ret+16(FP)
|
|
RET
|
|
|
|
spread_check_ok:
|
|
// Build Decoding table
|
|
MOVD $0, R6
|
|
|
|
build_table_main_table:
|
|
ADD R6<<3, R5, R15
|
|
MOVBU 1(R15), R1
|
|
ADD R1<<1, R3, R15
|
|
MOVHU (R15), R7
|
|
ADD $1, R7, R8
|
|
ADD R1<<1, R3, R15
|
|
MOVH R8, (R15)
|
|
MOVD R7, R8
|
|
CLZ R8, R16
|
|
MOVD $63, R8
|
|
SUB R16, R8, R8
|
|
MOVD R2, R1
|
|
SUB R8, R1, R1
|
|
LSL R1, R7, R7
|
|
SUB R0, R7, R7
|
|
ADD R6<<3, R5, R15
|
|
MOVB R1, (R15)
|
|
ADD R6<<3, R5, R15
|
|
MOVH R7, 2(R15)
|
|
CMP R0, R7
|
|
BLE build_table_check1_ok
|
|
MOVD ctx+8(FP), R1
|
|
MOVD R7, 24(R1)
|
|
MOVD R0, 32(R1)
|
|
MOVD $+2, R16
|
|
MOVD R16, ret+16(FP)
|
|
RET
|
|
|
|
build_table_check1_ok:
|
|
AND $0xff, R1, R15
|
|
AND $0xff, R1, R16
|
|
TST R16, R15
|
|
BNE build_table_check2_ok
|
|
AND $0xffff, R7, R15
|
|
AND $0xffff, R6, R16
|
|
CMP R16, R15
|
|
BNE build_table_check2_ok
|
|
MOVD ctx+8(FP), R0
|
|
MOVD R7, 24(R0)
|
|
MOVD R6, 32(R0)
|
|
MOVD $+3, R16
|
|
MOVD R16, ret+16(FP)
|
|
RET
|
|
|
|
build_table_check2_ok:
|
|
ADD $1, R6, R6
|
|
CMP R0, R6
|
|
BLT build_table_main_table
|
|
MOVD $+0, R16
|
|
MOVD R16, ret+16(FP)
|
|
RET
|