mirror of
https://github.com/mtheall/decompress.git
synced 2025-06-18 18:55:41 -04:00
add lz11 in asm
This commit is contained in:
parent
6998252031
commit
1d8f654839
@ -8,6 +8,7 @@ void lzssDecompressASM(const u8 *src, u8 *dst, int size);
|
||||
void LZ77_Decompress(const u8 *src, u8 *dst);
|
||||
|
||||
void lz11Decompress(const u8 *src, u8 *dst, int size);
|
||||
void lz11DecompressASM(const u8 *src, u8 *dst, int size);
|
||||
|
||||
void rleDecompress(const u8 *src, u8 *dst, int size);
|
||||
void rleDecompressASM(const u8 *src, u8 *dst, int size);
|
||||
|
74
source/lz11_asm.s
Normal file
74
source/lz11_asm.s
Normal file
@ -0,0 +1,74 @@
|
||||
.arch armv5te
|
||||
|
||||
.arm
|
||||
.align 2
|
||||
.global lz11DecompressASM
|
||||
.type lz11DecompressASM, %function
|
||||
lz11DecompressASM:
|
||||
push {r4-r6}
|
||||
.Lmain_loop:
|
||||
ldrb r12, [r0], #1 @ flags = *in++
|
||||
mov r3, #0 @ i = 0
|
||||
|
||||
.Lsub_loop:
|
||||
cmp r2, #0 @ if(size <= 0)
|
||||
pople {r4-r6} @ pop stack
|
||||
bxle lr @ return
|
||||
|
||||
cmp r3, #8 @ if(i == 8)
|
||||
beq .Lmain_loop @ goto main_loop
|
||||
|
||||
tst r12, #0x80 @ if(flags & 0x80 != 0x80)
|
||||
lsl r12, r12, #1 @ (unconditionally) flags <<= 1
|
||||
beq .Lcopy_uncompressed @ goto copy_uncompressed
|
||||
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
and r5, r4, #0xF0 @ r5 = r4 & 0xF0
|
||||
cmp r5, #0x00 @ if(r5 == 0x00)
|
||||
beq .Lextended @ goto extended
|
||||
cmp r5, #0x10 @ if(r5 == 0x10)
|
||||
beq .LXextended @ goto Xextended
|
||||
|
||||
lsr r6, r4, #4 @ len = r4>>4
|
||||
add r6, r6, #1 @ len++
|
||||
b .L1
|
||||
|
||||
.Lextended:
|
||||
lsl r6, r4, #4 @ len = r4<<4
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
orr r6, r6, r4, lsr #4 @ len = len | (r4>>4)
|
||||
add r6, r6, #0x11 @ len += 0x11
|
||||
b .L1
|
||||
|
||||
.LXextended:
|
||||
and r4, r4, #0x0F @ r4 &= 0x0F
|
||||
lsl r6, r4, #12 @ len = r4<<12
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
orr r6, r6, r4, lsl #4 @ len |= r4<<4
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
orr r6, r6, r4, lsr #4 @ len |= r4>>4
|
||||
add r6, r6, #0x011 @ len += 0x011
|
||||
add r6, r6, #0x100 @ len += 0x100
|
||||
|
||||
.L1:
|
||||
and r5, r4, #0x0F @ disp = r4 & 0x0F note: disp is in r5
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
orr r4, r4, r5, lsl #8 @ disp = r4 | (disp<<8) note: disp changes to r4
|
||||
add r4, r4, #1 @ disp++
|
||||
sub r2, r2, r6 @ size -= len
|
||||
add r3, r3, #1 @ i++
|
||||
|
||||
.Lcopy_compressed:
|
||||
subs r6, r6, #1 @ if(len-- == 1)
|
||||
blt .Lsub_loop @ goto sub_loop
|
||||
ldrb r5, [r1, -r4] @ r5 = *(out - disp)
|
||||
strb r5, [r1], #1 @ *out++ = r5
|
||||
b .Lcopy_compressed @ goto copy_compressed
|
||||
|
||||
.Lcopy_uncompressed:
|
||||
ldrb r4, [r0], #1 @ r4 = *in++
|
||||
strb r4, [r1], #1 @ *out++ = r4
|
||||
add r3, r3, #1 @ i++
|
||||
sub r2, r2, #1 @ size--
|
||||
b .Lsub_loop @ goto sub_loop
|
||||
|
@ -184,6 +184,20 @@ void testLZ11(const u8 *in, const u8 *out) {
|
||||
FAIL(lz11_C);
|
||||
else
|
||||
PASS(lz11_C, timer);
|
||||
|
||||
/* LZ11 in asm */
|
||||
memset(buf, 0, SIZE);
|
||||
DC_FlushAll();
|
||||
DC_InvalidateAll();
|
||||
|
||||
cpuStartTiming(0);
|
||||
lz11DecompressASM(in+4, buf, SIZE);
|
||||
timer = cpuEndTiming();
|
||||
|
||||
if(memcmp(buf, out, SIZE))
|
||||
FAIL(lz11_asm);
|
||||
else
|
||||
PASS(lz11_asm, timer);
|
||||
}
|
||||
|
||||
void testRLE(const u8 *in, const u8 *out) {
|
||||
|
Loading…
Reference in New Issue
Block a user