Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Decoder for LZ4LLB (LZ4 variant with lengths limited to a single byte), as implemented in BJX2 ASM.
- Relatively little bundling in this code, as for a lot of the cases where bundling could be used, interlock delays would have eaten any gains. Still, further improvements could be possible...
- */
- byte *TKPE_UnpackL6(byte *ct, byte *ibuf, int isz);
- __asm {
- TKPE_UnpackL6:
- WEXMD 2
- ADD R5, R6, R7
- .L0:
- /* Fetch Token Byte */
- MOVU.B (R5, 0), R16
- MOVU.B (R5, 1), R17
- ADD 1, R5
- SHLD R16, -4, R18 | AND R16, 15, R19
- /* Fetch Extended Length */
- CMPEQ 15, R18
- ADD?T R17, R18 | ADD?T 1, R5
- ADD R5, R18, R22
- MOV R4, R20 | MOV R5, R21
- ADD R18, R4 | ADD R18, R5
- /* Copy Literal Bytes */
- .L1:
- MOV.Q (R21, 0), R16
- MOV.Q (R21, 8), R17
- ADD 16, R21
- MOV.Q R16, (R20, 0)
- MOV.Q R17, (R20, 8)
- ADD 16, R20
- CMPGT R21, R22
- BT .L1
- MOVU.W (R5, 0), R18
- MOVU.B (R5, 2), R17
- ADD R5, 1, R23
- ADD 2, R5
- /* Hit end of buffer yet? */
- CMPGT R23, R7
- BF .Done
- CMPEQ 15, R19
- ADD?T 1, R5 | ADD?T R17, R19
- ADD 4, R19
- /* Zero-Distance Cases? */
- TEST R18, R18
- BF .Copy
- CMPEQ 5, R19
- BT .Cont
- BRA .Done
- .Cont:
- CMPGT R5, R7
- BT .L0
- .Done:
- MOV R4, R2
- RTS
- /* Match Copy Stuff */
- /* R4=Dest, R5=Source, R18=Dist, R19=Length */
- .Copy:
- ADD R4, R19, R22 | SUB R4, R18, R21
- MOV R4, R20
- ADD R19, R4
- CMPGE 8, R18
- BF .CopyRLE
- CMPGE 16, R18
- BF .CopyL1S
- .CopyL1:
- MOV.Q (R21, 0), R16
- MOV.Q (R21, 8), R17
- ADD 16, R21
- MOV.Q R16, (R20, 0)
- MOV.Q R17, (R20, 8)
- ADD 16, R20
- CMPGT R20, R22
- BT .CopyL1
- BRA .Cont
- .CopyL1S:
- MOV.Q (R21, 0), R16
- MOV.Q R16, (R20, 0)
- MOV.Q (R21, 8), R17
- MOV.Q R17, (R20, 8)
- ADD 16, R21
- ADD 16, R20
- CMPGT R20, R22
- BT .CopyL1S
- BRA .Cont
- .CopyRLE:
- CMPEQ 1, R18
- BT .CopyRLE1
- CMPEQ 2, R18
- BT .CopyRLE2
- CMPEQ 4, R18
- BT .CopyRLE4
- CMPEQ 3, R18
- BT .CopyRLE3
- MOV.Q (R21), R16
- .CopyRLE_L1:
- MOV.Q R16, (R20, 0)
- ADD R18, R20
- CMPGT R20, R22
- BT .CopyRLE_L1
- BRA .Cont
- .CopyRLE1:
- MOVU.B (R21), R16
- PSHUF.B R16, 0x00, R16
- PSHUF.W R16, 0x00, R16
- BRA .CopyRLEN_L1
- .CopyRLE2:
- MOVU.W (R21), R16
- PSHUF.W R16, 0x00, R16
- BRA .CopyRLEN_L1
- .CopyRLE4:
- MOVU.L (R21), R16
- MOVLLD R16, R16, R16
- BRA .CopyRLEN_L1
- .CopyRLE3:
- MOVU.L (R21), R16
- MOV 6, R18
- SHLD R16, 8, R3 | SHLD R16, 24, R17
- SHLD R3, -8, R16
- OR R17, R16
- BRA .CopyRLE_L1
- NOP
- .CopyRLEN_L1:
- MOV.Q R16, (R20, 0)
- MOV.Q R16, (R20, 8)
- ADD 16, R20
- CMPGT R20, R22
- BT .CopyRLEN_L1
- BRA .Cont
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement