|  | /* | 
|  | Copyright (c) 2011 Intel Corporation | 
|  | All rights reserved. | 
|  |  | 
|  | Redistribution and use in source and binary forms, with or without | 
|  | modification, are permitted provided that the following conditions are met: | 
|  |  | 
|  | * Redistributions of source code must retain the above copyright notice, | 
|  | * this list of conditions and the following disclaimer. | 
|  |  | 
|  | * Redistributions in binary form must reproduce the above copyright notice, | 
|  | * this list of conditions and the following disclaimer in the documentation | 
|  | * and/or other materials provided with the distribution. | 
|  |  | 
|  | * Neither the name of Intel Corporation nor the names of its contributors | 
|  | * may be used to endorse or promote products derived from this software | 
|  | * without specific prior written permission. | 
|  |  | 
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND | 
|  | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
|  | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
|  | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR | 
|  | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
|  | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
|  | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON | 
|  | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | 
|  | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | #ifndef L | 
|  | # define L(label)	.L##label | 
|  | #endif | 
|  |  | 
|  | #ifndef cfi_startproc | 
|  | # define cfi_startproc                  .cfi_startproc | 
|  | #endif | 
|  |  | 
|  | #ifndef cfi_endproc | 
|  | # define cfi_endproc                    .cfi_endproc | 
|  | #endif | 
|  |  | 
|  | #ifndef cfi_rel_offset | 
|  | # define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off | 
|  | #endif | 
|  |  | 
|  | #ifndef cfi_restore | 
|  | # define cfi_restore(reg)	.cfi_restore reg | 
|  | #endif | 
|  |  | 
|  | #ifndef cfi_adjust_cfa_offset | 
|  | # define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off | 
|  | #endif | 
|  |  | 
|  | #ifndef ENTRY | 
|  | # define ENTRY(name)	\ | 
|  | .type name,  @function;	\ | 
|  | .globl name;	\ | 
|  | .p2align 4;	\ | 
|  | name:	\ | 
|  | cfi_startproc | 
|  | #endif | 
|  |  | 
|  | #ifndef END | 
|  | # define END(name)	\ | 
|  | cfi_endproc;	\ | 
|  | .size name, .-name | 
|  | #endif | 
|  |  | 
|  | #define CFI_PUSH(REG)	\ | 
|  | cfi_adjust_cfa_offset (4);	\ | 
|  | cfi_rel_offset (REG, 0) | 
|  |  | 
|  | #define CFI_POP(REG)	\ | 
|  | cfi_adjust_cfa_offset (-4);	\ | 
|  | cfi_restore (REG) | 
|  |  | 
|  | #define PUSH(REG)	pushl REG;	CFI_PUSH (REG) | 
|  | #define POP(REG)	popl REG;	CFI_POP (REG) | 
|  |  | 
|  | #define PARMS  4 | 
|  | #define STR1  PARMS+4 | 
|  | #define STR2  STR1+4 | 
|  |  | 
|  | #define USE_AS_WCSCAT | 
|  |  | 
|  | .text | 
|  | ENTRY (wcscat_ssse3) | 
|  | PUSH    (%edi) | 
|  | mov	STR1(%esp), %edi | 
|  | mov	%edi, %edx | 
|  |  | 
|  | #define RETURN  jmp L(WcscpyAtom) | 
|  | #include "sse2-wcslen-atom.S" | 
|  |  | 
|  | L(WcscpyAtom): | 
|  | shl	$2, %eax | 
|  | mov	STR2(%esp), %ecx | 
|  | lea	(%edi, %eax), %edx | 
|  |  | 
|  | cmpl	$0, (%ecx) | 
|  | jz	L(Exit4) | 
|  | cmpl	$0, 4(%ecx) | 
|  | jz	L(Exit8) | 
|  | cmpl	$0, 8(%ecx) | 
|  | jz	L(Exit12) | 
|  | cmpl	$0, 12(%ecx) | 
|  | jz	L(Exit16) | 
|  |  | 
|  | #undef RETURN | 
|  | #define RETURN  POP(%edi);	ret;	CFI_PUSH(%edi) | 
|  | #include "ssse3-wcscpy-atom.S" | 
|  |  | 
|  | END (wcscat_ssse3) |