clarify the purpose of this project
[nyanglibc.git] / string / strchr.s
blob5e080809759aec2aa35e798feb503f9374f82ba6
1 .text
2 .globl strchr
3 .type strchr,@function
4 .align 1<<4
5 strchr:
6 movd %esi, %xmm1
7 movl %edi, %eax
8 andl $4095, %eax
9 punpcklbw %xmm1, %xmm1
10 cmpl $4032, %eax
11 punpcklwd %xmm1, %xmm1
12 pshufd $0, %xmm1, %xmm1
13 jg .Lcross_page
14 movdqu (%rdi), %xmm0
15 pxor %xmm3, %xmm3
16 movdqa %xmm0, %xmm4
17 pcmpeqb %xmm1, %xmm0
18 pcmpeqb %xmm3, %xmm4
19 por %xmm4, %xmm0
20 pmovmskb %xmm0, %eax
21 test %eax, %eax
22 je .Lnext_48_bytes
23 bsf %eax, %eax
24 movl $0, %edx
25 leaq (%rdi,%rax), %rax
26 cmpb %sil, (%rax)
27 cmovne %rdx, %rax
28 ret
29 .p2align 3
30 .Lnext_48_bytes:
31 movdqu 16(%rdi), %xmm0
32 movdqa %xmm0, %xmm4
33 pcmpeqb %xmm1, %xmm0
34 pcmpeqb %xmm3, %xmm4
35 por %xmm4, %xmm0
36 pmovmskb %xmm0, %ecx
37 movdqu 32(%rdi), %xmm0
38 movdqa %xmm0, %xmm4
39 pcmpeqb %xmm1, %xmm0
40 salq $16, %rcx
41 pcmpeqb %xmm3, %xmm4
42 por %xmm4, %xmm0
43 pmovmskb %xmm0, %eax
44 movdqu 48(%rdi), %xmm0
45 pcmpeqb %xmm0, %xmm3
46 salq $32, %rax
47 pcmpeqb %xmm1, %xmm0
48 orq %rcx, %rax
49 por %xmm3, %xmm0
50 pmovmskb %xmm0, %ecx
51 salq $48, %rcx
52 orq %rcx, %rax
53 testq %rax, %rax
54 jne .Lreturn
55 .Lloop_start:
56 .p2align 4
57 pxor %xmm6, %xmm6
58 andq $-64, %rdi
59 .p2align 3
60 .Lloop64:
61 addq $64, %rdi
62 movdqa (%rdi), %xmm5
63 movdqa 16(%rdi), %xmm2
64 movdqa 32(%rdi), %xmm3
65 pxor %xmm1, %xmm5
66 movdqa 48(%rdi), %xmm4
67 pxor %xmm1, %xmm2
68 pxor %xmm1, %xmm3
69 pminub (%rdi), %xmm5
70 pxor %xmm1, %xmm4
71 pminub 16(%rdi), %xmm2
72 pminub 32(%rdi), %xmm3
73 pminub %xmm2, %xmm5
74 pminub 48(%rdi), %xmm4
75 pminub %xmm3, %xmm5
76 pminub %xmm4, %xmm5
77 pcmpeqb %xmm6, %xmm5
78 pmovmskb %xmm5, %eax
79 testl %eax, %eax
80 je .Lloop64
81 movdqa (%rdi), %xmm5
82 movdqa %xmm5, %xmm0
83 pcmpeqb %xmm1, %xmm5
84 pcmpeqb %xmm6, %xmm0
85 por %xmm0, %xmm5
86 pcmpeqb %xmm6, %xmm2
87 pcmpeqb %xmm6, %xmm3
88 pcmpeqb %xmm6, %xmm4
89 pmovmskb %xmm5, %ecx
90 pmovmskb %xmm2, %eax
91 salq $16, %rax
92 pmovmskb %xmm3, %r8d
93 pmovmskb %xmm4, %edx
94 salq $32, %r8
95 orq %r8, %rax
96 orq %rcx, %rax
97 salq $48, %rdx
98 orq %rdx, %rax
99 .p2align 3
100 .Lreturn:
101 bsfq %rax, %rax
102 movl $0, %edx
103 leaq (%rdi,%rax), %rax
104 cmpb %sil, (%rax)
105 cmovne %rdx, %rax
107 .p2align 4
108 .Lcross_page:
109 movq %rdi, %rdx
110 pxor %xmm2, %xmm2
111 andq $-64, %rdx
112 movdqa %xmm1, %xmm0
113 movdqa (%rdx), %xmm3
114 movdqa %xmm3, %xmm4
115 pcmpeqb %xmm1, %xmm3
116 pcmpeqb %xmm2, %xmm4
117 por %xmm4, %xmm3
118 pmovmskb %xmm3, %r8d
119 movdqa 16(%rdx), %xmm3
120 movdqa %xmm3, %xmm4
121 pcmpeqb %xmm1, %xmm3
122 pcmpeqb %xmm2, %xmm4
123 por %xmm4, %xmm3
124 pmovmskb %xmm3, %eax
125 movdqa 32(%rdx), %xmm3
126 movdqa %xmm3, %xmm4
127 pcmpeqb %xmm1, %xmm3
128 salq $16, %rax
129 pcmpeqb %xmm2, %xmm4
130 por %xmm4, %xmm3
131 pmovmskb %xmm3, %r9d
132 movdqa 48(%rdx), %xmm3
133 pcmpeqb %xmm3, %xmm2
134 salq $32, %r9
135 pcmpeqb %xmm3, %xmm0
136 orq %r9, %rax
137 orq %r8, %rax
138 por %xmm2, %xmm0
139 pmovmskb %xmm0, %ecx
140 salq $48, %rcx
141 orq %rcx, %rax
142 movl %edi, %ecx
143 subb %dl, %cl
144 shrq %cl, %rax
145 testq %rax, %rax
146 jne .Lreturn
147 jmp .Lloop_start
148 .size strchr,.-strchr
149 .weak index
150 index = strchr