mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 02:19:22 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
{
 | 
						|
    This file is part of the Free Pascal run time library.
 | 
						|
    Copyright (c) 1999-2000 by the Free Pascal development team
 | 
						|
 | 
						|
    Processor specific implementation of strpas
 | 
						|
 | 
						|
    See the file COPYING.FPC, included in this distribution,
 | 
						|
    for details about the copyright.
 | 
						|
 | 
						|
    This program is distributed in the hope that it will be useful,
 | 
						|
    but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 | 
						|
 | 
						|
 **********************************************************************}
 | 
						|
var
 | 
						|
  saveres,saveebx,saveesi,saveedi : longint;
 | 
						|
asm
 | 
						|
        movl    %ebx,saveebx
 | 
						|
        movl    %esi,saveesi
 | 
						|
        movl    %edi,saveedi
 | 
						|
{$ifdef regcall}
 | 
						|
        movl    p,%esi
 | 
						|
        movl    __RESULT,%edi
 | 
						|
        movl    %edi,saveres
 | 
						|
{$else}
 | 
						|
        movl    p,%esi
 | 
						|
{$endif}
 | 
						|
        movl    $1,%ecx
 | 
						|
        testl   %esi,%esi
 | 
						|
        movl    %esi,%eax
 | 
						|
        jz      .LStrPasDone
 | 
						|
{$ifndef REGCALL}
 | 
						|
        movl    __RESULT,%edi
 | 
						|
{$endif}
 | 
						|
        leal    3(%esi),%edx
 | 
						|
        andl    $-4,%edx
 | 
						|
        // skip length byte
 | 
						|
        incl    %edi
 | 
						|
        subl    %esi,%edx
 | 
						|
        jz      .LStrPasAligned
 | 
						|
        // align source to multiple of 4 (not dest, because we can't read past
 | 
						|
        // the end of the source, since that may be past the end of the heap
 | 
						|
        // -> sigsegv!!)
 | 
						|
.LStrPasAlignLoop:
 | 
						|
        movb    (%esi),%al
 | 
						|
        incl    %esi
 | 
						|
        testb   %al,%al
 | 
						|
        jz      .LStrPasDone
 | 
						|
        incl    %edi
 | 
						|
        incb    %cl
 | 
						|
        decb    %dl
 | 
						|
        movb    %al,-1(%edi)
 | 
						|
        jne     .LStrPasAlignLoop
 | 
						|
        .balign  16
 | 
						|
.LStrPasAligned:
 | 
						|
        movl    (%esi),%ebx
 | 
						|
        addl    $4,%edi
 | 
						|
        leal    0x0fefefeff(%ebx),%eax
 | 
						|
        movl    %ebx,%edx
 | 
						|
        addl    $4,%esi
 | 
						|
        notl    %edx
 | 
						|
        andl    %edx,%eax
 | 
						|
        addl    $4,%ecx
 | 
						|
        andl    $0x080808080,%eax
 | 
						|
        movl    %ebx,-4(%edi)
 | 
						|
        jnz     .LStrPasEndFound
 | 
						|
        cmpl    $252,%ecx
 | 
						|
        ja      .LStrPasPreEndLoop
 | 
						|
        jmp     .LStrPasAligned
 | 
						|
.LStrPasEndFound:
 | 
						|
        subl    $4,%ecx
 | 
						|
        // this won't overwrite data since the result = 255 char string
 | 
						|
        // and we never process more than the first 255 chars of p
 | 
						|
        shrl    $8,%eax
 | 
						|
        jc      .LStrPasDone
 | 
						|
        incl    %ecx
 | 
						|
        shrl    $8,%eax
 | 
						|
        jc      .LStrPasDone
 | 
						|
        incl    %ecx
 | 
						|
        shrl    $8,%eax
 | 
						|
        jc      .LStrPasDone
 | 
						|
        incl    %ecx
 | 
						|
        jmp     .LStrPasDone
 | 
						|
.LStrPasPreEndLoop:
 | 
						|
        testb   %cl,%cl
 | 
						|
        jz      .LStrPasDone
 | 
						|
        movl    (%esi),%eax
 | 
						|
.LStrPasEndLoop:
 | 
						|
        testb   %al,%al
 | 
						|
        jz      .LStrPasDone
 | 
						|
        movb    %al,(%edi)
 | 
						|
        shrl    $8,%eax
 | 
						|
        incl    %edi
 | 
						|
        incb    %cl
 | 
						|
        jnz     .LStrPasEndLoop
 | 
						|
.LStrPasDone:
 | 
						|
{$ifdef REGCALL}
 | 
						|
        movl    saveres,%edi
 | 
						|
{$else}
 | 
						|
        movl    __RESULT,%edi
 | 
						|
{$endif}
 | 
						|
        addb    $255,%cl
 | 
						|
        movb    %cl,(%edi)
 | 
						|
        movl    saveesi,%esi
 | 
						|
        movl    saveedi,%edi
 | 
						|
        movl    saveebx,%ebx
 | 
						|
end;
 | 
						|
 | 
						|
 |