Don't run tests checking xecutable stack when SELinux is enforcing.
[glibc.git] / sysdeps / x86_64 / memcmp.S
bloba9fe13ae5822779726499d5d2af6fea9e5365484
1 /* memcmp with SSE2
2    Copyright (C) 2009 Free Software Foundation, Inc.
3    Contributed by Intel Corporation.
4    This file is part of the GNU C Library.
6    The GNU C Library is free software; you can redistribute it and/or
7    modify it under the terms of the GNU Lesser General Public
8    License as published by the Free Software Foundation; either
9    version 2.1 of the License, or (at your option) any later version.
11    The GNU C Library is distributed in the hope that it will be useful,
12    but WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
16    You should have received a copy of the GNU Lesser General Public
17    License along with the GNU C Library; if not, write to the Free
18    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19    02111-1307 USA.  */
21 #include <sysdep.h>
23         .text
24 ENTRY (memcmp)
25         test    %rdx, %rdx
26         jz      L(finz)
27         cmpq    $1, %rdx
28         jle     L(finr1b)
29         subq    %rdi, %rsi
30         movq    %rdx, %r10
31         cmpq    $32, %r10
32         jge     L(gt32)
33         /* Handle small chunks and last block of less than 32 bytes.  */
34 L(small):
35         testq   $1, %r10
36         jz      L(s2b)
37         movzbl  (%rdi), %eax
38         movzbl  (%rdi, %rsi), %edx
39         subq    $1, %r10
40         je      L(finz1)
41         addq    $1, %rdi
42         subl    %edx, %eax
43         jnz     L(exit)
44 L(s2b):
45         testq   $2, %r10
46         jz      L(s4b)
47         movzwl  (%rdi), %eax
48         movzwl  (%rdi, %rsi), %edx
49         subq    $2, %r10
50         je      L(fin2_7)
51         addq    $2, %rdi
52         cmpl    %edx, %eax
53         jnz     L(fin2_7)
54 L(s4b):
55         testq   $4, %r10
56         jz      L(s8b)
57         movl    (%rdi), %eax
58         movl    (%rdi, %rsi), %edx
59         subq    $4, %r10
60         je      L(fin2_7)
61         addq    $4, %rdi
62         cmpl    %edx, %eax
63         jnz     L(fin2_7)
64 L(s8b):
65         testq   $8, %r10
66         jz      L(s16b)
67         movq    (%rdi), %rax
68         movq    (%rdi, %rsi), %rdx
69         subq    $8, %r10
70         je      L(fin2_7)
71         addq    $8, %rdi
72         cmpq    %rdx, %rax
73         jnz     L(fin2_7)
74 L(s16b):
75         movdqu    (%rdi), %xmm1
76         movdqu    (%rdi, %rsi), %xmm0
77         pcmpeqb   %xmm0, %xmm1
78         pmovmskb  %xmm1, %edx
79         xorl      %eax, %eax
80         subl      $0xffff, %edx
81         jz        L(finz)
82         bsfl      %edx, %ecx
83         leaq     (%rdi, %rcx), %rcx
84         movzbl   (%rcx), %eax
85         movzbl   (%rsi, %rcx), %edx
86         jmp      L(finz1)
88         .p2align 4,, 4
89 L(finr1b):
90         movzbl  (%rdi), %eax
91         movzbl  (%rsi), %edx
92 L(finz1):
93         subl    %edx, %eax
94 L(exit):
95         ret
97         .p2align 4,, 4
98 L(fin2_7):
99         cmpq    %rdx, %rax
100         jz      L(finz)
101         movq    %rax, %r11
102         subq    %rdx, %r11
103         bsfq    %r11, %rcx
104         sarq    $3, %rcx
105         salq    $3, %rcx
106         sarq    %cl, %rax
107         movzbl  %al, %eax
108         sarq    %cl, %rdx
109         movzbl  %dl, %edx
110         subl    %edx, %eax
111         ret
113         .p2align 4,, 4
114 L(finz):
115         xorl    %eax, %eax
116         ret
118         /* For blocks bigger than 32 bytes
119            1. Advance one of the addr pointer to be 16B aligned.
120            2. Treat the case of both addr pointers aligned to 16B
121               separately to avoid movdqu.
122            3. Handle any blocks of greater than 64 consecutive bytes with
123               unrolling to reduce branches.
124            4. At least one addr pointer is 16B aligned, use memory version
125               of pcmbeqb.
126         */
127         .p2align 4,, 4
128 L(gt32):
129         movq    %rdx, %r11
130         addq    %rdi, %r11
131         movq    %rdi, %r8
133         andq    $15, %r8
134         jz      L(16am)
135         /* Both pointers may be misaligned.  */
136         movdqu  (%rdi), %xmm1
137         movdqu  (%rdi, %rsi), %xmm0
138         pcmpeqb   %xmm0, %xmm1
139         pmovmskb  %xmm1, %edx
140         subl      $0xffff, %edx
141         jnz       L(neq)
142         neg      %r8
143         leaq    16(%rdi, %r8), %rdi
144 L(16am):
145         /* Handle two 16B aligned pointers separately.  */
146         testq   $15, %rsi
147         jz      L(ATR)
148         testq   $16, %rdi
149         jz      L(A32)
150         movdqu  (%rdi, %rsi), %xmm0
151         pcmpeqb   (%rdi), %xmm0
152         pmovmskb  %xmm0, %edx
153         subl      $0xffff, %edx
154         jnz       L(neq)
155         addq    $16, %rdi
156 L(A32):
157         movq    %r11, %r10
158         andq    $-32, %r10
159         cmpq    %r10, %rdi
160         jge     L(mt16)
161         /* Pre-unroll to be ready for unrolled 64B loop.  */
162         testq   $32, %rdi
163         jz      L(A64)
164         movdqu    (%rdi,%rsi), %xmm0
165         pcmpeqb   (%rdi), %xmm0
166         pmovmskb  %xmm0, %edx
167         subl      $0xffff, %edx
168         jnz       L(neq)
169         addq       $16, %rdi
171         movdqu    (%rdi,%rsi), %xmm0
172         pcmpeqb  (%rdi), %xmm0
173         pmovmskb  %xmm0, %edx
174         subl      $0xffff, %edx
175         jnz       L(neq)
176         addq       $16, %rdi
178 L(A64):
179         movq    %r11, %r10
180         andq    $-64, %r10
181         cmpq    %r10, %rdi
182         jge     L(mt32)
184 L(A64main):
185         movdqu    (%rdi,%rsi), %xmm0
186         pcmpeqb   (%rdi), %xmm0
187         pmovmskb  %xmm0, %edx
188         subl      $0xffff, %edx
189         jnz       L(neq)
190         addq       $16, %rdi
192         movdqu    (%rdi,%rsi), %xmm0
193         pcmpeqb   (%rdi), %xmm0
194         pmovmskb  %xmm0, %edx
195         subl      $0xffff, %edx
196         jnz       L(neq)
197         addq       $16, %rdi
199         movdqu    (%rdi,%rsi), %xmm0
200         pcmpeqb   (%rdi), %xmm0
201         pmovmskb  %xmm0, %edx
202         subl      $0xffff, %edx
203         jnz       L(neq)
204         addq       $16, %rdi
206         movdqu    (%rdi,%rsi), %xmm0
207         pcmpeqb  (%rdi), %xmm0
208         pmovmskb  %xmm0, %edx
209         subl      $0xffff, %edx
210         jnz       L(neq)
211         addq       $16, %rdi
213         cmpq       %rdi, %r10
214         jne       L(A64main)
216 L(mt32):
217         movq    %r11, %r10
218         andq    $-32, %r10
219         cmpq    %r10, %rdi
220         jge     L(mt16)
222 L(A32main):
223         movdqu    (%rdi,%rsi), %xmm0
224         pcmpeqb   (%rdi), %xmm0
225         pmovmskb  %xmm0, %edx
226         subl      $0xffff, %edx
227         jnz       L(neq)
228         addq       $16, %rdi
230         movdqu    (%rdi,%rsi), %xmm0
231         pcmpeqb  (%rdi), %xmm0
232         pmovmskb  %xmm0, %edx
233         subl      $0xffff, %edx
234         jnz       L(neq)
235         addq       $16, %rdi
237         cmpq       %rdi, %r10
238         jne       L(A32main)
239 L(mt16):
240         subq       %rdi, %r11
241         je        L(finz)
242         movq      %r11, %r10
243         jmp       L(small)
245         .p2align 4,, 4
246 L(neq):
247         bsfl      %edx, %ecx
248         movzbl   (%rdi, %rcx), %eax
249         addq     %rdi, %rsi
250         movzbl   (%rsi,%rcx), %edx
251         jmp      L(finz1)
253         .p2align 4,, 4
254 L(ATR):
255         movq    %r11, %r10
256         andq    $-32, %r10
257         cmpq    %r10, %rdi
258         jge     L(mt16)
259         testq   $16, %rdi
260         jz      L(ATR32)
262         movdqa    (%rdi,%rsi), %xmm0
263         pcmpeqb   (%rdi), %xmm0
264         pmovmskb  %xmm0, %edx
265         subl      $0xffff, %edx
266         jnz       L(neq)
267         addq       $16, %rdi
268         cmpq       %rdi, %r10
269         je       L(mt16)
271 L(ATR32):
272         movq    %r11, %r10
273         andq    $-64, %r10
274         testq   $32, %rdi
275         jz      L(ATR64)
277         movdqa    (%rdi,%rsi), %xmm0
278         pcmpeqb   (%rdi), %xmm0
279         pmovmskb  %xmm0, %edx
280         subl      $0xffff, %edx
281         jnz       L(neq)
282         addq       $16, %rdi
284         movdqa    (%rdi,%rsi), %xmm0
285         pcmpeqb   (%rdi), %xmm0
286         pmovmskb  %xmm0, %edx
287         subl      $0xffff, %edx
288         jnz       L(neq)
289         addq       $16, %rdi
291 L(ATR64):
292         cmpq       %rdi, %r10
293         je         L(mt32)
295 L(ATR64main):
296         movdqa    (%rdi,%rsi), %xmm0
297         pcmpeqb   (%rdi), %xmm0
298         pmovmskb  %xmm0, %edx
299         subl      $0xffff, %edx
300         jnz       L(neq)
301         addq       $16, %rdi
303         movdqa    (%rdi,%rsi), %xmm0
304         pcmpeqb   (%rdi), %xmm0
305         pmovmskb  %xmm0, %edx
306         subl      $0xffff, %edx
307         jnz       L(neq)
308         addq       $16, %rdi
310         movdqa    (%rdi,%rsi), %xmm0
311         pcmpeqb   (%rdi), %xmm0
312         pmovmskb  %xmm0, %edx
313         subl      $0xffff, %edx
314         jnz       L(neq)
315         addq       $16, %rdi
317         movdqa    (%rdi,%rsi), %xmm0
318         pcmpeqb   (%rdi), %xmm0
319         pmovmskb  %xmm0, %edx
320         subl      $0xffff, %edx
321         jnz       L(neq)
322         addq       $16, %rdi
323         cmpq       %rdi, %r10
324         jne       L(ATR64main)
326         movq    %r11, %r10
327         andq    $-32, %r10
328         cmpq    %r10, %rdi
329         jge     L(mt16)
331 L(ATR32res):
332         movdqa    (%rdi,%rsi), %xmm0
333         pcmpeqb   (%rdi), %xmm0
334         pmovmskb  %xmm0, %edx
335         subl      $0xffff, %edx
336         jnz       L(neq)
337         addq       $16, %rdi
339         movdqa    (%rdi,%rsi), %xmm0
340         pcmpeqb   (%rdi), %xmm0
341         pmovmskb  %xmm0, %edx
342         subl      $0xffff, %edx
343         jnz       L(neq)
344         addq       $16, %rdi
346         cmpq      %r10, %rdi
347         jne       L(ATR32res)
349         subq       %rdi, %r11
350         je        L(finz)
351         movq      %r11, %r10
352         jmp       L(small)
353         /* Align to 16byte to improve instruction fetch.  */
354         .p2align 4,, 4
355 END(memcmp)
357 #undef bcmp
358 weak_alias (memcmp, bcmp)
359 libc_hidden_builtin_def (memcmp)