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 cfi_remember_state
560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_remember_state		.cfi_remember_state
570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_restore_state
600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_restore_state		.cfi_restore_state
610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef ENTRY
640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define ENTRY(name)			\
650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.type name,  @function; 	\
660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.globl name;			\
670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4;			\
680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievaname:					\
690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_startproc
700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef END
730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define END(name)			\
740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cfi_endproc;			\
750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.size name, .-name
760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_PUSH(REG)			\
790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva  cfi_adjust_cfa_offset (4);		\
800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva  cfi_rel_offset (REG, 0)
810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_POP(REG)			\
830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva  cfi_adjust_cfa_offset (-4);		\
840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva  cfi_restore (REG)
850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PUSH(REG)	pushl REG; CFI_PUSH (REG)
870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define POP(REG)	popl REG; CFI_POP (REG)
880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef STRCAT
900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define STRCAT	strcat
910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PARMS	4
940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR1	PARMS+4
950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR2	STR1+4
960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifdef USE_AS_STRNCAT
980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define LEN	STR2+8
990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
1000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define USE_AS_STRCAT
1020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.section .text.ssse3,"ax",@progbits
1040a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaENTRY (STRCAT)
1050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%edi)
1060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	STR1(%esp), %edi
1070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	%edi, %edx
1080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define RETURN	jmp	L(StrcpyAtom)
1100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#include "sse2-strlen-atom.S"
1110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1120a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrcpyAtom):
1130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	STR2(%esp), %ecx
1140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	(%edi, %eax), %edx
1150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifdef USE_AS_STRNCAT
1160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	PUSH	(%ebx)
1170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	mov	LEN(%esp), %ebx
1180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%ebx, %ebx
1190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(StrncatExit0)
1200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$8, %ebx
1210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jbe	L(StrncpyExit8Bytes)
1220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
1230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, (%ecx)
1240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit1)
1250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 1(%ecx)
1260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit2)
1270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 2(%ecx)
1280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit3)
1290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 3(%ecx)
1300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit4)
1310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 4(%ecx)
1320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit5)
1330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 5(%ecx)
1340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit6)
1350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 6(%ecx)
1360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit7)
1370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 7(%ecx)
1380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit8)
1390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 8(%ecx)
1400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit9)
1410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifdef USE_AS_STRNCAT
1420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$16, %ebx
1430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jb	L(StrncpyExit15Bytes)
1440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
1450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 9(%ecx)
1460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit10)
1470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 10(%ecx)
1480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit11)
1490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 11(%ecx)
1500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit12)
1510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 12(%ecx)
1520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit13)
1530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 13(%ecx)
1540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit14)
1550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 14(%ecx)
1560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit15)
1570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 15(%ecx)
1580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit16)
1590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifdef USE_AS_STRNCAT
1600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$16, %ebx
1610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit16)
1620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define RETURN1	POP (%ebx); POP (%edi);	ret; \
1640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH (%ebx); CFI_PUSH (%edi)
1650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define USE_AS_STRNCPY
1660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#else
1670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define RETURN1	POP(%edi); ret; CFI_PUSH(%edi)
1680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
1690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#include "ssse3-strcpy-atom.S"
1700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1720a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(CopyFrom1To16Bytes):
1730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%esi, %edx
1740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%esi, %ecx
1750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
1770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%al, %al
1780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(ExitHigh)
1790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x01, %al
1800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit1)
1810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x02, %al
1820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit2)
1830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x04, %al
1840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit3)
1850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x08, %al
1860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit4)
1870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x10, %al
1880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit5)
1890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x20, %al
1900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit6)
1910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x40, %al
1920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit7)
1930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
1940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
1950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
1960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
1970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
1980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
1990a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(ExitHigh):
2000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x01, %ah
2010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit9)
2020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x02, %ah
2030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit10)
2040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x04, %ah
2050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit11)
2060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x08, %ah
2070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit12)
2080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x10, %ah
2090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit13)
2100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x20, %ah
2110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit14)
2120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x40, %ah
2130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit15)
2140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
2150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	8(%ecx), %xmm1
2160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
2170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm1, 8(%edx)
2180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2220a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit1):
2230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 1(%edx)
2240a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit1):
2250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	(%ecx), %al
2260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%al, (%edx)
2270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2310a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit2):
2320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 2(%edx)
2330a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit2):
2340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	(%ecx), %ax
2350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	%ax, (%edx)
2360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2400a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit3):
2410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 3(%edx)
2420a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit3):
2430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	(%ecx), %ax
2440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	%ax, (%edx)
2450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	2(%ecx), %al
2460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%al, 2(%edx)
2470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2510a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit4):
2520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 4(%edx)
2530a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit4):
2540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	(%ecx), %eax
2550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, (%edx)
2560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2600a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit5):
2610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 5(%edx)
2620a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit5):
2630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	(%ecx), %eax
2640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, (%edx)
2650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	4(%ecx), %al
2660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%al, 4(%edx)
2670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2710a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit6):
2720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 6(%edx)
2730a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit6):
2740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	(%ecx), %eax
2750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, (%edx)
2760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	4(%ecx), %ax
2770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	%ax, 4(%edx)
2780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2820a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit7):
2830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 7(%edx)
2840a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit7):
2850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	(%ecx), %eax
2860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, (%edx)
2870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	3(%ecx), %eax
2880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, 3(%edx)
2890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
2910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
2920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
2930a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit8):
2940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 8(%edx)
2950a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit8):
2960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
2970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
2980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
2990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3020a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit9):
3030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 9(%edx)
3040a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit9):
3050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	8(%ecx), %al
3080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%al, 8(%edx)
3090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3130a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit10):
3140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 10(%edx)
3150a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit10):
3160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	8(%ecx), %ax
3190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movw	%ax, 8(%edx)
3200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3240a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit11):
3250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 11(%edx)
3260a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit11):
3270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	7(%ecx), %eax
3300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, 7(%edx)
3310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3350a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit12):
3360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 12(%edx)
3370a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit12):
3380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	8(%ecx), %eax
3410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%eax, 8(%edx)
3420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3460a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit13):
3470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 13(%edx)
3480a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit13):
3490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	5(%ecx), %xmm0
3520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, 5(%edx)
3530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3570a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit14):
3580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 14(%edx)
3590a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit14):
3600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	6(%ecx), %xmm0
3630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, 6(%edx)
3640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3680a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit15):
3690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 15(%edx)
3700a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit15):
3710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	7(%ecx), %xmm0
3740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, 7(%edx)
3750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3790a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit16):
3800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 16(%edx)
3810a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit16):
3820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
3830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	8(%ecx), %xmm1
3840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
3850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm1, 8(%edx)
3860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
3870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
3880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifdef USE_AS_STRNCPY
3900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH(%esi)
3920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
3930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
3940a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(CopyFrom1To16BytesCase2):
3950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %ebx
3960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%esi, %ecx
3970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	(%esi, %edx), %esi
3980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	-9(%ebx), %edx
3990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	and	$1<<7, %dh
4000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	or	%al, %dh
4010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	(%esi), %edx
4020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
4030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(ExitHighCase2)
4040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x01, %al
4060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit1)
4070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$1, %ebx
4080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit1)
4090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x02, %al
4100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit2)
4110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$2, %ebx
4120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit2)
4130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x04, %al
4140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit3)
4150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$3, %ebx
4160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit3)
4170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x08, %al
4180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit4)
4190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$4, %ebx
4200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit4)
4210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x10, %al
4220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit5)
4230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$5, %ebx
4240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit5)
4250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x20, %al
4260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit6)
4270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$6, %ebx
4280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit6)
4290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x40, %al
4300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit7)
4310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$7, %ebx
4320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit7)
4330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
4340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
4350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	7(%edx), %eax
4360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$1, (%eax)
4370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	sbb	$-1, %eax
4380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	xor	%cl, %cl
4390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%cl, (%eax)
4400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
4410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
4420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
4440a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(ExitHighCase2):
4450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x01, %ah
4460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit9)
4470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$9, %ebx
4480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit9)
4490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x02, %ah
4500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit10)
4510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$10, %ebx
4520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit10)
4530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x04, %ah
4540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit11)
4550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$11, %ebx
4560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit11)
4570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x8, %ah
4580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit12)
4590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$12, %ebx
4600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit12)
4610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x10, %ah
4620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit13)
4630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$13, %ebx
4640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit13)
4650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x20, %ah
4660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit14)
4670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$14, %ebx
4680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit14)
4690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	$0x40, %ah
4700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(Exit15)
4710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$15, %ebx
4720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit15)
4730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
4740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
4750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	8(%ecx), %xmm1
4760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm1, 8(%edx)
4770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
4780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
4790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	CFI_PUSH(%esi)
4810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4820a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(CopyFrom1To16BytesCase2OrCase3):
4830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	test	%eax, %eax
4840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jnz	L(CopyFrom1To16BytesCase2)
4850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
4870a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(CopyFrom1To16BytesCase3):
4880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	$16, %ebx
4890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%esi, %edx
4900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	add	%esi, %ecx
4910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	POP	(%esi)
4930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
4940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$8, %ebx
4950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	ja	L(ExitHighCase3)
4960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$1, %ebx
4970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit1)
4980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$2, %ebx
4990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit2)
5000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$3, %ebx
5010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit3)
5020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$4, %ebx
5030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit4)
5040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$5, %ebx
5050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit5)
5060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$6, %ebx
5070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit6)
5080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$7, %ebx
5090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit7)
5100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
5110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
5120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 8(%edx)
5130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
5140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
5150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
5160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
5170a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(ExitHighCase3):
5180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$9, %ebx
5190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit9)
5200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$10, %ebx
5210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit10)
5220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$11, %ebx
5230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit11)
5240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$12, %ebx
5250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit12)
5260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$13, %ebx
5270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit13)
5280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$14, %ebx
5290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit14)
5300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$15, %ebx
5310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit15)
5320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
5330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
5340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	8(%ecx), %xmm1
5350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm1, 8(%edx)
5360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, 16(%edx)
5370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
5380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
5390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
5400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
5410a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncatExit0):
5420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
5430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
5440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
5450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
5460a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncpyExit15Bytes):
5470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$9, %ebx
5480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit9)
5490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 9(%ecx)
5500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit10)
5510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$10, %ebx
5520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit10)
5530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 10(%ecx)
5540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit11)
5550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$11, %ebx
5560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit11)
5570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 11(%ecx)
5580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit12)
5590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$12, %ebx
5600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit12)
5610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 12(%ecx)
5620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit13)
5630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$13, %ebx
5640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit13)
5650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 13(%ecx)
5660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit14)
5670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$14, %ebx
5680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit14)
5690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
5700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
5710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	7(%ecx), %xmm0
5720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, 7(%edx)
5730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	14(%edx), %eax
5740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$1, (%eax)
5750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	sbb	$-1, %eax
5760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, (%eax)
5770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
5780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
5790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
5800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	.p2align 4
5810a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(StrncpyExit8Bytes):
5820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, (%ecx)
5830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit1)
5840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$1, %ebx
5850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit1)
5860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 1(%ecx)
5870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit2)
5880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$2, %ebx
5890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit2)
5900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 2(%ecx)
5910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit3)
5920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$3, %ebx
5930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit3)
5940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 3(%ecx)
5950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit4)
5960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$4, %ebx
5970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit4)
5980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 4(%ecx)
5990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit5)
6000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$5, %ebx
6010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit5)
6020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 5(%ecx)
6030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit6)
6040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$6, %ebx
6050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit6)
6060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$0, 6(%ecx)
6070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	jz	L(Exit7)
6080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmp	$7, %ebx
6090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	je	L(StrncatExit7)
6100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	(%ecx), %xmm0
6110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movlpd	%xmm0, (%edx)
6120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	lea	7(%edx), %eax
6130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	cmpb	$1, (%eax)
6140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	sbb	$-1, %eax
6150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movb	%bh, (%eax)
6160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	movl	%edi, %eax
6170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva	RETURN1
6180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva
6190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif
6200a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaEND (STRCAT)
621