| // 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 |