clarify the purpose of this project
[nyanglibc.git] / string / rtld-strnlen.shared.s
blobb870ad58bd1c43891dd9d0cda59fdc18214d3a6e
1 .text
2 .globl __strnlen
3 .type __strnlen,@function
4 .align 1<<4
5 __strnlen:
6 test %rsi, %rsi
7 jne .Ln_nonzero
8 xor %rax, %rax
9 ret
10 .Ln_nonzero:
11 add %rdi, %rsi
12 mov %rsi, %r10
13 and $-64, %r10
14 mov %rsi, %r11
15 pxor %xmm0, %xmm0
16 pxor %xmm1, %xmm1
17 pxor %xmm2, %xmm2
18 pxor %xmm3, %xmm3
19 movq %rdi, %rax
20 movq %rdi, %rcx
21 andq $4095, %rcx
22 cmpq $4047, %rcx
23 ja .Lcross_page
24 andq $-16, %rax
25 pcmpeqb (%rax), %xmm0
26 pcmpeqb 16(%rax), %xmm1
27 pcmpeqb 32(%rax), %xmm2
28 pcmpeqb 48(%rax), %xmm3
29 pmovmskb %xmm0, %esi
30 pmovmskb %xmm1, %edx
31 pmovmskb %xmm2, %r8d
32 pmovmskb %xmm3, %ecx
33 salq $16, %rdx
34 salq $16, %rcx
35 orq %rsi, %rdx
36 orq %r8, %rcx
37 salq $32, %rcx
38 orq %rcx, %rdx
39 movq %rdi, %rcx
40 xorq %rax, %rcx
41 mov %r11, %rsi
42 subq %rax, %rsi
43 andq $-64, %rax
44 testq $-64, %rsi
45 je .Lstrnlen_ret
46 sarq %cl, %rdx
47 test %rdx, %rdx
48 je .Lloop
49 bsfq %rdx, %rax
50 ret
51 .p2align 4
52 .Lcross_page:
53 andq $-64, %rax
54 pcmpeqb (%rax), %xmm0
55 pcmpeqb 16(%rax), %xmm1
56 pcmpeqb 32(%rax), %xmm2
57 pcmpeqb 48(%rax), %xmm3
58 pmovmskb %xmm0, %esi
59 pmovmskb %xmm1, %edx
60 pmovmskb %xmm2, %r8d
61 pmovmskb %xmm3, %ecx
62 salq $16, %rdx
63 salq $16, %rcx
64 orq %rsi, %rdx
65 orq %r8, %rcx
66 salq $32, %rcx
67 orq %rcx, %rdx
68 movq %rdi, %rcx
69 xorq %rax, %rcx
70 mov %r11, %rsi
71 subq %rax, %rsi
72 andq $-64, %rax
73 testq $-64, %rsi
74 je .Lstrnlen_ret
75 sarq %cl, %rdx
76 test %rdx, %rdx
77 je .Lloop_init
78 bsfq %rdx, %rax
79 ret
80 .Lstrnlen_ret:
81 bts %rsi, %rdx
82 sarq %cl, %rdx
83 test %rdx, %rdx
84 je .Lloop_init
85 bsfq %rdx, %rax
87 ret
88 .p2align 4
89 .Lloop_init:
90 pxor %xmm1, %xmm1
91 pxor %xmm2, %xmm2
92 pxor %xmm3, %xmm3
93 .p2align 4
94 .Lloop:
95 addq $64, %rax
96 cmpq %rax, %r10
97 je .Lexit_end
98 movdqa (%rax), %xmm0
99 pminub 16(%rax), %xmm0
100 pminub 32(%rax), %xmm0
101 pminub 48(%rax), %xmm0
102 pcmpeqb %xmm3, %xmm0
103 pmovmskb %xmm0, %edx
104 testl %edx, %edx
105 jne .Lexit
106 jmp .Lloop
107 .p2align 4
108 .Lexit_end:
109 cmp %rax, %r11
110 je .Lfirst
111 pxor %xmm0, %xmm0
112 pcmpeqb (%rax), %xmm0
113 pcmpeqb 16(%rax), %xmm1
114 pcmpeqb 32(%rax), %xmm2
115 pcmpeqb 48(%rax), %xmm3
116 pmovmskb %xmm0, %esi
117 pmovmskb %xmm1, %edx
118 pmovmskb %xmm2, %r8d
119 pmovmskb %xmm3, %ecx
120 salq $16, %rdx
121 salq $16, %rcx
122 orq %rsi, %rdx
123 orq %r8, %rcx
124 salq $32, %rcx
125 orq %rcx, %rdx
126 .Lfirst:
127 bts %r11, %rdx
128 bsfq %rdx, %rdx
129 addq %rdx, %rax
130 subq %rdi, %rax
133 .p2align 4
134 .Lexit:
135 pxor %xmm0, %xmm0
136 pcmpeqb (%rax), %xmm0; pcmpeqb 16(%rax), %xmm1; pcmpeqb 32(%rax), %xmm2; pcmpeqb 48(%rax), %xmm3; pmovmskb %xmm0, %esi; pmovmskb %xmm1, %edx; pmovmskb %xmm2, %r8d; pmovmskb %xmm3, %ecx; salq $16, %rdx; salq $16, %rcx; orq %rsi, %rdx; orq %r8, %rcx; salq $32, %rcx; orq %rcx, %rdx;
137 bsfq %rdx, %rdx
138 addq %rdx, %rax
139 subq %rdi, %rax
142 .size __strnlen,.-__strnlen
144 .weak strnlen
145 strnlen = __strnlen