rendered paste body;; u8 *huffCompress(u32 *dst, u8 *src, u8 *end, u32 *tbl)
huffCompress:
mov r10,rcx ; table with huffman codes/lengths
mov r8b,-32 ; bits to go
.loop:
movzx r11,byte [rsi] ; load byte
mov ecx, [r10+4*r11]
; load huffman code/length
add r8b,cl
; add code legth into 'r8b'
jl .nostore
; enough space in the register?
sub cl,r8b
; no, put in what fits in and adjust 'cl'
sub r8b,32
shld eax,ecx,cl
add cl,r8b
bswap eax
mov [rdi],eax
add rdi,4
.nostore:
; put the code into 'eax'
shld eax,ecx,cl
add rsi,1
; advance source by one byte
cmp rsi,rdx
; loop...
jnz .loop
cmp r8b,-32
; extra bits to flush?
jle .noextra
mov cl,r8b
neg cl
shl eax,cl
bswap eax
mov [rdi],eax
add rdi,4
.noextra:
mov rax,rdi ; how many dwords did we encode?
retn