[ros-kernel] new strlen (correct)
Waldo Alvarez
wac at ghost.matcom.uh.cu
Fri Dec 19 13:04:55 CET 2003
Hi ppl:
I found how to fix this file after deling with it some time, I use a
previous alignment and now I save ebx, I still beleive some ticks can be
saved by means of a better scheduling inside the inner loop.
The file goes to lib\string\i386
The speed increase is huge in everythig you do, I beleive is because
the use of all those Debug Prints. It makes me think about chasing other
functions. BTW this function appears in the maps of ntoskrnl, ntdll,
msvcrt and crtdll. Why don't you make at least msvcrt and crtdll call the
one in ntdll. Some other string functions go to all of them too.
Best Regards
Waldo Alvarez
-------------- next part --------------
/* $Id: tcslen.h,v 1.1 2003/07/06 23:04:19 hyperion Exp $
*/
/* Synopsis: returns length of passed string
* Author(s): based on optimized Strlen by
* Agner Fog (agner at agner.org) http://www.agner.org
* modified by Jeremy Collake (lowercase code) to force dword alignment.
* Jeremy Collake (collake at charter.net) http://www.collakesoftware.com
* Adapted to ReactOS by Waldo Alvarez Ca?izares (wac at ghost.matcom.uh.cu)
* Notes:
* Todo: Apply this to the unicode version
*/
#include "tchar.h"
.globl _tcslen
_tcslen:
#ifdef _UNICODE
push %edi
mov 0x8(%esp), %edi
xor %eax, %eax
mov $0xffffffff, %ecx
mov %ecx, %edx
cld
repne _tscas
not %ecx
pop %edi
dec %ecx
mov %ecx, %eax
ret
#else
push %ebx
mov 0x8(%esp), %eax
mov %eax,%edx
inc %edx
test $3,%eax
je L1
// align memory
L0:
mov (%eax),%bl
add $1,%eax
test %bl,%bl
je L4
test $3,%eax
jne L0
L1:
add $2,%edx
L2:
mov (%eax),%ebx // read first 4 bytes
add $4,%eax // increment pointer
lea 0xfefefeff(%ebx),%ecx // substract 1 from each byte
not %ebx // invert all bytes
and %ebx,%ecx // and these two
and $0x80808080,%ecx // test all sign bits
jz L2
test $0x8080,%ecx // test first two bytes
jnz L3
shr $0x10,%ecx // not in the first 2 bytes
add $2,%eax
L3:
shl %cl // use carry flag to avoid branch
L4:
sbb %edx,%eax // compute length
pop %ebx
ret
#endif
/* EOF */
More information about the Ros-kernel
mailing list