wok annotate memtest/stuff/unlz4.S @ rev 25487

Up exiftool (12.50), foomatic-db (4.0-20221111), lzsa (1.4.0), zlib (1.2.13)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Nov 15 16:20:54 2022 +0000 (18 months ago)
parents 18d1dc85701e
children 2ccf00d9c1cd
rev   line source
pascal@25487 1 // Lz4Decode:
pascal@13269 2 #ifndef FLAT32
pascal@25487 3 // input ds:si=inStream, es:di=outStream
pascal@25487 4 // output outStream[], ds:si, es:di
pascal@13269 5 .code16
pascal@25487 6 #define AX %ax
pascal@25487 7 #define BX %bx
pascal@25487 8 #define CX %cx
pascal@25487 9 #define SI %si
pascal@25487 10 #define DI %di
pascal@13269 11 #else
pascal@25487 12 // input esi=inStream, edi=outStream
pascal@25487 13 // output outStream[], ds:esi, es:edi
pascal@13269 14 .code32
pascal@25487 15 #define AX %eax
pascal@25487 16 #define BX %ebx
pascal@25487 17 #define CX %ecx
pascal@25487 18 #define SI %esi
pascal@25487 19 #define DI %edi
pascal@13269 20 #endif
pascal@13269 21
pascal@13269 22 #define ARCHIVE_MAGICNUMBER 0x184C2102
pascal@13269 23
pascal@25487 24 //#define PARANOIA // cover rare cases, optional
pascal@25487 25
pascal@13269 26 lz4main:
pascal@25487 27 #ifdef PARANOIA
pascal@13269 28 cld
pascal@25487 29 # if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@25487 30 xorl %cx, %cx
pascal@25487 31 call lz4mov
pascal@25487 32 # endif
pascal@25487 33 #endif
pascal@13269 34 lodsl // get chunkSize
pascal@13269 35 cmpl $ARCHIVE_MAGICNUMBER, %eax
pascal@13269 36 je lz4main
pascal@13269 37 orl %eax, %eax // end of file ?
pascal@13269 38 je lz4quit
pascal@13269 39 xchgl %eax, %edx
pascal@13269 40 lz4chunk: // uncompress chunk
pascal@13269 41 lodsb // get token
pascal@25487 42 movb %al, %bl
pascal@13269 43 shrb $4, %al
pascal@13269 44 call lz4len // get literal length, %eax < 255
pascal@25487 45 subl %ecx, %edx // count literal
pascal@25487 46 subl $1+2, %edx // count token & string address
pascal@25487 47 #if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@25487 48 pushf
pascal@13269 49 call lz4mov // copy literals
pascal@13269 50 popf
pascal@25487 51 #else
pascal@25487 52 rep movsb
pascal@25487 53 #endif
pascal@25487 54 jle lz4main
pascal@13269 55 lodsw // get string address
pascal@25487 56 xchgw %ax, %bx
pascal@13269 57 call lz4len // get string length
pascal@25487 58 add $4, CX
pascal@25487 59 #if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@13269 60 pushw %ds
pascal@13269 61 pushw %si
pascal@25487 62 movw %di, %si
pascal@25487 63 subw %bx, %si
pascal@25487 64 movw %es, %ax
pascal@25487 65 jnc axok
pascal@25487 66 subb $0x10, %ah
pascal@25487 67 axok:
pascal@25487 68 movw %ax, %ds
pascal@25487 69 call lz4mov // copy string
pascal@13269 70 popw %si
pascal@13269 71 popw %ds
pascal@13269 72 #else
pascal@25487 73 xchg AX, SI
pascal@25487 74 mov DI, SI
pascal@25487 75 sub BX, SI
pascal@25487 76 rep movsb %es(SI), %es(DI)
pascal@25487 77 xchg AX, SI
pascal@13269 78 #endif
pascal@13269 79 jmp lz4chunk
pascal@13269 80
pascal@25487 81 #if !defined(FLAT32) && !defined(FLAT16OUT)
pascal@25487 82 # if defined(PARANOIA)
pascal@25487 83 lz4movlp:
pascal@25487 84 xchgw %ax, %cx
pascal@25487 85 movw $0x3C00, %cx
pascal@25487 86 rep movsl
pascal@25487 87 xchgw %ax, %cx
pascal@25487 88 sub $0xF0, %ch
pascal@25487 89 # endif
pascal@25487 90 lz4mov:
pascal@25487 91 movw %di, %ax
pascal@25487 92 andw $0xF, %di
pascal@25487 93 shrw $4, %ax
pascal@25487 94 movw %es, %bp
pascal@25487 95 addw %ax, %bp
pascal@25487 96 movw %bp, %es
pascal@25487 97 movw %si, %ax
pascal@25487 98 andw $0xF, %si
pascal@25487 99 shrw $4, %ax
pascal@25487 100 movw %ds, %bp
pascal@25487 101 addw %ax, %bp
pascal@25487 102 movw %bp, %ds
pascal@25487 103 # if defined(PARANOIA)
pascal@25487 104 cmp $0xFF, %ch // catch FFFX case
pascal@25487 105 jz lz4movlp
pascal@25487 106 # endif
pascal@25487 107 rep movsb
pascal@25487 108 ret
pascal@25487 109 #endif
pascal@25487 110
pascal@13269 111 lz4len: // get length in %ecx
pascal@13269 112 andl $0xF, %eax
pascal@13269 113 movl %eax, %ecx
pascal@13269 114 cmpb $0xF, %al
pascal@13269 115 jne lz4quit
pascal@13269 116 lz4len2:
pascal@13269 117 lodsb
pascal@13269 118 decl %edx // remaining chunk size
pascal@25487 119 addw %ax, %cx
pascal@13269 120 cmpb $0xFF, %al
pascal@13269 121 je lz4len2
pascal@13269 122 lz4quit:
pascal@13269 123 ret
pascal@13269 124