mirror of
https://github.com/libretro/scummvm.git
synced 2025-01-21 17:45:39 +00:00
Remove x86 ASM version of sykcpt code, just use the generic code everywhere
svn-id: r46574
This commit is contained in:
parent
6c0dc96fd3
commit
ddce48ed03
@ -26,143 +26,10 @@
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef _MSC_VER
|
||||
|
||||
__declspec(naked) void __fastcall KmpSearch::init(const char *subStr) {
|
||||
__asm {
|
||||
// kmp initialization, make jump table for mismatches
|
||||
push esi
|
||||
push edi
|
||||
push ebp
|
||||
push ebx
|
||||
push ecx
|
||||
|
||||
mov esi, edx // edx: subStr argument
|
||||
lea edi, [ecx + KmpSearch::_subStr] // this + 0x100
|
||||
lea ebx, [ecx + KmpSearch::_retarget] // this
|
||||
lea ebp, [ecx + 1]
|
||||
|
||||
mov byte ptr [ebx], -1
|
||||
|
||||
xor eax, eax
|
||||
|
||||
loopStart:
|
||||
shr ecx, 8
|
||||
test al, 3
|
||||
jnz short dontLoad
|
||||
mov ecx, dword ptr [esi + eax] // load next 4 bytes of subStr
|
||||
mov dword ptr [edi], ecx // and copy them to this._subStr while we're at it
|
||||
lea edi, [edi + 4]
|
||||
dontLoad:
|
||||
|
||||
or cl, cl // end of subStr?
|
||||
jz short endOfString
|
||||
|
||||
mov edx, eax // save counter (i) in edx
|
||||
|
||||
xlat // al = retarget[i]
|
||||
inc al
|
||||
mov byte ptr [ebp + edx], al // retarget[i + 1] = retarget[i] + 1
|
||||
jz short decLoopEnd
|
||||
decrementLoop:
|
||||
dec al
|
||||
mov ah, byte ptr [esi + eax] // ah = sub[retarget[i + 1] - 1]
|
||||
cmp ah, cl // if (ah == sub[i])
|
||||
jz short decLoopEnd // goto decLoopEnd
|
||||
|
||||
xlat // al = retarget[retarget[i + 1] - 1]
|
||||
xor ah, ah
|
||||
inc al // al = retarget[retarget[i + 1] - 1] + 1
|
||||
mov byte ptr [ebp + edx], al // retarget[i + 1] = al
|
||||
jnz short decrementLoop
|
||||
decLoopEnd:
|
||||
lea eax, [edx + 1] // i = i + 1
|
||||
jmp short loopStart
|
||||
|
||||
endOfString:
|
||||
|
||||
pop ecx // this
|
||||
mov [ecx + KmpSearch::_strLen], eax // length of substring (without '\0')
|
||||
|
||||
pop ebx
|
||||
pop ebp
|
||||
pop edi
|
||||
pop esi
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
__declspec(naked) const char * __fastcall KmpSearch::search(const char *str) {
|
||||
__asm {
|
||||
push esi
|
||||
push edi
|
||||
push ebx
|
||||
|
||||
mov esi, edx // edx: str argument
|
||||
lea edi, [ecx + KmpSearch::_subStr]
|
||||
lea ebx, [ecx + KmpSearch::_retarget]
|
||||
mov ch, byte ptr [ecx + KmpSearch::_strLen]
|
||||
|
||||
or ch, ch // if (_strLen == 0)
|
||||
jz short endOfString // goto endOfString
|
||||
|
||||
xor edx, edx // index
|
||||
|
||||
mov cl, 3
|
||||
searchLoop:
|
||||
shr eax, 8
|
||||
inc cl
|
||||
test cl, 4
|
||||
jz short skipRead
|
||||
lodsd
|
||||
xor cl, cl
|
||||
skipRead:
|
||||
|
||||
test al, al
|
||||
jz short endOfString
|
||||
|
||||
newIndexLoop:
|
||||
cmp al, byte ptr [edi + edx] // while (c != sub[index]) {
|
||||
jz short gotNewIndex
|
||||
or edx, edx // if (index == 0)
|
||||
jz short searchLoop // goto searchLoop
|
||||
movzx edx, byte ptr [ebx + edx] // index = retarget[index]
|
||||
jmp short newIndexLoop // }
|
||||
|
||||
gotNewIndex:
|
||||
inc edx
|
||||
cmp dl, ch // if (index != _strLen)
|
||||
jne short searchLoop // goto searchLoop
|
||||
|
||||
movzx ebx, cl // bytes of eax used
|
||||
movzx ecx, ch // length of subStr
|
||||
|
||||
lea eax, [esi + ebx - 3]
|
||||
sub eax, ecx
|
||||
|
||||
pop ebx
|
||||
pop edi
|
||||
pop esi
|
||||
ret
|
||||
|
||||
endOfString:
|
||||
xor eax, eax // return NULL
|
||||
pop ebx
|
||||
pop edi
|
||||
pop esi
|
||||
ret
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
void __fastcall KmpSearch::init(const char *subStr) {
|
||||
void KmpSearch::init(const char *subStr) {
|
||||
strcpy(_subStr, subStr);
|
||||
}
|
||||
|
||||
const char * __fastcall KmpSearch::search(const char *str) {
|
||||
const char *KmpSearch::search(const char *str) {
|
||||
return strstr(str, _subStr);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -23,17 +23,12 @@
|
||||
#ifndef __KmpSearch__
|
||||
#define __KmpSearch__
|
||||
|
||||
#ifndef _MSC_VER
|
||||
#define __fastcall
|
||||
#endif
|
||||
|
||||
class KmpSearch {
|
||||
public:
|
||||
void __fastcall init(const char *subStr);
|
||||
const char * __fastcall search(const char *str);
|
||||
//private:
|
||||
char _retarget[256], _subStr[256];
|
||||
unsigned long _strLen;
|
||||
void init(const char *subStr);
|
||||
const char *search(const char *str);
|
||||
private:
|
||||
char _subStr[256];
|
||||
};
|
||||
|
||||
#endif //__KmpSearch__
|
||||
|
Loading…
x
Reference in New Issue
Block a user