source: trunk/libs/newlib/src/newlib/libc/machine/i386/strlen.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 1.5 KB
Line 
1/*
2 * ====================================================
3 * Copyright (C) 1998, 2002, 2008 by Red Hat Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and distribute this
6 * software is freely granted, provided that this notice
7 * is preserved.
8 * ====================================================
9 */
10
11        #include "i386mach.h"
12
13        .global SYM (strlen)
14       SOTYPE_FUNCTION(strlen)
15
16SYM (strlen):
17
18        pushl ebp
19        movl esp,ebp
20        pushl edi
21#ifdef __iamcu__
22        movl eax,edx
23#else
24        movl 8(ebp),edx
25#endif
26
27#if defined __OPTIMIZE_SIZE__ || defined __iamcu__
28        cld
29        movl edx,edi
30        movl $4294967295,ecx
31        xor eax,eax
32        repnz
33        scasb
34#else
35/* Modern x86 hardware is much faster at double-word
36   manipulation than with bytewise repnz scasb.  */
37
38/* Do byte-wise checks until string is aligned.  */
39        movl edx,edi
40        test $3,edi
41        je L5
42        movb (edi),cl
43        incl edi
44        testb cl,cl
45        je L15
46
47        test $3,edi
48        je L5
49        movb (edi),cl
50        incl edi
51        testb cl,cl
52        je L15
53
54        test $3,edi
55        je L5
56        movb (edi),cl
57        incl edi
58        testb cl,cl
59        je L15
60
61L5:
62        subl $4,edi
63
64/* loop performing 4 byte mask checking for desired 0 byte */
65        .p2align 4,,7
66L10:
67        addl $4,edi
68        movl (edi),ecx
69        leal -16843009(ecx),eax
70        notl ecx
71        andl ecx,eax
72        testl $-2139062144,eax
73        je L10
74
75/* Find which of four bytes is 0.  */
76        notl ecx
77        incl edi
78
79        testb cl,cl
80        je L15
81        incl edi
82        shrl $8,ecx
83
84        testb cl,cl
85        je L15
86        incl edi
87        shrl $8,ecx
88
89        testb cl,cl
90        je L15
91        incl edi
92
93#endif
94
95L15:
96        subl edx,edi
97        leal -1(edi),eax
98
99        leal -4(ebp),esp
100        popl edi
101        leave
102        ret
Note: See TracBrowser for help on using the repository browser.