sparc64: Remove unwind information from signal return stubs [BZ#31244]
[glibc.git] / sysdeps / x86_64 / multiarch / strcat-sse2-unaligned.S
blob1da45e3969454de41f57de70429d0d85563a8328
1 /* strcat with SSE2
2    Copyright (C) 2011-2024 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
19 #include <isa-level.h>
21 /* MINIMUM_X86_ISA_LEVEL <= 2 because there is no V2 implementation
22    so we need this to build for ISA V2 builds. */
23 #if ISA_SHOULD_BUILD (2)
26 # include <sysdep.h>
28 # ifndef STRCAT
29 #  define STRCAT  __strcat_sse2_unaligned
30 # endif
32 # define USE_AS_STRCAT
34 .text
35 ENTRY (STRCAT)
36         mov     %rdi, %r9
37 # ifdef USE_AS_STRNCAT
38 #  ifdef __ILP32__
39         /* Clear the upper 32 bits.  */
40         movl    %edx, %edx
41 #  endif
42         mov     %rdx, %r8
43 # endif
45 /* Inline corresponding strlen file, temporary until new strcpy
46    implementation gets merged.  */
48         xor     %rax, %rax
49         mov     %edi, %ecx
50         and     $0x3f, %ecx
51         pxor    %xmm0, %xmm0
52         cmp     $0x30, %ecx
53         ja      L(next)
54         movdqu  (%rdi), %xmm1
55         pcmpeqb %xmm1, %xmm0
56         pmovmskb %xmm0, %edx
57         test    %edx, %edx
58         jnz     L(exit_less16)
59         mov     %rdi, %rax
60         and     $-16, %rax
61         jmp     L(align16_start)
62 L(next):
63         mov     %rdi, %rax
64         and     $-16, %rax
65         pcmpeqb (%rax), %xmm0
66         mov     $-1, %r10d
67         sub     %rax, %rcx
68         shl     %cl, %r10d
69         pmovmskb %xmm0, %edx
70         and     %r10d, %edx
71         jnz     L(exit)
73 L(align16_start):
74         pxor    %xmm0, %xmm0
75         pxor    %xmm1, %xmm1
76         pxor    %xmm2, %xmm2
77         pxor    %xmm3, %xmm3
78         pcmpeqb 16(%rax), %xmm0
79         pmovmskb %xmm0, %edx
80         test    %edx, %edx
81         jnz     L(exit16)
83         pcmpeqb 32(%rax), %xmm1
84         pmovmskb %xmm1, %edx
85         test    %edx, %edx
86         jnz     L(exit32)
88         pcmpeqb 48(%rax), %xmm2
89         pmovmskb %xmm2, %edx
90         test    %edx, %edx
91         jnz     L(exit48)
93         pcmpeqb 64(%rax), %xmm3
94         pmovmskb %xmm3, %edx
95         test    %edx, %edx
96         jnz     L(exit64)
98         pcmpeqb 80(%rax), %xmm0
99         add     $64, %rax
100         pmovmskb %xmm0, %edx
101         test    %edx, %edx
102         jnz     L(exit16)
104         pcmpeqb 32(%rax), %xmm1
105         pmovmskb %xmm1, %edx
106         test    %edx, %edx
107         jnz     L(exit32)
109         pcmpeqb 48(%rax), %xmm2
110         pmovmskb %xmm2, %edx
111         test    %edx, %edx
112         jnz     L(exit48)
114         pcmpeqb 64(%rax), %xmm3
115         pmovmskb %xmm3, %edx
116         test    %edx, %edx
117         jnz     L(exit64)
119         pcmpeqb 80(%rax), %xmm0
120         add     $64, %rax
121         pmovmskb %xmm0, %edx
122         test    %edx, %edx
123         jnz     L(exit16)
125         pcmpeqb 32(%rax), %xmm1
126         pmovmskb %xmm1, %edx
127         test    %edx, %edx
128         jnz     L(exit32)
130         pcmpeqb 48(%rax), %xmm2
131         pmovmskb %xmm2, %edx
132         test    %edx, %edx
133         jnz     L(exit48)
135         pcmpeqb 64(%rax), %xmm3
136         pmovmskb %xmm3, %edx
137         test    %edx, %edx
138         jnz     L(exit64)
140         pcmpeqb 80(%rax), %xmm0
141         add     $64, %rax
142         pmovmskb %xmm0, %edx
143         test    %edx, %edx
144         jnz     L(exit16)
146         pcmpeqb 32(%rax), %xmm1
147         pmovmskb %xmm1, %edx
148         test    %edx, %edx
149         jnz     L(exit32)
151         pcmpeqb 48(%rax), %xmm2
152         pmovmskb %xmm2, %edx
153         test    %edx, %edx
154         jnz     L(exit48)
156         pcmpeqb 64(%rax), %xmm3
157         pmovmskb %xmm3, %edx
158         test    %edx, %edx
159         jnz     L(exit64)
161         test    $0x3f, %rax
162         jz      L(align64_loop)
164         pcmpeqb 80(%rax), %xmm0
165         add     $80, %rax
166         pmovmskb %xmm0, %edx
167         test    %edx, %edx
168         jnz     L(exit)
170         test    $0x3f, %rax
171         jz      L(align64_loop)
173         pcmpeqb 16(%rax), %xmm1
174         add     $16, %rax
175         pmovmskb %xmm1, %edx
176         test    %edx, %edx
177         jnz     L(exit)
179         test    $0x3f, %rax
180         jz      L(align64_loop)
182         pcmpeqb 16(%rax), %xmm2
183         add     $16, %rax
184         pmovmskb %xmm2, %edx
185         test    %edx, %edx
186         jnz     L(exit)
188         test    $0x3f, %rax
189         jz      L(align64_loop)
191         pcmpeqb 16(%rax), %xmm3
192         add     $16, %rax
193         pmovmskb %xmm3, %edx
194         test    %edx, %edx
195         jnz     L(exit)
197         add     $16, %rax
198         .p2align 4
199         L(align64_loop):
200         movaps  (%rax), %xmm4
201         pminub  16(%rax),       %xmm4
202         movaps  32(%rax),       %xmm5
203         pminub  48(%rax),       %xmm5
204         add     $64,    %rax
205         pminub  %xmm4,  %xmm5
206         pcmpeqb %xmm0,  %xmm5
207         pmovmskb %xmm5, %edx
208         test    %edx,   %edx
209         jz      L(align64_loop)
211         pcmpeqb -64(%rax), %xmm0
212         sub     $80,    %rax
213         pmovmskb %xmm0, %edx
214         test    %edx, %edx
215         jnz     L(exit16)
217         pcmpeqb 32(%rax), %xmm1
218         pmovmskb %xmm1, %edx
219         test    %edx, %edx
220         jnz     L(exit32)
222         pcmpeqb 48(%rax), %xmm2
223         pmovmskb %xmm2, %edx
224         test    %edx, %edx
225         jnz     L(exit48)
227         pcmpeqb 64(%rax), %xmm3
228         pmovmskb %xmm3, %edx
229         sub     %rdi, %rax
230         bsf     %rdx, %rdx
231         add     %rdx, %rax
232         add     $64, %rax
233         jmp     L(StartStrcpyPart)
235         .p2align 4
236 L(exit):
237         sub     %rdi, %rax
238 L(exit_less16):
239         bsf     %rdx, %rdx
240         add     %rdx, %rax
241         jmp     L(StartStrcpyPart)
243         .p2align 4
244 L(exit16):
245         sub     %rdi, %rax
246         bsf     %rdx, %rdx
247         add     %rdx, %rax
248         add     $16, %rax
249         jmp     L(StartStrcpyPart)
251         .p2align 4
252 L(exit32):
253         sub     %rdi, %rax
254         bsf     %rdx, %rdx
255         add     %rdx, %rax
256         add     $32, %rax
257         jmp     L(StartStrcpyPart)
259         .p2align 4
260 L(exit48):
261         sub     %rdi, %rax
262         bsf     %rdx, %rdx
263         add     %rdx, %rax
264         add     $48, %rax
265         jmp     L(StartStrcpyPart)
267         .p2align 4
268 L(exit64):
269         sub     %rdi, %rax
270         bsf     %rdx, %rdx
271         add     %rdx, %rax
272         add     $64, %rax
274         .p2align 4
275 L(StartStrcpyPart):
276         lea     (%r9, %rax), %rdi
277         mov     %rsi, %rcx
278         mov     %r9, %rax      /* save result */
280 # ifdef USE_AS_STRNCAT
281         test    %r8, %r8
282         jz      L(ExitZero)
283 #  define USE_AS_STRNCPY
284 # endif
286 # include "strcpy-sse2-unaligned.S"
287 #endif