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