[fpc-devel] Patch to speed up Uppercase/Lowercase functions
Martin Schreiber
fpmse at bluewin.ch
Sun Jun 12 14:06:35 CEST 2005
On Sunday 12 June 2005 08.48, Daniƫl Mantione wrote:
> I can't figure out...
loop:
//flags for chars $80..$ff are removed later so we have
// only to care about chars $00..$7f
ch1:=pinteger(p)^; //original char
ch3:=$7F7F7F7F; //msb remove mask
ch2:=ch1; //copy of original
ch3:=ch3 and ch1; //originalchars with msb 0 -> <= $7f
ch2:=ch2 xor (-1); //complement
ch3:=ch3 + $25252525; //msb 1 for all chars > $7f - $25 = $5a -> >'Z'
//$00..$5a -> $25..$7f
//$5b..$7f -> $80..$a4
ch2:=ch2 and $80808080; //msb 1 for all chars < $80
//to remove flags of chars > $7f
ch3:=ch3 and $7F7F7F7F; //(chars mod $80 + $25) mod $80
//$00..$5a -> $25..$7f
//$5b..$7f -> $80..$a4 -> $00..$24
ch3:=ch3 + $1A1A1A1A; //original + $25 + $1a = original + $3f
//-> msb 1 for all chars > $7f - $3f = $40 -> >='A'
//$00..$5a -> $25..$7f -> $3f..$99
// '@'
//$00..$40 -> $25..$65 -> $3f..$7f msb 0
//'A' 'Z'
//$41..$5a -> $66..$7f -> $80..$99 msb 1
//'['
//$5b..$7f -> $80..$a4 -> $00..$24 ->$1a..$3e msb 0
inc(p,4);
ch3:=ch3 and ch2;
//remove flags for chars > $7f, remove bit 0..6
if cardinal(p)>=cardinal(term) then goto last;
ch3:=ch3 shr 2; //$80 -> $20 -> shift 'A' to 'a'
ch1:=ch1 + ch3; //'A'..'Z' -> 'a'..'z'
pinteger(p+dist)^:=ch1;
goto loop;
Ingeniously!
Martin
More information about the fpc-devel
mailing list