Home | History | Annotate | Download | only in string
      1 /*
      2 Copyright (c) 2014, Intel Corporation
      3 All rights reserved.
      4 
      5 Redistribution and use in source and binary forms, with or without
      6 modification, are permitted provided that the following conditions are met:
      7 
      8     * Redistributions of source code must retain the above copyright notice,
      9     * this list of conditions and the following disclaimer.
     10 
     11     * Redistributions in binary form must reproduce the above copyright notice,
     12     * this list of conditions and the following disclaimer in the documentation
     13     * and/or other materials provided with the distribution.
     14 
     15     * Neither the name of Intel Corporation nor the names of its contributors
     16     * may be used to endorse or promote products derived from this software
     17     * without specific prior written permission.
     18 
     19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
     20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     22 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
     23 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     24 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     25 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
     26 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
     28 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 */
     30 
     31 #ifndef STRCAT
     32 # define STRCAT		strcat
     33 #endif
     34 
     35 #ifndef L
     36 # define L(label)		.L##label
     37 #endif
     38 
     39 #ifndef cfi_startproc
     40 # define cfi_startproc		 .cfi_startproc
     41 #endif
     42 
     43 #ifndef cfi_endproc
     44 # define cfi_endproc		.cfi_endproc
     45 #endif
     46 
     47 #ifndef ENTRY
     48 # define ENTRY(name)		\
     49 	.type name,  @function;		\
     50 	.globl name;		\
     51 	.p2align 4;		\
     52 name:		\
     53 	cfi_startproc
     54 #endif
     55 
     56 #ifndef END
     57 # define END(name)		\
     58 	cfi_endproc;		\
     59 	.size name, .-name
     60 #endif
     61 
     62 #define USE_AS_STRCAT
     63 
     64 .text
     65 ENTRY (STRCAT)
     66 	mov	%rdi, %r9
     67 #ifdef USE_AS_STRNCAT
     68 	mov	%rdx, %r8
     69 #endif
     70 
     71 #define RETURN jmp L(Strcpy)
     72 #include "sse2-strlen-slm.S"
     73 
     74 #undef RETURN
     75 #define RETURN ret
     76 
     77 L(Strcpy):
     78 	lea	(%r9, %rax), %rdi
     79 	mov	%rsi, %rcx
     80 	mov	%r9, %rax	/* save result */
     81 
     82 #ifdef USE_AS_STRNCAT
     83 	test	%r8, %r8
     84 	jz	L(ExitZero)
     85 # define USE_AS_STRNCPY
     86 #endif
     87 #include "sse2-strcpy-slm.S"
     88