[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