mirror of
https://github.com/LNH-team/pico-loader.git
synced 2026-06-02 09:16:49 +02:00
Initial commit
This commit is contained in:
141
arm9/source/fastSearch.s
Normal file
141
arm9/source/fastSearch.s
Normal file
@@ -0,0 +1,141 @@
|
||||
.section ".itcm", "ax"
|
||||
.arm
|
||||
|
||||
// r0: data
|
||||
// r1: size
|
||||
// r2: pattern (4 words, each word should be unique)
|
||||
.global fastSearch16
|
||||
.type fastSearch16, %function
|
||||
fastSearch16:
|
||||
push {r4-r11,lr}
|
||||
add r1, r1, r0
|
||||
sub r1, r1, #44 // 32 bytes to load at once + 12 bytes after it
|
||||
ldmia r2, {r2-r5}
|
||||
|
||||
1:
|
||||
ldmia r0!, {r6-r12,lr}
|
||||
cmp r6, r2
|
||||
cmpne r7, r2
|
||||
cmpne r8, r2
|
||||
cmpne r9, r2
|
||||
cmpne r10, r2
|
||||
cmpne r11, r2
|
||||
cmpne r12, r2
|
||||
cmpne lr, r2
|
||||
beq fastSearch16_firstWordMatch
|
||||
fastSearch16_continueFastSearch:
|
||||
cmp r0, r1
|
||||
ble 1b
|
||||
|
||||
// only need to handle the last couple of words now
|
||||
add r1, #(44 - 16)
|
||||
2:
|
||||
ldr r6, [r0], #4
|
||||
cmp r6, r2
|
||||
beq fastSearch16_firstWordMatchLast
|
||||
fastSearch16_continueLastSearch:
|
||||
cmp r0, r1
|
||||
ble 2b
|
||||
|
||||
mov r0, #0
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatchLast:
|
||||
ldr r6, [r0], #4
|
||||
cmp r6, r3
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r4
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r5
|
||||
bne fastSearch16_continueLastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch:
|
||||
cmp r6, r2
|
||||
beq fastSearch16_firstWordMatch_r6
|
||||
cmpne r7, r2
|
||||
beq fastSearch16_firstWordMatch_r7
|
||||
cmpne r8, r2
|
||||
beq fastSearch16_firstWordMatch_r8
|
||||
cmpne r9, r2
|
||||
beq fastSearch16_firstWordMatch_r9
|
||||
cmpne r10, r2
|
||||
beq fastSearch16_firstWordMatch_r10
|
||||
cmpne r11, r2
|
||||
beq fastSearch16_firstWordMatch_r11
|
||||
cmpne r12, r2
|
||||
beq fastSearch16_firstWordMatch_r12
|
||||
fastSearch16_firstWordMatch_lr:
|
||||
ldr r6, [r0], #4
|
||||
cmp r6, r3
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r4
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r6:
|
||||
sub r0, r0, #16
|
||||
cmp r7, r3
|
||||
cmpeq r8, r4
|
||||
cmpeq r9, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r7:
|
||||
sub r0, r0, #12
|
||||
cmp r8, r3
|
||||
cmpeq r9, r4
|
||||
cmpeq r10, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r8:
|
||||
sub r0, r0, #8
|
||||
cmp r9, r3
|
||||
cmpeq r10, r4
|
||||
cmpeq r11, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r9:
|
||||
sub r0, r0, #4
|
||||
cmp r10, r3
|
||||
cmpeq r11, r4
|
||||
cmpeq r12, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r10:
|
||||
cmp r11, r3
|
||||
cmpeq r12, r4
|
||||
cmpeq lr, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r11:
|
||||
cmp r12, r3
|
||||
cmpeq lr, r4
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
|
||||
fastSearch16_firstWordMatch_r12:
|
||||
cmp lr, r3
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r4
|
||||
ldreq r6, [r0], #4
|
||||
cmpeq r6, r5
|
||||
bne fastSearch16_continueFastSearch
|
||||
sub r0, r0, #16
|
||||
pop {r4-r11,pc}
|
||||
Reference in New Issue
Block a user