1*8d67ca89SAndroid Build Coastguard Worker/* 2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2014, Intel Corporation 3*8d67ca89SAndroid Build Coastguard WorkerAll rights reserved. 4*8d67ca89SAndroid Build Coastguard Worker 5*8d67ca89SAndroid Build Coastguard WorkerRedistribution and use in source and binary forms, with or without 6*8d67ca89SAndroid Build Coastguard Workermodification, are permitted provided that the following conditions are met: 7*8d67ca89SAndroid Build Coastguard Worker 8*8d67ca89SAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright notice, 9*8d67ca89SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer. 10*8d67ca89SAndroid Build Coastguard Worker 11*8d67ca89SAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above copyright notice, 12*8d67ca89SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 13*8d67ca89SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 14*8d67ca89SAndroid Build Coastguard Worker 15*8d67ca89SAndroid Build Coastguard Worker * Neither the name of Intel Corporation nor the names of its contributors 16*8d67ca89SAndroid Build Coastguard Worker * may be used to endorse or promote products derived from this software 17*8d67ca89SAndroid Build Coastguard Worker * without specific prior written permission. 18*8d67ca89SAndroid Build Coastguard Worker 19*8d67ca89SAndroid Build Coastguard WorkerTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 20*8d67ca89SAndroid Build Coastguard WorkerANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 21*8d67ca89SAndroid Build Coastguard WorkerWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 22*8d67ca89SAndroid Build Coastguard WorkerDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 23*8d67ca89SAndroid Build Coastguard WorkerANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24*8d67ca89SAndroid Build Coastguard Worker(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 25*8d67ca89SAndroid Build Coastguard WorkerLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 26*8d67ca89SAndroid Build Coastguard WorkerANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*8d67ca89SAndroid Build Coastguard Worker(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 28*8d67ca89SAndroid Build Coastguard WorkerSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*8d67ca89SAndroid Build Coastguard Worker*/ 30*8d67ca89SAndroid Build Coastguard Worker 31*8d67ca89SAndroid Build Coastguard Worker#ifndef USE_AS_STRCAT 32*8d67ca89SAndroid Build Coastguard Worker 33*8d67ca89SAndroid Build Coastguard Worker#ifndef STRLEN 34*8d67ca89SAndroid Build Coastguard Worker# define STRLEN strlen 35*8d67ca89SAndroid Build Coastguard Worker#endif 36*8d67ca89SAndroid Build Coastguard Worker 37*8d67ca89SAndroid Build Coastguard Worker#ifndef L 38*8d67ca89SAndroid Build Coastguard Worker# define L(label) .L##label 39*8d67ca89SAndroid Build Coastguard Worker#endif 40*8d67ca89SAndroid Build Coastguard Worker 41*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_startproc 42*8d67ca89SAndroid Build Coastguard Worker# define cfi_startproc .cfi_startproc 43*8d67ca89SAndroid Build Coastguard Worker#endif 44*8d67ca89SAndroid Build Coastguard Worker 45*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_endproc 46*8d67ca89SAndroid Build Coastguard Worker# define cfi_endproc .cfi_endproc 47*8d67ca89SAndroid Build Coastguard Worker#endif 48*8d67ca89SAndroid Build Coastguard Worker 49*8d67ca89SAndroid Build Coastguard Worker#ifndef ENTRY 50*8d67ca89SAndroid Build Coastguard Worker# define ENTRY(name) \ 51*8d67ca89SAndroid Build Coastguard Worker .type name, @function; \ 52*8d67ca89SAndroid Build Coastguard Worker .globl name; \ 53*8d67ca89SAndroid Build Coastguard Worker .p2align 4; \ 54*8d67ca89SAndroid Build Coastguard Workername: \ 55*8d67ca89SAndroid Build Coastguard Worker cfi_startproc 56*8d67ca89SAndroid Build Coastguard Worker#endif 57*8d67ca89SAndroid Build Coastguard Worker 58*8d67ca89SAndroid Build Coastguard Worker#ifndef END 59*8d67ca89SAndroid Build Coastguard Worker# define END(name) \ 60*8d67ca89SAndroid Build Coastguard Worker cfi_endproc; \ 61*8d67ca89SAndroid Build Coastguard Worker .size name, .-name 62*8d67ca89SAndroid Build Coastguard Worker#endif 63*8d67ca89SAndroid Build Coastguard Worker#define RETURN ret 64*8d67ca89SAndroid Build Coastguard Worker .section .text.sse2,"ax",@progbits 65*8d67ca89SAndroid Build Coastguard WorkerENTRY (STRLEN) 66*8d67ca89SAndroid Build Coastguard Worker/* end ifndef USE_AS_STRCAT */ 67*8d67ca89SAndroid Build Coastguard Worker#endif 68*8d67ca89SAndroid Build Coastguard Worker xor %rax, %rax 69*8d67ca89SAndroid Build Coastguard Worker mov %edi, %ecx 70*8d67ca89SAndroid Build Coastguard Worker and $0x3f, %ecx 71*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 72*8d67ca89SAndroid Build Coastguard Worker cmp $0x30, %ecx 73*8d67ca89SAndroid Build Coastguard Worker ja L(next) 74*8d67ca89SAndroid Build Coastguard Worker movdqu (%rdi), %xmm1 75*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 76*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 77*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 78*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_less16) 79*8d67ca89SAndroid Build Coastguard Worker mov %rdi, %rax 80*8d67ca89SAndroid Build Coastguard Worker and $-16, %rax 81*8d67ca89SAndroid Build Coastguard Worker jmp L(align16_start) 82*8d67ca89SAndroid Build Coastguard WorkerL(next): 83*8d67ca89SAndroid Build Coastguard Worker mov %rdi, %rax 84*8d67ca89SAndroid Build Coastguard Worker and $-16, %rax 85*8d67ca89SAndroid Build Coastguard Worker pcmpeqb (%rax), %xmm0 86*8d67ca89SAndroid Build Coastguard Worker mov $-1, %r10d 87*8d67ca89SAndroid Build Coastguard Worker sub %rax, %rcx 88*8d67ca89SAndroid Build Coastguard Worker shl %cl, %r10d 89*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 90*8d67ca89SAndroid Build Coastguard Worker and %r10d, %edx 91*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 92*8d67ca89SAndroid Build Coastguard WorkerL(align16_start): 93*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 94*8d67ca89SAndroid Build Coastguard Worker pxor %xmm1, %xmm1 95*8d67ca89SAndroid Build Coastguard Worker pxor %xmm2, %xmm2 96*8d67ca89SAndroid Build Coastguard Worker pxor %xmm3, %xmm3 97*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 16(%rax), %xmm0 98*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 99*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 100*8d67ca89SAndroid Build Coastguard Worker jnz L(exit16) 101*8d67ca89SAndroid Build Coastguard Worker 102*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 32(%rax), %xmm1 103*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 104*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 105*8d67ca89SAndroid Build Coastguard Worker jnz L(exit32) 106*8d67ca89SAndroid Build Coastguard Worker 107*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%rax), %xmm2 108*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 109*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 110*8d67ca89SAndroid Build Coastguard Worker jnz L(exit48) 111*8d67ca89SAndroid Build Coastguard Worker 112*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 64(%rax), %xmm3 113*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 114*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 115*8d67ca89SAndroid Build Coastguard Worker jnz L(exit64) 116*8d67ca89SAndroid Build Coastguard Worker 117*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 80(%rax), %xmm0 118*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 119*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 120*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 121*8d67ca89SAndroid Build Coastguard Worker jnz L(exit16) 122*8d67ca89SAndroid Build Coastguard Worker 123*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 32(%rax), %xmm1 124*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 125*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 126*8d67ca89SAndroid Build Coastguard Worker jnz L(exit32) 127*8d67ca89SAndroid Build Coastguard Worker 128*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%rax), %xmm2 129*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 130*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 131*8d67ca89SAndroid Build Coastguard Worker jnz L(exit48) 132*8d67ca89SAndroid Build Coastguard Worker 133*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 64(%rax), %xmm3 134*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 135*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 136*8d67ca89SAndroid Build Coastguard Worker jnz L(exit64) 137*8d67ca89SAndroid Build Coastguard Worker 138*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 80(%rax), %xmm0 139*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 140*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 141*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 142*8d67ca89SAndroid Build Coastguard Worker jnz L(exit16) 143*8d67ca89SAndroid Build Coastguard Worker 144*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 32(%rax), %xmm1 145*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 146*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 147*8d67ca89SAndroid Build Coastguard Worker jnz L(exit32) 148*8d67ca89SAndroid Build Coastguard Worker 149*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%rax), %xmm2 150*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 151*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 152*8d67ca89SAndroid Build Coastguard Worker jnz L(exit48) 153*8d67ca89SAndroid Build Coastguard Worker 154*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 64(%rax), %xmm3 155*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 156*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 157*8d67ca89SAndroid Build Coastguard Worker jnz L(exit64) 158*8d67ca89SAndroid Build Coastguard Worker 159*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 80(%rax), %xmm0 160*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 161*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 162*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 163*8d67ca89SAndroid Build Coastguard Worker jnz L(exit16) 164*8d67ca89SAndroid Build Coastguard Worker 165*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 32(%rax), %xmm1 166*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 167*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 168*8d67ca89SAndroid Build Coastguard Worker jnz L(exit32) 169*8d67ca89SAndroid Build Coastguard Worker 170*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%rax), %xmm2 171*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 172*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 173*8d67ca89SAndroid Build Coastguard Worker jnz L(exit48) 174*8d67ca89SAndroid Build Coastguard Worker 175*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 64(%rax), %xmm3 176*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 177*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 178*8d67ca89SAndroid Build Coastguard Worker jnz L(exit64) 179*8d67ca89SAndroid Build Coastguard Worker 180*8d67ca89SAndroid Build Coastguard Worker 181*8d67ca89SAndroid Build Coastguard Worker test $0x3f, %rax 182*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 183*8d67ca89SAndroid Build Coastguard Worker 184*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 80(%rax), %xmm0 185*8d67ca89SAndroid Build Coastguard Worker add $80, %rax 186*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 187*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 188*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 189*8d67ca89SAndroid Build Coastguard Worker 190*8d67ca89SAndroid Build Coastguard Worker test $0x3f, %rax 191*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 192*8d67ca89SAndroid Build Coastguard Worker 193*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 16(%rax), %xmm1 194*8d67ca89SAndroid Build Coastguard Worker add $16, %rax 195*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 196*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 197*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 198*8d67ca89SAndroid Build Coastguard Worker 199*8d67ca89SAndroid Build Coastguard Worker test $0x3f, %rax 200*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 201*8d67ca89SAndroid Build Coastguard Worker 202*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 16(%rax), %xmm2 203*8d67ca89SAndroid Build Coastguard Worker add $16, %rax 204*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 205*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 206*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 207*8d67ca89SAndroid Build Coastguard Worker 208*8d67ca89SAndroid Build Coastguard Worker test $0x3f, %rax 209*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 210*8d67ca89SAndroid Build Coastguard Worker 211*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 16(%rax), %xmm3 212*8d67ca89SAndroid Build Coastguard Worker add $16, %rax 213*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 214*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 215*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 216*8d67ca89SAndroid Build Coastguard Worker 217*8d67ca89SAndroid Build Coastguard Worker add $16, %rax 218*8d67ca89SAndroid Build Coastguard Worker .p2align 4 219*8d67ca89SAndroid Build Coastguard Worker L(align64_loop): 220*8d67ca89SAndroid Build Coastguard Worker movaps (%rax), %xmm4 221*8d67ca89SAndroid Build Coastguard Worker pminub 16(%rax), %xmm4 222*8d67ca89SAndroid Build Coastguard Worker movaps 32(%rax), %xmm5 223*8d67ca89SAndroid Build Coastguard Worker pminub 48(%rax), %xmm5 224*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 225*8d67ca89SAndroid Build Coastguard Worker pminub %xmm4, %xmm5 226*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm0, %xmm5 227*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm5, %edx 228*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 229*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 230*8d67ca89SAndroid Build Coastguard Worker 231*8d67ca89SAndroid Build Coastguard Worker 232*8d67ca89SAndroid Build Coastguard Worker pcmpeqb -64(%rax), %xmm0 233*8d67ca89SAndroid Build Coastguard Worker sub $80, %rax 234*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %edx 235*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 236*8d67ca89SAndroid Build Coastguard Worker jnz L(exit16) 237*8d67ca89SAndroid Build Coastguard Worker 238*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 32(%rax), %xmm1 239*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edx 240*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 241*8d67ca89SAndroid Build Coastguard Worker jnz L(exit32) 242*8d67ca89SAndroid Build Coastguard Worker 243*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%rax), %xmm2 244*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edx 245*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 246*8d67ca89SAndroid Build Coastguard Worker jnz L(exit48) 247*8d67ca89SAndroid Build Coastguard Worker 248*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 64(%rax), %xmm3 249*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %edx 250*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 251*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 252*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 253*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 254*8d67ca89SAndroid Build Coastguard Worker RETURN 255*8d67ca89SAndroid Build Coastguard Worker 256*8d67ca89SAndroid Build Coastguard Worker .p2align 4 257*8d67ca89SAndroid Build Coastguard WorkerL(exit): 258*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 259*8d67ca89SAndroid Build Coastguard WorkerL(exit_less16): 260*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 261*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 262*8d67ca89SAndroid Build Coastguard Worker RETURN 263*8d67ca89SAndroid Build Coastguard Worker .p2align 4 264*8d67ca89SAndroid Build Coastguard WorkerL(exit16): 265*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 266*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 267*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 268*8d67ca89SAndroid Build Coastguard Worker add $16, %rax 269*8d67ca89SAndroid Build Coastguard Worker RETURN 270*8d67ca89SAndroid Build Coastguard Worker .p2align 4 271*8d67ca89SAndroid Build Coastguard WorkerL(exit32): 272*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 273*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 274*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 275*8d67ca89SAndroid Build Coastguard Worker add $32, %rax 276*8d67ca89SAndroid Build Coastguard Worker RETURN 277*8d67ca89SAndroid Build Coastguard Worker .p2align 4 278*8d67ca89SAndroid Build Coastguard WorkerL(exit48): 279*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 280*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 281*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 282*8d67ca89SAndroid Build Coastguard Worker add $48, %rax 283*8d67ca89SAndroid Build Coastguard Worker RETURN 284*8d67ca89SAndroid Build Coastguard Worker .p2align 4 285*8d67ca89SAndroid Build Coastguard WorkerL(exit64): 286*8d67ca89SAndroid Build Coastguard Worker sub %rdi, %rax 287*8d67ca89SAndroid Build Coastguard Worker bsf %rdx, %rdx 288*8d67ca89SAndroid Build Coastguard Worker add %rdx, %rax 289*8d67ca89SAndroid Build Coastguard Worker add $64, %rax 290*8d67ca89SAndroid Build Coastguard Worker#ifndef USE_AS_STRCAT 291*8d67ca89SAndroid Build Coastguard Worker RETURN 292*8d67ca89SAndroid Build Coastguard Worker 293*8d67ca89SAndroid Build Coastguard WorkerEND (STRLEN) 294*8d67ca89SAndroid Build Coastguard Worker#endif 295