clarify the purpose of this project
[nyanglibc.git] / string / strlen.shared.s
blob52f828eb26380fc0232aa546f1bfd42bc2a4986b
1 .text
2 .globl strlen
3 .type strlen,@function
4 .align 1<<4
5 strlen:
6 pxor %xmm0, %xmm0
7 pxor %xmm1, %xmm1
8 pxor %xmm2, %xmm2
9 pxor %xmm3, %xmm3
10 movq %rdi, %rax
11 movq %rdi, %rcx
12 andq $4095, %rcx
13 cmpq $4047, %rcx
14 ja .Lcross_page
15 movdqu (%rax), %xmm4
16 pcmpeqb %xmm0, %xmm4
17 pmovmskb %xmm4, %edx
18 test %edx, %edx
19 je .Lnext48_bytes
20 bsf %edx, %eax
21 ret
22 .Lnext48_bytes:
23 andq $-16, %rax
24 pcmpeqb 16(%rax), %xmm1
25 pcmpeqb 32(%rax), %xmm2
26 pcmpeqb 48(%rax), %xmm3
27 pmovmskb %xmm1, %edx
28 pmovmskb %xmm2, %r8d
29 pmovmskb %xmm3, %ecx
30 salq $16, %rdx
31 salq $16, %rcx
32 orq %r8, %rcx
33 salq $32, %rcx
34 orq %rcx, %rdx
35 movq %rdi, %rcx
36 xorq %rax, %rcx
37 andq $-64, %rax
38 sarq %cl, %rdx
39 test %rdx, %rdx
40 je .Lloop
41 bsfq %rdx, %rax
43 ret
44 .p2align 4
45 .Lcross_page:
46 andq $-64, %rax
47 pcmpeqb (%rax), %xmm0
48 pcmpeqb 16(%rax), %xmm1
49 pcmpeqb 32(%rax), %xmm2
50 pcmpeqb 48(%rax), %xmm3
51 pmovmskb %xmm0, %esi
52 pmovmskb %xmm1, %edx
53 pmovmskb %xmm2, %r8d
54 pmovmskb %xmm3, %ecx
55 salq $16, %rdx
56 salq $16, %rcx
57 orq %rsi, %rdx
58 orq %r8, %rcx
59 salq $32, %rcx
60 orq %rcx, %rdx
61 movq %rdi, %rcx
62 xorq %rax, %rcx
63 andq $-64, %rax
64 sarq %cl, %rdx
65 test %rdx, %rdx
66 je .Lloop_init
67 bsfq %rdx, %rax
69 ret
70 .p2align 4
71 .Lloop_init:
72 pxor %xmm1, %xmm1
73 pxor %xmm2, %xmm2
74 pxor %xmm3, %xmm3
75 .p2align 4
76 .Lloop:
77 movdqa 64(%rax), %xmm0
78 pminub 80(%rax), %xmm0
79 pminub 96(%rax), %xmm0
80 pminub 112(%rax), %xmm0
81 pcmpeqb %xmm3, %xmm0
82 pmovmskb %xmm0, %edx
83 testl %edx, %edx
84 jne .Lexit64
85 subq $-128, %rax
86 movdqa (%rax), %xmm0
87 pminub 16(%rax), %xmm0
88 pminub 32(%rax), %xmm0
89 pminub 48(%rax), %xmm0
90 pcmpeqb %xmm3, %xmm0
91 pmovmskb %xmm0, %edx
92 testl %edx, %edx
93 jne .Lexit0
94 jmp .Lloop
95 .p2align 4
96 .Lexit64:
97 addq $64, %rax
98 .Lexit0:
99 pxor %xmm0, %xmm0
100 pcmpeqb (%rax), %xmm0
101 pcmpeqb 16(%rax), %xmm1
102 pcmpeqb 32(%rax), %xmm2
103 pcmpeqb 48(%rax), %xmm3
104 pmovmskb %xmm0, %esi
105 pmovmskb %xmm1, %edx
106 pmovmskb %xmm2, %r8d
107 pmovmskb %xmm3, %ecx
108 salq $16, %rdx
109 salq $16, %rcx
110 orq %rsi, %rdx
111 orq %r8, %rcx
112 salq $32, %rcx
113 orq %rcx, %rdx
114 bsfq %rdx, %rdx
115 addq %rdx, %rax
116 subq %rdi, %rax
118 .size strlen,.-strlen
119 .globl __GI_strlen
120 .set __GI_strlen,strlen