10a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/*
20a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaCopyright (c) 2011 Intel Corporation
30a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaAll rights reserved.
40a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
50a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaRedistribution and use in source and binary forms, with or without
60a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievamodification, are permitted provided that the following conditions are met:
70a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
80a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Redistributions of source code must retain the above copyright notice,
90a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * this list of conditions and the following disclaimer.
100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Redistributions in binary form must reproduce the above copyright notice,
120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * this list of conditions and the following disclaimer in the documentation
130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * and/or other materials provided with the distribution.
140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * Neither the name of Intel Corporation nor the names of its contributors
160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * may be used to endorse or promote products derived from this software
170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva    * without specific prior written permission.
180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
190a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
200a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
210a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
220a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
230a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
250a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
260a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
280a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva*/
300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef L
320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define L(label)	.L##label
330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_startproc
360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_startproc                  .cfi_startproc
370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_endproc
400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_endproc                    .cfi_endproc
410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_rel_offset
440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off
450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_restore
480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_restore(reg)	.cfi_restore reg
490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_adjust_cfa_offset
520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off
530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef ENTRY
560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define ENTRY(name)	\
570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.type name,  @function;	\
580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.globl name;	\
590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4;	\
600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievaname:	\
610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_startproc
620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef END
650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define END(name)	\
660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_endproc;	\
670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.size name, .-name
680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_PUSH(REG)	\
710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_adjust_cfa_offset (4);	\
720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_rel_offset (REG, 0)
730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_POP(REG)	\
750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_adjust_cfa_offset (-4);	\
760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_restore (REG)
770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PUSH(REG)	pushl REG;	CFI_PUSH (REG)
790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define POP(REG)	popl REG;	CFI_POP (REG)
800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PARMS  4
820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR1  PARMS+4
830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR2  STR1+4
840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define USE_AS_WCSCAT
860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva.text
880a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaENTRY (wcscat)
890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH    (%edi)
900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	STR1(%esp), %edi
910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%edi, %edx
920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define RETURN  jmp L(WcscpyAtom)
940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#include "sse2-wcslen-atom.S"
950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
960a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(WcscpyAtom):
970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	shl	$2, %eax
980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	STR2(%esp), %ecx
990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	(%edi, %eax), %edx
1000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$0, (%ecx)
1020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit4)
1030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$0, 4(%ecx)
1040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit8)
1050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$0, 8(%ecx)
1060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit12)
1070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$0, 12(%ecx)
1080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit16)
1090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#undef RETURN
1110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define RETURN  POP(%edi);	ret;	CFI_PUSH(%edi)
1120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#include "ssse3-wcscpy-atom.S"
1130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1140a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaEND (wcscat)
115