Comparing Identifiers

This function case insensitive compares two identifiers and returns false if they are not equal. Otherwise returns true and Id2 points to byte after its end. This function must be as fast as possible! It is called whenever Turbo Pascal needs to compare two identifiers.
Function IdentifiersEqual (Id1: PString; Var Id2: PString): Boolean;
begin
  IdentifiersEqual := False;
  Asm
    PUSH   DS
    LES    DI, Id2
    LDS    SI, ES:[DI]
    LES    DI, Id1
    LODSB
    SCASB
    JNE    @1
    MOV    CL, AL
    XOR    CH, CH
@2:
    LODSB
    XOR    AL, ES:[DI]
    INC    DI
    AND    AL, $DF
    LOOPZ  @2
    JNZ    @1
    INC    @Result
    LES    DI, Id2
    MOV    ES:[DI], SI
    MOV    ES:[DI + 2], DS
@1: POP    DS
  end;
end;
 
 
 
© 2017 Turbo Pascal | Privacy Policy