# Prefix-code encode/decode acceleration This is useful for Huffman codes, and other prefix-codes, which are used a lot in common formats: * DEFLATE (zip, png, gzip, etc.) * JPEG * MP3 * MPEG-2/H.262 (DVD video) * zstd * Brotli * etc. Links: * * * # Prefix-code decode description `pcdec. RT,RA,RB,RC,imm` |0 |6 |11 |16 |21 |26 |31 | | PO | RT | RA | RB | RC | XO | imm | if `imm` is 1, at most one code-word is decoded -- useful for things like DEFLATE that alternate code words with other bits, or use multiple binary code trees. if `imm` is 0, it decodes multiple code-words The binary code tree is encoded in `RB` like so: ``` t[i] = (RB >> i) & 0x1 | +-----------+-----------+ | | 0 1 | | +---t[2]----+ +---t[3]----+ | | | | 0 1 0 1 | | | | +t[4]-+ +t[5]-+ +t[6]-+ +t[7]-+ | | | | | | | | 0 1 0 1 0 1 0 1 | | | | | | | | t[8] t[9] t[10] t[11] t[12] t[13] t[14] t[15] and so on for t[16..] ``` Decoding a code word works by walking on the tree from the root to the children, matching each passed 0 or 1 to the next read input bit in RA in LSB to MSB order. When `t[i]` is set, then a valid code word was read and `i` is written to the next byte of output in RT in LSB to MSB order. When no set `t[i]` is encountered, and there are still input bits left, then the code word is >5-bits, so SO/OV/OV32 are set, and decoding stops. [[!inline pages="openpower/isa/prefix_codes" quick="yes" raw="yes" ]] # [DRAFT] Prefix-code encode TODO