Re: Fastcode CharPosRev B&V 0.6.2



Here's my first MMX version:-

function CharPosRev_JOH_MMX_1_a(SearchChar : Char; const S: string) :
Integer;
asm {132 Bytes}
test edx, edx {S = nil?}
jz @@NotFound {Yes, Exit with Result = 0}
mov ecx, eax {SearchChar}
mov eax, [edx-4] {Length(S)}
cmp eax, 16
jg @@Large {Length(S)>32}
@@Loop:
cmp cl, [eax+edx-1] {Check Next Character from End}
je @@1 {Exit on Match}
cmp cl, [eax+edx-2] {Check Character Before}
je @@2 {Exit on Match}
cmp cl, [eax+edx-3] {Check Character Before}
je @@3 {Exit on Match}
cmp cl, [eax+edx-4] {Check Character Before}
je @@4 {Exit on Match}
sub eax, 4 {All Characters Checked?}
jg @@Loop {No, Loop}
@@NotFound:
xor eax, eax {Result := 0}
ret
@@4:
dec eax
@@3:
dec eax
@@2:
dec eax
js @@NotFound {Match Found before First Char}
@@1:
ret
@@Large:
mov ch, cl
movd mm0, ecx
pshufw mm0, mm0, 0 {All 8 Bytes of mm0 = cl}
movq mm1, [eax+edx-8]{Check Last 8 Characters}
pcmpeqb mm1, mm0
packsswb mm1, mm1
movd ecx, mm1
test ecx, ecx {Match Found?}
jnz @@Match {Yes, Calc Result}
add eax, edx {QWORD Align [eax+edx]}
and eax, -8
sub eax, edx
@@LargeLoop:
movq mm1, [eax+edx-8]{Check 8 Chars per Loop}
pcmpeqb mm1, mm0
packsswb mm1, mm1
movd ecx, mm1
test ecx, ecx {Match Found?}
jnz @@Match {Yes, Calc Result}
sub eax, 8
jnz @@LargeLoop
emms
ret {Return 0}
@@Match:
emms
bsr ecx, ecx {Set Match Offset}
shr ecx, 1 {Calculate Result}
adc eax, -7
shr ecx, 2
lea eax, [eax+ecx*2]
end;



--
regards,
John

The Fastcode Project:
http://www.fastcodeproject.org/


.


Quantcast