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