| Liubov Dmitrieva | 0a49066 | 2012-01-17 12:55:46 +0400 | [diff] [blame] | 1 | /* | 
|  | 2 | Copyright (c) 2011 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 L | 
|  | 32 | # define L(label)	.L##label | 
|  | 33 | #endif | 
|  | 34 |  | 
|  | 35 | #ifndef cfi_startproc | 
|  | 36 | # define cfi_startproc                  .cfi_startproc | 
|  | 37 | #endif | 
|  | 38 |  | 
|  | 39 | #ifndef cfi_endproc | 
|  | 40 | # define cfi_endproc                    .cfi_endproc | 
|  | 41 | #endif | 
|  | 42 |  | 
|  | 43 | #ifndef cfi_rel_offset | 
|  | 44 | # define cfi_rel_offset(reg, off)	.cfi_rel_offset reg, off | 
|  | 45 | #endif | 
|  | 46 |  | 
|  | 47 | #ifndef cfi_restore | 
|  | 48 | # define cfi_restore(reg)	.cfi_restore reg | 
|  | 49 | #endif | 
|  | 50 |  | 
|  | 51 | #ifndef cfi_adjust_cfa_offset | 
|  | 52 | # define cfi_adjust_cfa_offset(off)	.cfi_adjust_cfa_offset off | 
|  | 53 | #endif | 
|  | 54 |  | 
|  | 55 | #ifndef ENTRY | 
|  | 56 | # define ENTRY(name)	\ | 
|  | 57 | .type name,  @function;	\ | 
|  | 58 | .globl name;	\ | 
|  | 59 | .p2align 4;	\ | 
|  | 60 | name:	\ | 
|  | 61 | cfi_startproc | 
|  | 62 | #endif | 
|  | 63 |  | 
|  | 64 | #ifndef END | 
|  | 65 | # define END(name)	\ | 
|  | 66 | cfi_endproc;	\ | 
|  | 67 | .size name, .-name | 
|  | 68 | #endif | 
|  | 69 |  | 
|  | 70 | #define CFI_PUSH(REG)	\ | 
|  | 71 | cfi_adjust_cfa_offset (4);	\ | 
|  | 72 | cfi_rel_offset (REG, 0) | 
|  | 73 |  | 
|  | 74 | #define CFI_POP(REG)	\ | 
|  | 75 | cfi_adjust_cfa_offset (-4);	\ | 
|  | 76 | cfi_restore (REG) | 
|  | 77 |  | 
|  | 78 | #define PUSH(REG)	pushl REG;	CFI_PUSH (REG) | 
|  | 79 | #define POP(REG)	popl REG;	CFI_POP (REG) | 
|  | 80 |  | 
|  | 81 | #define PARMS  4 | 
|  | 82 | #define STR1  PARMS+4 | 
|  | 83 | #define STR2  STR1+4 | 
|  | 84 |  | 
|  | 85 | #define USE_AS_WCSCAT | 
|  | 86 |  | 
|  | 87 | .text | 
|  | 88 | ENTRY (wcscat) | 
|  | 89 | PUSH    (%edi) | 
|  | 90 | mov	STR1(%esp), %edi | 
|  | 91 | mov	%edi, %edx | 
|  | 92 |  | 
|  | 93 | #define RETURN  jmp L(WcscpyAtom) | 
|  | 94 | #include "sse2-wcslen-atom.S" | 
|  | 95 |  | 
|  | 96 | L(WcscpyAtom): | 
|  | 97 | shl	$2, %eax | 
|  | 98 | mov	STR2(%esp), %ecx | 
|  | 99 | lea	(%edi, %eax), %edx | 
|  | 100 |  | 
| Chih-Hung Hsieh | c89ee27 | 2014-10-21 16:25:35 -0700 | [diff] [blame] | 101 | cmpl	$0, (%ecx) | 
| Liubov Dmitrieva | 0a49066 | 2012-01-17 12:55:46 +0400 | [diff] [blame] | 102 | jz	L(Exit4) | 
| Chih-Hung Hsieh | c89ee27 | 2014-10-21 16:25:35 -0700 | [diff] [blame] | 103 | cmpl	$0, 4(%ecx) | 
| Liubov Dmitrieva | 0a49066 | 2012-01-17 12:55:46 +0400 | [diff] [blame] | 104 | jz	L(Exit8) | 
| Chih-Hung Hsieh | c89ee27 | 2014-10-21 16:25:35 -0700 | [diff] [blame] | 105 | cmpl	$0, 8(%ecx) | 
| Liubov Dmitrieva | 0a49066 | 2012-01-17 12:55:46 +0400 | [diff] [blame] | 106 | jz	L(Exit12) | 
| Chih-Hung Hsieh | c89ee27 | 2014-10-21 16:25:35 -0700 | [diff] [blame] | 107 | cmpl	$0, 12(%ecx) | 
| Liubov Dmitrieva | 0a49066 | 2012-01-17 12:55:46 +0400 | [diff] [blame] | 108 | jz	L(Exit16) | 
|  | 109 |  | 
|  | 110 | #undef RETURN | 
|  | 111 | #define RETURN  POP(%edi);	ret;	CFI_PUSH(%edi) | 
|  | 112 | #include "ssse3-wcscpy-atom.S" | 
|  | 113 |  | 
|  | 114 | END (wcscat) |