1*8d67ca89SAndroid Build Coastguard Worker/* 2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2010, 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 L 32*8d67ca89SAndroid Build Coastguard Worker# define L(label) .L##label 33*8d67ca89SAndroid Build Coastguard Worker#endif 34*8d67ca89SAndroid Build Coastguard Worker 35*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_startproc 36*8d67ca89SAndroid Build Coastguard Worker# define cfi_startproc .cfi_startproc 37*8d67ca89SAndroid Build Coastguard Worker#endif 38*8d67ca89SAndroid Build Coastguard Worker 39*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_endproc 40*8d67ca89SAndroid Build Coastguard Worker# define cfi_endproc .cfi_endproc 41*8d67ca89SAndroid Build Coastguard Worker#endif 42*8d67ca89SAndroid Build Coastguard Worker 43*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_rel_offset 44*8d67ca89SAndroid Build Coastguard Worker# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off 45*8d67ca89SAndroid Build Coastguard Worker#endif 46*8d67ca89SAndroid Build Coastguard Worker 47*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_restore 48*8d67ca89SAndroid Build Coastguard Worker# define cfi_restore(reg) .cfi_restore reg 49*8d67ca89SAndroid Build Coastguard Worker#endif 50*8d67ca89SAndroid Build Coastguard Worker 51*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_adjust_cfa_offset 52*8d67ca89SAndroid Build Coastguard Worker# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off 53*8d67ca89SAndroid Build Coastguard Worker#endif 54*8d67ca89SAndroid Build Coastguard Worker 55*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_remember_state 56*8d67ca89SAndroid Build Coastguard Worker# define cfi_remember_state .cfi_remember_state 57*8d67ca89SAndroid Build Coastguard Worker#endif 58*8d67ca89SAndroid Build Coastguard Worker 59*8d67ca89SAndroid Build Coastguard Worker#ifndef cfi_restore_state 60*8d67ca89SAndroid Build Coastguard Worker# define cfi_restore_state .cfi_restore_state 61*8d67ca89SAndroid Build Coastguard Worker#endif 62*8d67ca89SAndroid Build Coastguard Worker 63*8d67ca89SAndroid Build Coastguard Worker#ifndef ENTRY 64*8d67ca89SAndroid Build Coastguard Worker# define ENTRY(name) \ 65*8d67ca89SAndroid Build Coastguard Worker .type name, @function; \ 66*8d67ca89SAndroid Build Coastguard Worker .globl name; \ 67*8d67ca89SAndroid Build Coastguard Worker .p2align 4; \ 68*8d67ca89SAndroid Build Coastguard Workername: \ 69*8d67ca89SAndroid Build Coastguard Worker cfi_startproc 70*8d67ca89SAndroid Build Coastguard Worker#endif 71*8d67ca89SAndroid Build Coastguard Worker 72*8d67ca89SAndroid Build Coastguard Worker#ifndef END 73*8d67ca89SAndroid Build Coastguard Worker# define END(name) \ 74*8d67ca89SAndroid Build Coastguard Worker cfi_endproc; \ 75*8d67ca89SAndroid Build Coastguard Worker .size name, .-name 76*8d67ca89SAndroid Build Coastguard Worker#endif 77*8d67ca89SAndroid Build Coastguard Worker 78*8d67ca89SAndroid Build Coastguard Worker#define CFI_PUSH(REG) \ 79*8d67ca89SAndroid Build Coastguard Worker cfi_adjust_cfa_offset (4); \ 80*8d67ca89SAndroid Build Coastguard Worker cfi_rel_offset (REG, 0) 81*8d67ca89SAndroid Build Coastguard Worker 82*8d67ca89SAndroid Build Coastguard Worker#define CFI_POP(REG) \ 83*8d67ca89SAndroid Build Coastguard Worker cfi_adjust_cfa_offset (-4); \ 84*8d67ca89SAndroid Build Coastguard Worker cfi_restore (REG) 85*8d67ca89SAndroid Build Coastguard Worker 86*8d67ca89SAndroid Build Coastguard Worker#define PUSH(REG) pushl REG; CFI_PUSH (REG) 87*8d67ca89SAndroid Build Coastguard Worker#define POP(REG) popl REG; CFI_POP (REG) 88*8d67ca89SAndroid Build Coastguard Worker 89*8d67ca89SAndroid Build Coastguard Worker#ifndef USE_AS_STRNCMP 90*8d67ca89SAndroid Build Coastguard Worker# define STR1 4 91*8d67ca89SAndroid Build Coastguard Worker# define STR2 STR1+4 92*8d67ca89SAndroid Build Coastguard Worker# define RETURN ret 93*8d67ca89SAndroid Build Coastguard Worker 94*8d67ca89SAndroid Build Coastguard Worker# define UPDATE_STRNCMP_COUNTER 95*8d67ca89SAndroid Build Coastguard Worker#else 96*8d67ca89SAndroid Build Coastguard Worker# define STR1 8 97*8d67ca89SAndroid Build Coastguard Worker# define STR2 STR1+4 98*8d67ca89SAndroid Build Coastguard Worker# define CNT STR2+4 99*8d67ca89SAndroid Build Coastguard Worker# define RETURN POP (%ebp); ret; CFI_PUSH (%ebp) 100*8d67ca89SAndroid Build Coastguard Worker 101*8d67ca89SAndroid Build Coastguard Worker# define UPDATE_STRNCMP_COUNTER \ 102*8d67ca89SAndroid Build Coastguard Worker /* calculate left number to compare */ \ 103*8d67ca89SAndroid Build Coastguard Worker mov $16, %esi; \ 104*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %esi; \ 105*8d67ca89SAndroid Build Coastguard Worker cmpl %esi, %ebp; \ 106*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq); \ 107*8d67ca89SAndroid Build Coastguard Worker sub %esi, %ebp 108*8d67ca89SAndroid Build Coastguard Worker#endif 109*8d67ca89SAndroid Build Coastguard Worker 110*8d67ca89SAndroid Build Coastguard Worker#ifndef STRCMP 111*8d67ca89SAndroid Build Coastguard Worker# define STRCMP strcmp 112*8d67ca89SAndroid Build Coastguard Worker#endif 113*8d67ca89SAndroid Build Coastguard Worker 114*8d67ca89SAndroid Build Coastguard Worker .section .text.ssse3,"ax",@progbits 115*8d67ca89SAndroid Build Coastguard WorkerENTRY (STRCMP) 116*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 117*8d67ca89SAndroid Build Coastguard Worker PUSH (%ebp) 118*8d67ca89SAndroid Build Coastguard Worker cfi_remember_state 119*8d67ca89SAndroid Build Coastguard Worker#endif 120*8d67ca89SAndroid Build Coastguard Worker movl STR1(%esp), %edx 121*8d67ca89SAndroid Build Coastguard Worker movl STR2(%esp), %eax 122*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 123*8d67ca89SAndroid Build Coastguard Worker movl CNT(%esp), %ebp 124*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 125*8d67ca89SAndroid Build Coastguard Worker jb L(less16bytes_sncmp) 126*8d67ca89SAndroid Build Coastguard Worker jmp L(more16bytes) 127*8d67ca89SAndroid Build Coastguard Worker#endif 128*8d67ca89SAndroid Build Coastguard Worker 129*8d67ca89SAndroid Build Coastguard Worker movzbl (%eax), %ecx 130*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, (%edx) 131*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 132*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 133*8d67ca89SAndroid Build Coastguard Worker je L(eq) 134*8d67ca89SAndroid Build Coastguard Worker 135*8d67ca89SAndroid Build Coastguard Worker movzbl 1(%eax), %ecx 136*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 1(%edx) 137*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 138*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 139*8d67ca89SAndroid Build Coastguard Worker je L(eq) 140*8d67ca89SAndroid Build Coastguard Worker 141*8d67ca89SAndroid Build Coastguard Worker movzbl 2(%eax), %ecx 142*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 2(%edx) 143*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 144*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 145*8d67ca89SAndroid Build Coastguard Worker je L(eq) 146*8d67ca89SAndroid Build Coastguard Worker 147*8d67ca89SAndroid Build Coastguard Worker movzbl 3(%eax), %ecx 148*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 3(%edx) 149*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 150*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 151*8d67ca89SAndroid Build Coastguard Worker je L(eq) 152*8d67ca89SAndroid Build Coastguard Worker 153*8d67ca89SAndroid Build Coastguard Worker movzbl 4(%eax), %ecx 154*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 4(%edx) 155*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 156*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 157*8d67ca89SAndroid Build Coastguard Worker je L(eq) 158*8d67ca89SAndroid Build Coastguard Worker 159*8d67ca89SAndroid Build Coastguard Worker movzbl 5(%eax), %ecx 160*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 5(%edx) 161*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 162*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 163*8d67ca89SAndroid Build Coastguard Worker je L(eq) 164*8d67ca89SAndroid Build Coastguard Worker 165*8d67ca89SAndroid Build Coastguard Worker movzbl 6(%eax), %ecx 166*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 6(%edx) 167*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 168*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 169*8d67ca89SAndroid Build Coastguard Worker je L(eq) 170*8d67ca89SAndroid Build Coastguard Worker 171*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%eax), %ecx 172*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 7(%edx) 173*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 174*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ecx 175*8d67ca89SAndroid Build Coastguard Worker je L(eq) 176*8d67ca89SAndroid Build Coastguard Worker 177*8d67ca89SAndroid Build Coastguard Worker add $8, %edx 178*8d67ca89SAndroid Build Coastguard Worker add $8, %eax 179*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 180*8d67ca89SAndroid Build Coastguard Worker cmpl $8, %ebp 181*8d67ca89SAndroid Build Coastguard Worker lea -8(%ebp), %ebp 182*8d67ca89SAndroid Build Coastguard Worker je L(eq) 183*8d67ca89SAndroid Build Coastguard WorkerL(more16bytes): 184*8d67ca89SAndroid Build Coastguard Worker#endif 185*8d67ca89SAndroid Build Coastguard Worker movl %edx, %ecx 186*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %ecx 187*8d67ca89SAndroid Build Coastguard Worker cmpl $0xff0, %ecx 188*8d67ca89SAndroid Build Coastguard Worker ja L(crosspage) 189*8d67ca89SAndroid Build Coastguard Worker mov %eax, %ecx 190*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %ecx 191*8d67ca89SAndroid Build Coastguard Worker cmpl $0xff0, %ecx 192*8d67ca89SAndroid Build Coastguard Worker ja L(crosspage) 193*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 194*8d67ca89SAndroid Build Coastguard Worker movlpd (%eax), %xmm1 195*8d67ca89SAndroid Build Coastguard Worker movlpd (%edx), %xmm2 196*8d67ca89SAndroid Build Coastguard Worker movhpd 8(%eax), %xmm1 197*8d67ca89SAndroid Build Coastguard Worker movhpd 8(%edx), %xmm2 198*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 199*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 200*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 201*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %ecx 202*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %ecx 203*8d67ca89SAndroid Build Coastguard Worker jnz L(less16bytes) 204*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 205*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 206*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 207*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 208*8d67ca89SAndroid Build Coastguard Worker#endif 209*8d67ca89SAndroid Build Coastguard Worker add $16, %eax 210*8d67ca89SAndroid Build Coastguard Worker add $16, %edx 211*8d67ca89SAndroid Build Coastguard Worker 212*8d67ca89SAndroid Build Coastguard WorkerL(crosspage): 213*8d67ca89SAndroid Build Coastguard Worker 214*8d67ca89SAndroid Build Coastguard Worker PUSH (%ebx) 215*8d67ca89SAndroid Build Coastguard Worker PUSH (%edi) 216*8d67ca89SAndroid Build Coastguard Worker PUSH (%esi) 217*8d67ca89SAndroid Build Coastguard Worker 218*8d67ca89SAndroid Build Coastguard Worker movl %edx, %edi 219*8d67ca89SAndroid Build Coastguard Worker movl %eax, %ecx 220*8d67ca89SAndroid Build Coastguard Worker and $0xf, %ecx 221*8d67ca89SAndroid Build Coastguard Worker and $0xf, %edi 222*8d67ca89SAndroid Build Coastguard Worker xor %ecx, %eax 223*8d67ca89SAndroid Build Coastguard Worker xor %edi, %edx 224*8d67ca89SAndroid Build Coastguard Worker xor %ebx, %ebx 225*8d67ca89SAndroid Build Coastguard Worker cmpl %edi, %ecx 226*8d67ca89SAndroid Build Coastguard Worker je L(ashr_0) 227*8d67ca89SAndroid Build Coastguard Worker ja L(bigger) 228*8d67ca89SAndroid Build Coastguard Worker or $0x20, %ebx 229*8d67ca89SAndroid Build Coastguard Worker xchg %edx, %eax 230*8d67ca89SAndroid Build Coastguard Worker xchg %ecx, %edi 231*8d67ca89SAndroid Build Coastguard WorkerL(bigger): 232*8d67ca89SAndroid Build Coastguard Worker lea 15(%edi), %edi 233*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %edi 234*8d67ca89SAndroid Build Coastguard Worker cmpl $8, %edi 235*8d67ca89SAndroid Build Coastguard Worker jle L(ashr_less_8) 236*8d67ca89SAndroid Build Coastguard Worker cmpl $14, %edi 237*8d67ca89SAndroid Build Coastguard Worker je L(ashr_15) 238*8d67ca89SAndroid Build Coastguard Worker cmpl $13, %edi 239*8d67ca89SAndroid Build Coastguard Worker je L(ashr_14) 240*8d67ca89SAndroid Build Coastguard Worker cmpl $12, %edi 241*8d67ca89SAndroid Build Coastguard Worker je L(ashr_13) 242*8d67ca89SAndroid Build Coastguard Worker cmpl $11, %edi 243*8d67ca89SAndroid Build Coastguard Worker je L(ashr_12) 244*8d67ca89SAndroid Build Coastguard Worker cmpl $10, %edi 245*8d67ca89SAndroid Build Coastguard Worker je L(ashr_11) 246*8d67ca89SAndroid Build Coastguard Worker cmpl $9, %edi 247*8d67ca89SAndroid Build Coastguard Worker je L(ashr_10) 248*8d67ca89SAndroid Build Coastguard WorkerL(ashr_less_8): 249*8d67ca89SAndroid Build Coastguard Worker je L(ashr_9) 250*8d67ca89SAndroid Build Coastguard Worker cmpl $7, %edi 251*8d67ca89SAndroid Build Coastguard Worker je L(ashr_8) 252*8d67ca89SAndroid Build Coastguard Worker cmpl $6, %edi 253*8d67ca89SAndroid Build Coastguard Worker je L(ashr_7) 254*8d67ca89SAndroid Build Coastguard Worker cmpl $5, %edi 255*8d67ca89SAndroid Build Coastguard Worker je L(ashr_6) 256*8d67ca89SAndroid Build Coastguard Worker cmpl $4, %edi 257*8d67ca89SAndroid Build Coastguard Worker je L(ashr_5) 258*8d67ca89SAndroid Build Coastguard Worker cmpl $3, %edi 259*8d67ca89SAndroid Build Coastguard Worker je L(ashr_4) 260*8d67ca89SAndroid Build Coastguard Worker cmpl $2, %edi 261*8d67ca89SAndroid Build Coastguard Worker je L(ashr_3) 262*8d67ca89SAndroid Build Coastguard Worker cmpl $1, %edi 263*8d67ca89SAndroid Build Coastguard Worker je L(ashr_2) 264*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %edi 265*8d67ca89SAndroid Build Coastguard Worker je L(ashr_1) 266*8d67ca89SAndroid Build Coastguard Worker 267*8d67ca89SAndroid Build Coastguard Worker/* 268*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_0 269*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 270*8d67ca89SAndroid Build Coastguard Worker * n(0~15) n(0~15) 15(15+ n-n) ashr_0 271*8d67ca89SAndroid Build Coastguard Worker */ 272*8d67ca89SAndroid Build Coastguard Worker .p2align 4 273*8d67ca89SAndroid Build Coastguard WorkerL(ashr_0): 274*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 275*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 276*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 277*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 278*8d67ca89SAndroid Build Coastguard Worker pcmpeqb (%edx), %xmm1 279*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 280*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %edi 281*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 282*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 283*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 284*8d67ca89SAndroid Build Coastguard Worker mov %ecx, %edi 285*8d67ca89SAndroid Build Coastguard Worker jne L(less32bytes) 286*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 287*8d67ca89SAndroid Build Coastguard Worker mov $0x10, %ebx 288*8d67ca89SAndroid Build Coastguard Worker mov $0x10, %ecx 289*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 290*8d67ca89SAndroid Build Coastguard Worker .p2align 4 291*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_0): 292*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 293*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 294*8d67ca89SAndroid Build Coastguard Worker 295*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 296*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 297*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 298*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 299*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 300*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 301*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 302*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 303*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 304*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 305*8d67ca89SAndroid Build Coastguard Worker#endif 306*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 307*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_0) 308*8d67ca89SAndroid Build Coastguard Worker 309*8d67ca89SAndroid Build Coastguard Worker/* 310*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_1 311*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 312*8d67ca89SAndroid Build Coastguard Worker * n(15) n -15 0(15 +(n-15) - n) ashr_1 313*8d67ca89SAndroid Build Coastguard Worker */ 314*8d67ca89SAndroid Build Coastguard Worker .p2align 4 315*8d67ca89SAndroid Build Coastguard WorkerL(ashr_1): 316*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 317*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 318*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 319*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 320*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 321*8d67ca89SAndroid Build Coastguard Worker pslldq $15, %xmm2 322*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 323*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 324*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 325*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 326*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 327*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 328*8d67ca89SAndroid Build Coastguard Worker lea -15(%ecx), %edi 329*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 330*8d67ca89SAndroid Build Coastguard Worker 331*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 332*8d67ca89SAndroid Build Coastguard Worker 333*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 334*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 335*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 336*8d67ca89SAndroid Build Coastguard Worker or $1, %ebx 337*8d67ca89SAndroid Build Coastguard Worker lea 1(%edx), %edi 338*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 339*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 340*8d67ca89SAndroid Build Coastguard Worker 341*8d67ca89SAndroid Build Coastguard Worker .p2align 4 342*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_1): 343*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 344*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_1) 345*8d67ca89SAndroid Build Coastguard Worker 346*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_1): 347*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 348*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 349*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 350*8d67ca89SAndroid Build Coastguard Worker 351*8d67ca89SAndroid Build Coastguard Worker palignr $1, %xmm3, %xmm2 352*8d67ca89SAndroid Build Coastguard Worker 353*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 354*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 355*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 356*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 357*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 358*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 359*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 360*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 361*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 362*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 363*8d67ca89SAndroid Build Coastguard Worker#endif 364*8d67ca89SAndroid Build Coastguard Worker 365*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 366*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 367*8d67ca89SAndroid Build Coastguard Worker 368*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 369*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_1) 370*8d67ca89SAndroid Build Coastguard Worker 371*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 372*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 373*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 374*8d67ca89SAndroid Build Coastguard Worker 375*8d67ca89SAndroid Build Coastguard Worker palignr $1, %xmm3, %xmm2 376*8d67ca89SAndroid Build Coastguard Worker 377*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 378*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 379*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 380*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 381*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 382*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 383*8d67ca89SAndroid Build Coastguard Worker 384*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 385*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 386*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 387*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 388*8d67ca89SAndroid Build Coastguard Worker#endif 389*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 390*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 391*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_1) 392*8d67ca89SAndroid Build Coastguard Worker 393*8d67ca89SAndroid Build Coastguard Worker .p2align 4 394*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_1): 395*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 396*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 397*8d67ca89SAndroid Build Coastguard Worker test $0xfffe, %esi 398*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_1_exittail) 399*8d67ca89SAndroid Build Coastguard Worker 400*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 401*8d67ca89SAndroid Build Coastguard Worker cmpl $15, %ebp 402*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_1_exittail) 403*8d67ca89SAndroid Build Coastguard Worker#endif 404*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 405*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 406*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_1) 407*8d67ca89SAndroid Build Coastguard Worker 408*8d67ca89SAndroid Build Coastguard Worker .p2align 4 409*8d67ca89SAndroid Build Coastguard WorkerL(ashr_1_exittail): 410*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 411*8d67ca89SAndroid Build Coastguard Worker psrldq $1, %xmm0 412*8d67ca89SAndroid Build Coastguard Worker psrldq $1, %xmm3 413*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 414*8d67ca89SAndroid Build Coastguard Worker 415*8d67ca89SAndroid Build Coastguard Worker/* 416*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_2 417*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 418*8d67ca89SAndroid Build Coastguard Worker * n(14~15) n -14 1(15 +(n-14) - n) ashr_2 419*8d67ca89SAndroid Build Coastguard Worker */ 420*8d67ca89SAndroid Build Coastguard Worker .p2align 4 421*8d67ca89SAndroid Build Coastguard WorkerL(ashr_2): 422*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 423*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 424*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 425*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 426*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 427*8d67ca89SAndroid Build Coastguard Worker pslldq $14, %xmm2 428*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 429*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 430*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 431*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 432*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 433*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 434*8d67ca89SAndroid Build Coastguard Worker lea -14(%ecx), %edi 435*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 436*8d67ca89SAndroid Build Coastguard Worker 437*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 438*8d67ca89SAndroid Build Coastguard Worker 439*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 440*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 441*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 442*8d67ca89SAndroid Build Coastguard Worker or $2, %ebx 443*8d67ca89SAndroid Build Coastguard Worker lea 2(%edx), %edi 444*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 445*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 446*8d67ca89SAndroid Build Coastguard Worker 447*8d67ca89SAndroid Build Coastguard Worker .p2align 4 448*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_2): 449*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 450*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_2) 451*8d67ca89SAndroid Build Coastguard Worker 452*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_2): 453*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 454*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 455*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 456*8d67ca89SAndroid Build Coastguard Worker 457*8d67ca89SAndroid Build Coastguard Worker palignr $2, %xmm3, %xmm2 458*8d67ca89SAndroid Build Coastguard Worker 459*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 460*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 461*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 462*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 463*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 464*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 465*8d67ca89SAndroid Build Coastguard Worker 466*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 467*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 468*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 469*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 470*8d67ca89SAndroid Build Coastguard Worker#endif 471*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 472*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 473*8d67ca89SAndroid Build Coastguard Worker 474*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 475*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_2) 476*8d67ca89SAndroid Build Coastguard Worker 477*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 478*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 479*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 480*8d67ca89SAndroid Build Coastguard Worker 481*8d67ca89SAndroid Build Coastguard Worker palignr $2, %xmm3, %xmm2 482*8d67ca89SAndroid Build Coastguard Worker 483*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 484*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 485*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 486*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 487*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 488*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 489*8d67ca89SAndroid Build Coastguard Worker 490*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 491*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 492*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 493*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 494*8d67ca89SAndroid Build Coastguard Worker#endif 495*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 496*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 497*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_2) 498*8d67ca89SAndroid Build Coastguard Worker 499*8d67ca89SAndroid Build Coastguard Worker .p2align 4 500*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_2): 501*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 502*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 503*8d67ca89SAndroid Build Coastguard Worker test $0xfffc, %esi 504*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_2_exittail) 505*8d67ca89SAndroid Build Coastguard Worker 506*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 507*8d67ca89SAndroid Build Coastguard Worker cmpl $14, %ebp 508*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_2_exittail) 509*8d67ca89SAndroid Build Coastguard Worker#endif 510*8d67ca89SAndroid Build Coastguard Worker 511*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 512*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 513*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_2) 514*8d67ca89SAndroid Build Coastguard Worker 515*8d67ca89SAndroid Build Coastguard Worker .p2align 4 516*8d67ca89SAndroid Build Coastguard WorkerL(ashr_2_exittail): 517*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 518*8d67ca89SAndroid Build Coastguard Worker psrldq $2, %xmm0 519*8d67ca89SAndroid Build Coastguard Worker psrldq $2, %xmm3 520*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 521*8d67ca89SAndroid Build Coastguard Worker 522*8d67ca89SAndroid Build Coastguard Worker/* 523*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_3 524*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 525*8d67ca89SAndroid Build Coastguard Worker * n(13~15) n -13 2(15 +(n-13) - n) ashr_3 526*8d67ca89SAndroid Build Coastguard Worker */ 527*8d67ca89SAndroid Build Coastguard Worker .p2align 4 528*8d67ca89SAndroid Build Coastguard WorkerL(ashr_3): 529*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 530*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 531*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 532*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 533*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 534*8d67ca89SAndroid Build Coastguard Worker pslldq $13, %xmm2 535*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 536*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 537*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 538*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 539*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 540*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 541*8d67ca89SAndroid Build Coastguard Worker lea -13(%ecx), %edi 542*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 543*8d67ca89SAndroid Build Coastguard Worker 544*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 545*8d67ca89SAndroid Build Coastguard Worker 546*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 547*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 548*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 549*8d67ca89SAndroid Build Coastguard Worker or $3, %ebx 550*8d67ca89SAndroid Build Coastguard Worker lea 3(%edx), %edi 551*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 552*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 553*8d67ca89SAndroid Build Coastguard Worker 554*8d67ca89SAndroid Build Coastguard Worker .p2align 4 555*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_3): 556*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 557*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_3) 558*8d67ca89SAndroid Build Coastguard Worker 559*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_3): 560*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 561*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 562*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 563*8d67ca89SAndroid Build Coastguard Worker 564*8d67ca89SAndroid Build Coastguard Worker palignr $3, %xmm3, %xmm2 565*8d67ca89SAndroid Build Coastguard Worker 566*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 567*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 568*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 569*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 570*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 571*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 572*8d67ca89SAndroid Build Coastguard Worker 573*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 574*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 575*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 576*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 577*8d67ca89SAndroid Build Coastguard Worker#endif 578*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 579*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 580*8d67ca89SAndroid Build Coastguard Worker 581*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 582*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_3) 583*8d67ca89SAndroid Build Coastguard Worker 584*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 585*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 586*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 587*8d67ca89SAndroid Build Coastguard Worker 588*8d67ca89SAndroid Build Coastguard Worker palignr $3, %xmm3, %xmm2 589*8d67ca89SAndroid Build Coastguard Worker 590*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 591*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 592*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 593*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 594*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 595*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 596*8d67ca89SAndroid Build Coastguard Worker 597*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 598*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 599*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 600*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 601*8d67ca89SAndroid Build Coastguard Worker#endif 602*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 603*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 604*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_3) 605*8d67ca89SAndroid Build Coastguard Worker 606*8d67ca89SAndroid Build Coastguard Worker .p2align 4 607*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_3): 608*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 609*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 610*8d67ca89SAndroid Build Coastguard Worker test $0xfff8, %esi 611*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_3_exittail) 612*8d67ca89SAndroid Build Coastguard Worker 613*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 614*8d67ca89SAndroid Build Coastguard Worker cmpl $13, %ebp 615*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_3_exittail) 616*8d67ca89SAndroid Build Coastguard Worker#endif 617*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 618*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 619*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_3) 620*8d67ca89SAndroid Build Coastguard Worker 621*8d67ca89SAndroid Build Coastguard Worker .p2align 4 622*8d67ca89SAndroid Build Coastguard WorkerL(ashr_3_exittail): 623*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 624*8d67ca89SAndroid Build Coastguard Worker psrldq $3, %xmm0 625*8d67ca89SAndroid Build Coastguard Worker psrldq $3, %xmm3 626*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 627*8d67ca89SAndroid Build Coastguard Worker 628*8d67ca89SAndroid Build Coastguard Worker/* 629*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_4 630*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 631*8d67ca89SAndroid Build Coastguard Worker * n(12~15) n -12 3(15 +(n-12) - n) ashr_4 632*8d67ca89SAndroid Build Coastguard Worker */ 633*8d67ca89SAndroid Build Coastguard Worker .p2align 4 634*8d67ca89SAndroid Build Coastguard WorkerL(ashr_4): 635*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 636*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 637*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 638*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 639*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 640*8d67ca89SAndroid Build Coastguard Worker pslldq $12, %xmm2 641*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 642*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 643*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 644*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 645*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 646*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 647*8d67ca89SAndroid Build Coastguard Worker lea -12(%ecx), %edi 648*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 649*8d67ca89SAndroid Build Coastguard Worker 650*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 651*8d67ca89SAndroid Build Coastguard Worker 652*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 653*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 654*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 655*8d67ca89SAndroid Build Coastguard Worker or $4, %ebx 656*8d67ca89SAndroid Build Coastguard Worker lea 4(%edx), %edi 657*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 658*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 659*8d67ca89SAndroid Build Coastguard Worker 660*8d67ca89SAndroid Build Coastguard Worker .p2align 4 661*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_4): 662*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 663*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_4) 664*8d67ca89SAndroid Build Coastguard Worker 665*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_4): 666*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 667*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 668*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 669*8d67ca89SAndroid Build Coastguard Worker 670*8d67ca89SAndroid Build Coastguard Worker palignr $4, %xmm3, %xmm2 671*8d67ca89SAndroid Build Coastguard Worker 672*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 673*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 674*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 675*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 676*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 677*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 678*8d67ca89SAndroid Build Coastguard Worker 679*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 680*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 681*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 682*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 683*8d67ca89SAndroid Build Coastguard Worker#endif 684*8d67ca89SAndroid Build Coastguard Worker 685*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 686*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 687*8d67ca89SAndroid Build Coastguard Worker 688*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 689*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_4) 690*8d67ca89SAndroid Build Coastguard Worker 691*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 692*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 693*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 694*8d67ca89SAndroid Build Coastguard Worker 695*8d67ca89SAndroid Build Coastguard Worker palignr $4, %xmm3, %xmm2 696*8d67ca89SAndroid Build Coastguard Worker 697*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 698*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 699*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 700*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 701*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 702*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 703*8d67ca89SAndroid Build Coastguard Worker 704*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 705*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 706*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 707*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 708*8d67ca89SAndroid Build Coastguard Worker#endif 709*8d67ca89SAndroid Build Coastguard Worker 710*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 711*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 712*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_4) 713*8d67ca89SAndroid Build Coastguard Worker 714*8d67ca89SAndroid Build Coastguard Worker .p2align 4 715*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_4): 716*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 717*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 718*8d67ca89SAndroid Build Coastguard Worker test $0xfff0, %esi 719*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_4_exittail) 720*8d67ca89SAndroid Build Coastguard Worker 721*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 722*8d67ca89SAndroid Build Coastguard Worker cmpl $12, %ebp 723*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_4_exittail) 724*8d67ca89SAndroid Build Coastguard Worker#endif 725*8d67ca89SAndroid Build Coastguard Worker 726*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 727*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 728*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_4) 729*8d67ca89SAndroid Build Coastguard Worker 730*8d67ca89SAndroid Build Coastguard Worker .p2align 4 731*8d67ca89SAndroid Build Coastguard WorkerL(ashr_4_exittail): 732*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 733*8d67ca89SAndroid Build Coastguard Worker psrldq $4, %xmm0 734*8d67ca89SAndroid Build Coastguard Worker psrldq $4, %xmm3 735*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 736*8d67ca89SAndroid Build Coastguard Worker 737*8d67ca89SAndroid Build Coastguard Worker/* 738*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_5 739*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 740*8d67ca89SAndroid Build Coastguard Worker * n(11~15) n -11 4(15 +(n-11) - n) ashr_5 741*8d67ca89SAndroid Build Coastguard Worker */ 742*8d67ca89SAndroid Build Coastguard Worker .p2align 4 743*8d67ca89SAndroid Build Coastguard WorkerL(ashr_5): 744*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 745*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 746*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 747*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 748*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 749*8d67ca89SAndroid Build Coastguard Worker pslldq $11, %xmm2 750*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 751*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 752*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 753*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 754*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 755*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 756*8d67ca89SAndroid Build Coastguard Worker lea -11(%ecx), %edi 757*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 758*8d67ca89SAndroid Build Coastguard Worker 759*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 760*8d67ca89SAndroid Build Coastguard Worker 761*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 762*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 763*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 764*8d67ca89SAndroid Build Coastguard Worker or $5, %ebx 765*8d67ca89SAndroid Build Coastguard Worker lea 5(%edx), %edi 766*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 767*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 768*8d67ca89SAndroid Build Coastguard Worker 769*8d67ca89SAndroid Build Coastguard Worker .p2align 4 770*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_5): 771*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 772*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_5) 773*8d67ca89SAndroid Build Coastguard Worker 774*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_5): 775*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 776*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 777*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 778*8d67ca89SAndroid Build Coastguard Worker 779*8d67ca89SAndroid Build Coastguard Worker palignr $5, %xmm3, %xmm2 780*8d67ca89SAndroid Build Coastguard Worker 781*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 782*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 783*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 784*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 785*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 786*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 787*8d67ca89SAndroid Build Coastguard Worker 788*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 789*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 790*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 791*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 792*8d67ca89SAndroid Build Coastguard Worker#endif 793*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 794*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 795*8d67ca89SAndroid Build Coastguard Worker 796*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 797*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_5) 798*8d67ca89SAndroid Build Coastguard Worker 799*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 800*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 801*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 802*8d67ca89SAndroid Build Coastguard Worker 803*8d67ca89SAndroid Build Coastguard Worker palignr $5, %xmm3, %xmm2 804*8d67ca89SAndroid Build Coastguard Worker 805*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 806*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 807*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 808*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 809*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 810*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 811*8d67ca89SAndroid Build Coastguard Worker 812*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 813*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 814*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 815*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 816*8d67ca89SAndroid Build Coastguard Worker#endif 817*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 818*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 819*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_5) 820*8d67ca89SAndroid Build Coastguard Worker 821*8d67ca89SAndroid Build Coastguard Worker .p2align 4 822*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_5): 823*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 824*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 825*8d67ca89SAndroid Build Coastguard Worker test $0xffe0, %esi 826*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_5_exittail) 827*8d67ca89SAndroid Build Coastguard Worker 828*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 829*8d67ca89SAndroid Build Coastguard Worker cmpl $11, %ebp 830*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_5_exittail) 831*8d67ca89SAndroid Build Coastguard Worker#endif 832*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 833*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 834*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_5) 835*8d67ca89SAndroid Build Coastguard Worker 836*8d67ca89SAndroid Build Coastguard Worker .p2align 4 837*8d67ca89SAndroid Build Coastguard WorkerL(ashr_5_exittail): 838*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 839*8d67ca89SAndroid Build Coastguard Worker psrldq $5, %xmm0 840*8d67ca89SAndroid Build Coastguard Worker psrldq $5, %xmm3 841*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 842*8d67ca89SAndroid Build Coastguard Worker 843*8d67ca89SAndroid Build Coastguard Worker/* 844*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_6 845*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 846*8d67ca89SAndroid Build Coastguard Worker * n(10~15) n -10 5(15 +(n-10) - n) ashr_6 847*8d67ca89SAndroid Build Coastguard Worker */ 848*8d67ca89SAndroid Build Coastguard Worker 849*8d67ca89SAndroid Build Coastguard Worker .p2align 4 850*8d67ca89SAndroid Build Coastguard WorkerL(ashr_6): 851*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 852*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 853*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 854*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 855*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 856*8d67ca89SAndroid Build Coastguard Worker pslldq $10, %xmm2 857*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 858*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 859*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 860*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 861*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 862*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 863*8d67ca89SAndroid Build Coastguard Worker lea -10(%ecx), %edi 864*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 865*8d67ca89SAndroid Build Coastguard Worker 866*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 867*8d67ca89SAndroid Build Coastguard Worker 868*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 869*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 870*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 871*8d67ca89SAndroid Build Coastguard Worker or $6, %ebx 872*8d67ca89SAndroid Build Coastguard Worker lea 6(%edx), %edi 873*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 874*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 875*8d67ca89SAndroid Build Coastguard Worker 876*8d67ca89SAndroid Build Coastguard Worker .p2align 4 877*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_6): 878*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 879*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_6) 880*8d67ca89SAndroid Build Coastguard Worker 881*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_6): 882*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 883*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 884*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 885*8d67ca89SAndroid Build Coastguard Worker 886*8d67ca89SAndroid Build Coastguard Worker palignr $6, %xmm3, %xmm2 887*8d67ca89SAndroid Build Coastguard Worker 888*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 889*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 890*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 891*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 892*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 893*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 894*8d67ca89SAndroid Build Coastguard Worker 895*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 896*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 897*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 898*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 899*8d67ca89SAndroid Build Coastguard Worker#endif 900*8d67ca89SAndroid Build Coastguard Worker 901*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 902*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 903*8d67ca89SAndroid Build Coastguard Worker 904*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 905*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_6) 906*8d67ca89SAndroid Build Coastguard Worker 907*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 908*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 909*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 910*8d67ca89SAndroid Build Coastguard Worker 911*8d67ca89SAndroid Build Coastguard Worker palignr $6, %xmm3, %xmm2 912*8d67ca89SAndroid Build Coastguard Worker 913*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 914*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 915*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 916*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 917*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 918*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 919*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 920*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 921*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 922*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 923*8d67ca89SAndroid Build Coastguard Worker#endif 924*8d67ca89SAndroid Build Coastguard Worker 925*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 926*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 927*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_6) 928*8d67ca89SAndroid Build Coastguard Worker 929*8d67ca89SAndroid Build Coastguard Worker .p2align 4 930*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_6): 931*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 932*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 933*8d67ca89SAndroid Build Coastguard Worker test $0xffc0, %esi 934*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_6_exittail) 935*8d67ca89SAndroid Build Coastguard Worker 936*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 937*8d67ca89SAndroid Build Coastguard Worker cmpl $10, %ebp 938*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_6_exittail) 939*8d67ca89SAndroid Build Coastguard Worker#endif 940*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 941*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 942*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_6) 943*8d67ca89SAndroid Build Coastguard Worker 944*8d67ca89SAndroid Build Coastguard Worker .p2align 4 945*8d67ca89SAndroid Build Coastguard WorkerL(ashr_6_exittail): 946*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 947*8d67ca89SAndroid Build Coastguard Worker psrldq $6, %xmm0 948*8d67ca89SAndroid Build Coastguard Worker psrldq $6, %xmm3 949*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 950*8d67ca89SAndroid Build Coastguard Worker 951*8d67ca89SAndroid Build Coastguard Worker/* 952*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_7 953*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 954*8d67ca89SAndroid Build Coastguard Worker * n(9~15) n - 9 6(15 +(n-9) - n) ashr_7 955*8d67ca89SAndroid Build Coastguard Worker */ 956*8d67ca89SAndroid Build Coastguard Worker 957*8d67ca89SAndroid Build Coastguard Worker .p2align 4 958*8d67ca89SAndroid Build Coastguard WorkerL(ashr_7): 959*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 960*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 961*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 962*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 963*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 964*8d67ca89SAndroid Build Coastguard Worker pslldq $9, %xmm2 965*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 966*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 967*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 968*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 969*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 970*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 971*8d67ca89SAndroid Build Coastguard Worker lea -9(%ecx), %edi 972*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 973*8d67ca89SAndroid Build Coastguard Worker 974*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 975*8d67ca89SAndroid Build Coastguard Worker 976*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 977*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 978*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 979*8d67ca89SAndroid Build Coastguard Worker or $7, %ebx 980*8d67ca89SAndroid Build Coastguard Worker lea 8(%edx), %edi 981*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 982*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 983*8d67ca89SAndroid Build Coastguard Worker 984*8d67ca89SAndroid Build Coastguard Worker .p2align 4 985*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_7): 986*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 987*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_7) 988*8d67ca89SAndroid Build Coastguard Worker 989*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_7): 990*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 991*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 992*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 993*8d67ca89SAndroid Build Coastguard Worker 994*8d67ca89SAndroid Build Coastguard Worker palignr $7, %xmm3, %xmm2 995*8d67ca89SAndroid Build Coastguard Worker 996*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 997*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 998*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 999*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1000*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1001*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1002*8d67ca89SAndroid Build Coastguard Worker 1003*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1004*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1005*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1006*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1007*8d67ca89SAndroid Build Coastguard Worker#endif 1008*8d67ca89SAndroid Build Coastguard Worker 1009*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1010*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1011*8d67ca89SAndroid Build Coastguard Worker 1012*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1013*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_7) 1014*8d67ca89SAndroid Build Coastguard Worker 1015*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1016*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1017*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1018*8d67ca89SAndroid Build Coastguard Worker 1019*8d67ca89SAndroid Build Coastguard Worker palignr $7, %xmm3, %xmm2 1020*8d67ca89SAndroid Build Coastguard Worker 1021*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1022*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1023*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1024*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1025*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1026*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1027*8d67ca89SAndroid Build Coastguard Worker 1028*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1029*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1030*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1031*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1032*8d67ca89SAndroid Build Coastguard Worker#endif 1033*8d67ca89SAndroid Build Coastguard Worker 1034*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1035*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1036*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_7) 1037*8d67ca89SAndroid Build Coastguard Worker 1038*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1039*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_7): 1040*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1041*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1042*8d67ca89SAndroid Build Coastguard Worker test $0xff80, %esi 1043*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_7_exittail) 1044*8d67ca89SAndroid Build Coastguard Worker 1045*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1046*8d67ca89SAndroid Build Coastguard Worker cmpl $9, %ebp 1047*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_7_exittail) 1048*8d67ca89SAndroid Build Coastguard Worker#endif 1049*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1050*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1051*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1052*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_7) 1053*8d67ca89SAndroid Build Coastguard Worker 1054*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1055*8d67ca89SAndroid Build Coastguard WorkerL(ashr_7_exittail): 1056*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1057*8d67ca89SAndroid Build Coastguard Worker psrldq $7, %xmm0 1058*8d67ca89SAndroid Build Coastguard Worker psrldq $7, %xmm3 1059*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1060*8d67ca89SAndroid Build Coastguard Worker 1061*8d67ca89SAndroid Build Coastguard Worker/* 1062*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_8 1063*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1064*8d67ca89SAndroid Build Coastguard Worker * n(8~15) n - 8 7(15 +(n-8) - n) ashr_8 1065*8d67ca89SAndroid Build Coastguard Worker */ 1066*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1067*8d67ca89SAndroid Build Coastguard WorkerL(ashr_8): 1068*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1069*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1070*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1071*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1072*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1073*8d67ca89SAndroid Build Coastguard Worker pslldq $8, %xmm2 1074*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1075*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1076*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1077*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1078*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1079*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1080*8d67ca89SAndroid Build Coastguard Worker lea -8(%ecx), %edi 1081*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1082*8d67ca89SAndroid Build Coastguard Worker 1083*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1084*8d67ca89SAndroid Build Coastguard Worker 1085*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1086*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1087*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1088*8d67ca89SAndroid Build Coastguard Worker or $8, %ebx 1089*8d67ca89SAndroid Build Coastguard Worker lea 8(%edx), %edi 1090*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1091*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1092*8d67ca89SAndroid Build Coastguard Worker 1093*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1094*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_8): 1095*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1096*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_8) 1097*8d67ca89SAndroid Build Coastguard Worker 1098*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_8): 1099*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1100*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1101*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1102*8d67ca89SAndroid Build Coastguard Worker 1103*8d67ca89SAndroid Build Coastguard Worker palignr $8, %xmm3, %xmm2 1104*8d67ca89SAndroid Build Coastguard Worker 1105*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1106*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1107*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1108*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1109*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1110*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1111*8d67ca89SAndroid Build Coastguard Worker 1112*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1113*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1114*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1115*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1116*8d67ca89SAndroid Build Coastguard Worker#endif 1117*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1118*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1119*8d67ca89SAndroid Build Coastguard Worker 1120*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1121*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_8) 1122*8d67ca89SAndroid Build Coastguard Worker 1123*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1124*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1125*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1126*8d67ca89SAndroid Build Coastguard Worker 1127*8d67ca89SAndroid Build Coastguard Worker palignr $8, %xmm3, %xmm2 1128*8d67ca89SAndroid Build Coastguard Worker 1129*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1130*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1131*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1132*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1133*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1134*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1135*8d67ca89SAndroid Build Coastguard Worker 1136*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1137*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1138*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1139*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1140*8d67ca89SAndroid Build Coastguard Worker#endif 1141*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1142*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1143*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_8) 1144*8d67ca89SAndroid Build Coastguard Worker 1145*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1146*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_8): 1147*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1148*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1149*8d67ca89SAndroid Build Coastguard Worker test $0xff00, %esi 1150*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_8_exittail) 1151*8d67ca89SAndroid Build Coastguard Worker 1152*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1153*8d67ca89SAndroid Build Coastguard Worker cmpl $8, %ebp 1154*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_8_exittail) 1155*8d67ca89SAndroid Build Coastguard Worker#endif 1156*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1157*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1158*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1159*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_8) 1160*8d67ca89SAndroid Build Coastguard Worker 1161*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1162*8d67ca89SAndroid Build Coastguard WorkerL(ashr_8_exittail): 1163*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1164*8d67ca89SAndroid Build Coastguard Worker psrldq $8, %xmm0 1165*8d67ca89SAndroid Build Coastguard Worker psrldq $8, %xmm3 1166*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1167*8d67ca89SAndroid Build Coastguard Worker 1168*8d67ca89SAndroid Build Coastguard Worker/* 1169*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_9 1170*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1171*8d67ca89SAndroid Build Coastguard Worker * n(7~15) n - 7 8(15 +(n-7) - n) ashr_9 1172*8d67ca89SAndroid Build Coastguard Worker */ 1173*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1174*8d67ca89SAndroid Build Coastguard WorkerL(ashr_9): 1175*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1176*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1177*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1178*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1179*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1180*8d67ca89SAndroid Build Coastguard Worker pslldq $7, %xmm2 1181*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1182*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1183*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1184*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1185*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1186*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1187*8d67ca89SAndroid Build Coastguard Worker lea -7(%ecx), %edi 1188*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1189*8d67ca89SAndroid Build Coastguard Worker 1190*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1191*8d67ca89SAndroid Build Coastguard Worker 1192*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1193*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1194*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1195*8d67ca89SAndroid Build Coastguard Worker or $9, %ebx 1196*8d67ca89SAndroid Build Coastguard Worker lea 9(%edx), %edi 1197*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1198*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1199*8d67ca89SAndroid Build Coastguard Worker 1200*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1201*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_9): 1202*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1203*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_9) 1204*8d67ca89SAndroid Build Coastguard Worker 1205*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_9): 1206*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1207*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1208*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1209*8d67ca89SAndroid Build Coastguard Worker 1210*8d67ca89SAndroid Build Coastguard Worker palignr $9, %xmm3, %xmm2 1211*8d67ca89SAndroid Build Coastguard Worker 1212*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1213*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1214*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1215*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1216*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1217*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1218*8d67ca89SAndroid Build Coastguard Worker 1219*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1220*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1221*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1222*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1223*8d67ca89SAndroid Build Coastguard Worker#endif 1224*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1225*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1226*8d67ca89SAndroid Build Coastguard Worker 1227*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1228*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_9) 1229*8d67ca89SAndroid Build Coastguard Worker 1230*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1231*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1232*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1233*8d67ca89SAndroid Build Coastguard Worker 1234*8d67ca89SAndroid Build Coastguard Worker palignr $9, %xmm3, %xmm2 1235*8d67ca89SAndroid Build Coastguard Worker 1236*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1237*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1238*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1239*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1240*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1241*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1242*8d67ca89SAndroid Build Coastguard Worker 1243*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1244*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1245*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1246*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1247*8d67ca89SAndroid Build Coastguard Worker#endif 1248*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1249*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1250*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_9) 1251*8d67ca89SAndroid Build Coastguard Worker 1252*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1253*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_9): 1254*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1255*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1256*8d67ca89SAndroid Build Coastguard Worker test $0xfe00, %esi 1257*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_9_exittail) 1258*8d67ca89SAndroid Build Coastguard Worker 1259*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1260*8d67ca89SAndroid Build Coastguard Worker cmpl $7, %ebp 1261*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_9_exittail) 1262*8d67ca89SAndroid Build Coastguard Worker#endif 1263*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1264*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1265*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_9) 1266*8d67ca89SAndroid Build Coastguard Worker 1267*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1268*8d67ca89SAndroid Build Coastguard WorkerL(ashr_9_exittail): 1269*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1270*8d67ca89SAndroid Build Coastguard Worker psrldq $9, %xmm0 1271*8d67ca89SAndroid Build Coastguard Worker psrldq $9, %xmm3 1272*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1273*8d67ca89SAndroid Build Coastguard Worker 1274*8d67ca89SAndroid Build Coastguard Worker/* 1275*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_10 1276*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1277*8d67ca89SAndroid Build Coastguard Worker * n(6~15) n - 6 9(15 +(n-6) - n) ashr_10 1278*8d67ca89SAndroid Build Coastguard Worker */ 1279*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1280*8d67ca89SAndroid Build Coastguard WorkerL(ashr_10): 1281*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1282*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1283*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1284*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1285*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1286*8d67ca89SAndroid Build Coastguard Worker pslldq $6, %xmm2 1287*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1288*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1289*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1290*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1291*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1292*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1293*8d67ca89SAndroid Build Coastguard Worker lea -6(%ecx), %edi 1294*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1295*8d67ca89SAndroid Build Coastguard Worker 1296*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1297*8d67ca89SAndroid Build Coastguard Worker 1298*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1299*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1300*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1301*8d67ca89SAndroid Build Coastguard Worker or $10, %ebx 1302*8d67ca89SAndroid Build Coastguard Worker lea 10(%edx), %edi 1303*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1304*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1305*8d67ca89SAndroid Build Coastguard Worker 1306*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1307*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_10): 1308*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1309*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_10) 1310*8d67ca89SAndroid Build Coastguard Worker 1311*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_10): 1312*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1313*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1314*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1315*8d67ca89SAndroid Build Coastguard Worker 1316*8d67ca89SAndroid Build Coastguard Worker palignr $10, %xmm3, %xmm2 1317*8d67ca89SAndroid Build Coastguard Worker 1318*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1319*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1320*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1321*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1322*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1323*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1324*8d67ca89SAndroid Build Coastguard Worker 1325*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1326*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1327*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1328*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1329*8d67ca89SAndroid Build Coastguard Worker#endif 1330*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1331*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1332*8d67ca89SAndroid Build Coastguard Worker 1333*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1334*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_10) 1335*8d67ca89SAndroid Build Coastguard Worker 1336*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1337*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1338*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1339*8d67ca89SAndroid Build Coastguard Worker 1340*8d67ca89SAndroid Build Coastguard Worker palignr $10, %xmm3, %xmm2 1341*8d67ca89SAndroid Build Coastguard Worker 1342*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1343*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1344*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1345*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1346*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1347*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1348*8d67ca89SAndroid Build Coastguard Worker 1349*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1350*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1351*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1352*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1353*8d67ca89SAndroid Build Coastguard Worker#endif 1354*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1355*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1356*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_10) 1357*8d67ca89SAndroid Build Coastguard Worker 1358*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1359*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_10): 1360*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1361*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1362*8d67ca89SAndroid Build Coastguard Worker test $0xfc00, %esi 1363*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_10_exittail) 1364*8d67ca89SAndroid Build Coastguard Worker 1365*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1366*8d67ca89SAndroid Build Coastguard Worker cmpl $6, %ebp 1367*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_10_exittail) 1368*8d67ca89SAndroid Build Coastguard Worker#endif 1369*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1370*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1371*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_10) 1372*8d67ca89SAndroid Build Coastguard Worker 1373*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1374*8d67ca89SAndroid Build Coastguard WorkerL(ashr_10_exittail): 1375*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1376*8d67ca89SAndroid Build Coastguard Worker psrldq $10, %xmm0 1377*8d67ca89SAndroid Build Coastguard Worker psrldq $10, %xmm3 1378*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1379*8d67ca89SAndroid Build Coastguard Worker 1380*8d67ca89SAndroid Build Coastguard Worker/* 1381*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_11 1382*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1383*8d67ca89SAndroid Build Coastguard Worker * n(5~15) n - 5 10(15 +(n-5) - n) ashr_11 1384*8d67ca89SAndroid Build Coastguard Worker */ 1385*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1386*8d67ca89SAndroid Build Coastguard WorkerL(ashr_11): 1387*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1388*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1389*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1390*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1391*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1392*8d67ca89SAndroid Build Coastguard Worker pslldq $5, %xmm2 1393*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1394*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1395*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1396*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1397*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1398*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1399*8d67ca89SAndroid Build Coastguard Worker lea -5(%ecx), %edi 1400*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1401*8d67ca89SAndroid Build Coastguard Worker 1402*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1403*8d67ca89SAndroid Build Coastguard Worker 1404*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1405*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1406*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1407*8d67ca89SAndroid Build Coastguard Worker or $11, %ebx 1408*8d67ca89SAndroid Build Coastguard Worker lea 11(%edx), %edi 1409*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1410*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1411*8d67ca89SAndroid Build Coastguard Worker 1412*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1413*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_11): 1414*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1415*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_11) 1416*8d67ca89SAndroid Build Coastguard Worker 1417*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_11): 1418*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1419*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1420*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1421*8d67ca89SAndroid Build Coastguard Worker 1422*8d67ca89SAndroid Build Coastguard Worker palignr $11, %xmm3, %xmm2 1423*8d67ca89SAndroid Build Coastguard Worker 1424*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1425*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1426*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1427*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1428*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1429*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1430*8d67ca89SAndroid Build Coastguard Worker 1431*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1432*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1433*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1434*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1435*8d67ca89SAndroid Build Coastguard Worker#endif 1436*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1437*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1438*8d67ca89SAndroid Build Coastguard Worker 1439*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1440*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_11) 1441*8d67ca89SAndroid Build Coastguard Worker 1442*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1443*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1444*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1445*8d67ca89SAndroid Build Coastguard Worker 1446*8d67ca89SAndroid Build Coastguard Worker palignr $11, %xmm3, %xmm2 1447*8d67ca89SAndroid Build Coastguard Worker 1448*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1449*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1450*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1451*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1452*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1453*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1454*8d67ca89SAndroid Build Coastguard Worker 1455*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1456*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1457*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1458*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1459*8d67ca89SAndroid Build Coastguard Worker#endif 1460*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1461*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1462*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_11) 1463*8d67ca89SAndroid Build Coastguard Worker 1464*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1465*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_11): 1466*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1467*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1468*8d67ca89SAndroid Build Coastguard Worker test $0xf800, %esi 1469*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_11_exittail) 1470*8d67ca89SAndroid Build Coastguard Worker 1471*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1472*8d67ca89SAndroid Build Coastguard Worker cmpl $5, %ebp 1473*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_11_exittail) 1474*8d67ca89SAndroid Build Coastguard Worker#endif 1475*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1476*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1477*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_11) 1478*8d67ca89SAndroid Build Coastguard Worker 1479*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1480*8d67ca89SAndroid Build Coastguard WorkerL(ashr_11_exittail): 1481*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1482*8d67ca89SAndroid Build Coastguard Worker psrldq $11, %xmm0 1483*8d67ca89SAndroid Build Coastguard Worker psrldq $11, %xmm3 1484*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1485*8d67ca89SAndroid Build Coastguard Worker 1486*8d67ca89SAndroid Build Coastguard Worker/* 1487*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_12 1488*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1489*8d67ca89SAndroid Build Coastguard Worker * n(4~15) n - 4 11(15 +(n-4) - n) ashr_12 1490*8d67ca89SAndroid Build Coastguard Worker */ 1491*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1492*8d67ca89SAndroid Build Coastguard WorkerL(ashr_12): 1493*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1494*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1495*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1496*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1497*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1498*8d67ca89SAndroid Build Coastguard Worker pslldq $4, %xmm2 1499*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1500*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1501*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1502*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1503*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1504*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1505*8d67ca89SAndroid Build Coastguard Worker lea -4(%ecx), %edi 1506*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1507*8d67ca89SAndroid Build Coastguard Worker 1508*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1509*8d67ca89SAndroid Build Coastguard Worker 1510*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1511*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1512*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1513*8d67ca89SAndroid Build Coastguard Worker or $12, %ebx 1514*8d67ca89SAndroid Build Coastguard Worker lea 12(%edx), %edi 1515*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1516*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1517*8d67ca89SAndroid Build Coastguard Worker 1518*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1519*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_12): 1520*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1521*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_12) 1522*8d67ca89SAndroid Build Coastguard Worker 1523*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_12): 1524*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1525*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1526*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1527*8d67ca89SAndroid Build Coastguard Worker 1528*8d67ca89SAndroid Build Coastguard Worker palignr $12, %xmm3, %xmm2 1529*8d67ca89SAndroid Build Coastguard Worker 1530*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1531*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1532*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1533*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1534*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1535*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1536*8d67ca89SAndroid Build Coastguard Worker 1537*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1538*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1539*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1540*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1541*8d67ca89SAndroid Build Coastguard Worker#endif 1542*8d67ca89SAndroid Build Coastguard Worker 1543*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1544*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1545*8d67ca89SAndroid Build Coastguard Worker 1546*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1547*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_12) 1548*8d67ca89SAndroid Build Coastguard Worker 1549*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1550*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1551*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1552*8d67ca89SAndroid Build Coastguard Worker 1553*8d67ca89SAndroid Build Coastguard Worker palignr $12, %xmm3, %xmm2 1554*8d67ca89SAndroid Build Coastguard Worker 1555*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1556*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1557*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1558*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1559*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1560*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1561*8d67ca89SAndroid Build Coastguard Worker 1562*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1563*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1564*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1565*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1566*8d67ca89SAndroid Build Coastguard Worker#endif 1567*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1568*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1569*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_12) 1570*8d67ca89SAndroid Build Coastguard Worker 1571*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1572*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_12): 1573*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1574*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1575*8d67ca89SAndroid Build Coastguard Worker test $0xf000, %esi 1576*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_12_exittail) 1577*8d67ca89SAndroid Build Coastguard Worker 1578*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1579*8d67ca89SAndroid Build Coastguard Worker cmpl $4, %ebp 1580*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_12_exittail) 1581*8d67ca89SAndroid Build Coastguard Worker#endif 1582*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1583*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1584*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_12) 1585*8d67ca89SAndroid Build Coastguard Worker 1586*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1587*8d67ca89SAndroid Build Coastguard WorkerL(ashr_12_exittail): 1588*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1589*8d67ca89SAndroid Build Coastguard Worker psrldq $12, %xmm0 1590*8d67ca89SAndroid Build Coastguard Worker psrldq $12, %xmm3 1591*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1592*8d67ca89SAndroid Build Coastguard Worker 1593*8d67ca89SAndroid Build Coastguard Worker/* 1594*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_13 1595*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1596*8d67ca89SAndroid Build Coastguard Worker * n(3~15) n - 3 12(15 +(n-3) - n) ashr_13 1597*8d67ca89SAndroid Build Coastguard Worker */ 1598*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1599*8d67ca89SAndroid Build Coastguard WorkerL(ashr_13): 1600*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1601*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1602*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1603*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1604*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1605*8d67ca89SAndroid Build Coastguard Worker pslldq $3, %xmm2 1606*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1607*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1608*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1609*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1610*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1611*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1612*8d67ca89SAndroid Build Coastguard Worker lea -3(%ecx), %edi 1613*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1614*8d67ca89SAndroid Build Coastguard Worker 1615*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1616*8d67ca89SAndroid Build Coastguard Worker 1617*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1618*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1619*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1620*8d67ca89SAndroid Build Coastguard Worker or $13, %ebx 1621*8d67ca89SAndroid Build Coastguard Worker lea 13(%edx), %edi 1622*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1623*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1624*8d67ca89SAndroid Build Coastguard Worker 1625*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1626*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_13): 1627*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1628*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_13) 1629*8d67ca89SAndroid Build Coastguard Worker 1630*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_13): 1631*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1632*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1633*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1634*8d67ca89SAndroid Build Coastguard Worker 1635*8d67ca89SAndroid Build Coastguard Worker palignr $13, %xmm3, %xmm2 1636*8d67ca89SAndroid Build Coastguard Worker 1637*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1638*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1639*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1640*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1641*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1642*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1643*8d67ca89SAndroid Build Coastguard Worker 1644*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1645*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1646*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1647*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1648*8d67ca89SAndroid Build Coastguard Worker#endif 1649*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1650*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1651*8d67ca89SAndroid Build Coastguard Worker 1652*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1653*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_13) 1654*8d67ca89SAndroid Build Coastguard Worker 1655*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1656*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1657*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1658*8d67ca89SAndroid Build Coastguard Worker 1659*8d67ca89SAndroid Build Coastguard Worker palignr $13, %xmm3, %xmm2 1660*8d67ca89SAndroid Build Coastguard Worker 1661*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1662*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1663*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1664*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1665*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1666*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1667*8d67ca89SAndroid Build Coastguard Worker 1668*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1669*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1670*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1671*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1672*8d67ca89SAndroid Build Coastguard Worker#endif 1673*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1674*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1675*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_13) 1676*8d67ca89SAndroid Build Coastguard Worker 1677*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1678*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_13): 1679*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1680*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1681*8d67ca89SAndroid Build Coastguard Worker test $0xe000, %esi 1682*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_13_exittail) 1683*8d67ca89SAndroid Build Coastguard Worker 1684*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1685*8d67ca89SAndroid Build Coastguard Worker cmpl $3, %ebp 1686*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_13_exittail) 1687*8d67ca89SAndroid Build Coastguard Worker#endif 1688*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1689*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1690*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_13) 1691*8d67ca89SAndroid Build Coastguard Worker 1692*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1693*8d67ca89SAndroid Build Coastguard WorkerL(ashr_13_exittail): 1694*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1695*8d67ca89SAndroid Build Coastguard Worker psrldq $13, %xmm0 1696*8d67ca89SAndroid Build Coastguard Worker psrldq $13, %xmm3 1697*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1698*8d67ca89SAndroid Build Coastguard Worker 1699*8d67ca89SAndroid Build Coastguard Worker/* 1700*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_14 1701*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1702*8d67ca89SAndroid Build Coastguard Worker * n(2~15) n - 2 13(15 +(n-2) - n) ashr_14 1703*8d67ca89SAndroid Build Coastguard Worker */ 1704*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1705*8d67ca89SAndroid Build Coastguard WorkerL(ashr_14): 1706*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1707*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1708*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1709*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1710*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1711*8d67ca89SAndroid Build Coastguard Worker pslldq $2, %xmm2 1712*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1713*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1714*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1715*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1716*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1717*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1718*8d67ca89SAndroid Build Coastguard Worker lea -2(%ecx), %edi 1719*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1720*8d67ca89SAndroid Build Coastguard Worker 1721*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1722*8d67ca89SAndroid Build Coastguard Worker 1723*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1724*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1725*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1726*8d67ca89SAndroid Build Coastguard Worker or $14, %ebx 1727*8d67ca89SAndroid Build Coastguard Worker lea 14(%edx), %edi 1728*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1729*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1730*8d67ca89SAndroid Build Coastguard Worker 1731*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1732*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_14): 1733*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1734*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_14) 1735*8d67ca89SAndroid Build Coastguard Worker 1736*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_14): 1737*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1738*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1739*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1740*8d67ca89SAndroid Build Coastguard Worker 1741*8d67ca89SAndroid Build Coastguard Worker palignr $14, %xmm3, %xmm2 1742*8d67ca89SAndroid Build Coastguard Worker 1743*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1744*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1745*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1746*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1747*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1748*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1749*8d67ca89SAndroid Build Coastguard Worker 1750*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1751*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1752*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1753*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1754*8d67ca89SAndroid Build Coastguard Worker#endif 1755*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1756*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1757*8d67ca89SAndroid Build Coastguard Worker 1758*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1759*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_14) 1760*8d67ca89SAndroid Build Coastguard Worker 1761*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1762*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1763*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1764*8d67ca89SAndroid Build Coastguard Worker 1765*8d67ca89SAndroid Build Coastguard Worker palignr $14, %xmm3, %xmm2 1766*8d67ca89SAndroid Build Coastguard Worker 1767*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1768*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1769*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1770*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1771*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1772*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1773*8d67ca89SAndroid Build Coastguard Worker 1774*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1775*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1776*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1777*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1778*8d67ca89SAndroid Build Coastguard Worker#endif 1779*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1780*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1781*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_14) 1782*8d67ca89SAndroid Build Coastguard Worker 1783*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1784*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_14): 1785*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1786*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1787*8d67ca89SAndroid Build Coastguard Worker test $0xc000, %esi 1788*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_14_exittail) 1789*8d67ca89SAndroid Build Coastguard Worker 1790*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1791*8d67ca89SAndroid Build Coastguard Worker cmpl $2, %ebp 1792*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_14_exittail) 1793*8d67ca89SAndroid Build Coastguard Worker#endif 1794*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1795*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1796*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_14) 1797*8d67ca89SAndroid Build Coastguard Worker 1798*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1799*8d67ca89SAndroid Build Coastguard WorkerL(ashr_14_exittail): 1800*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1801*8d67ca89SAndroid Build Coastguard Worker psrldq $14, %xmm0 1802*8d67ca89SAndroid Build Coastguard Worker psrldq $14, %xmm3 1803*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1804*8d67ca89SAndroid Build Coastguard Worker 1805*8d67ca89SAndroid Build Coastguard Worker/* 1806*8d67ca89SAndroid Build Coastguard Worker * The following cases will be handled by ashr_14 1807*8d67ca89SAndroid Build Coastguard Worker * ecx(offset of esi) eax(offset of edi) relative offset corresponding case 1808*8d67ca89SAndroid Build Coastguard Worker * n(1~15) n - 1 14(15 +(n-1) - n) ashr_15 1809*8d67ca89SAndroid Build Coastguard Worker */ 1810*8d67ca89SAndroid Build Coastguard Worker 1811*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1812*8d67ca89SAndroid Build Coastguard WorkerL(ashr_15): 1813*8d67ca89SAndroid Build Coastguard Worker mov $0xffff, %esi 1814*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1815*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm2 1816*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax), %xmm1 1817*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1818*8d67ca89SAndroid Build Coastguard Worker pslldq $1, %xmm2 1819*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 1820*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm2 1821*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %edi 1822*8d67ca89SAndroid Build Coastguard Worker shr %cl, %esi 1823*8d67ca89SAndroid Build Coastguard Worker shr %cl, %edi 1824*8d67ca89SAndroid Build Coastguard Worker sub %edi, %esi 1825*8d67ca89SAndroid Build Coastguard Worker lea -1(%ecx), %edi 1826*8d67ca89SAndroid Build Coastguard Worker jnz L(less32bytes) 1827*8d67ca89SAndroid Build Coastguard Worker 1828*8d67ca89SAndroid Build Coastguard Worker UPDATE_STRNCMP_COUNTER 1829*8d67ca89SAndroid Build Coastguard Worker 1830*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx), %xmm3 1831*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1832*8d67ca89SAndroid Build Coastguard Worker mov $16, %ecx 1833*8d67ca89SAndroid Build Coastguard Worker or $15, %ebx 1834*8d67ca89SAndroid Build Coastguard Worker lea 15(%edx), %edi 1835*8d67ca89SAndroid Build Coastguard Worker and $0xfff, %edi 1836*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1837*8d67ca89SAndroid Build Coastguard Worker 1838*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1839*8d67ca89SAndroid Build Coastguard WorkerL(loop_ashr_15): 1840*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1841*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_15) 1842*8d67ca89SAndroid Build Coastguard Worker 1843*8d67ca89SAndroid Build Coastguard WorkerL(gobble_ashr_15): 1844*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1845*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1846*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1847*8d67ca89SAndroid Build Coastguard Worker 1848*8d67ca89SAndroid Build Coastguard Worker palignr $15, %xmm3, %xmm2 1849*8d67ca89SAndroid Build Coastguard Worker 1850*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1851*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1852*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1853*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1854*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1855*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1856*8d67ca89SAndroid Build Coastguard Worker 1857*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1858*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1859*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1860*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1861*8d67ca89SAndroid Build Coastguard Worker#endif 1862*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1863*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1864*8d67ca89SAndroid Build Coastguard Worker 1865*8d67ca89SAndroid Build Coastguard Worker add $16, %edi 1866*8d67ca89SAndroid Build Coastguard Worker jg L(nibble_ashr_15) 1867*8d67ca89SAndroid Build Coastguard Worker 1868*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1869*8d67ca89SAndroid Build Coastguard Worker movdqa (%edx, %ecx), %xmm2 1870*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm2, %xmm4 1871*8d67ca89SAndroid Build Coastguard Worker 1872*8d67ca89SAndroid Build Coastguard Worker palignr $15, %xmm3, %xmm2 1873*8d67ca89SAndroid Build Coastguard Worker 1874*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 1875*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm2, %xmm1 1876*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1877*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1878*8d67ca89SAndroid Build Coastguard Worker sub $0xffff, %esi 1879*8d67ca89SAndroid Build Coastguard Worker jnz L(exit) 1880*8d67ca89SAndroid Build Coastguard Worker 1881*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1882*8d67ca89SAndroid Build Coastguard Worker cmpl $16, %ebp 1883*8d67ca89SAndroid Build Coastguard Worker lea -16(%ebp), %ebp 1884*8d67ca89SAndroid Build Coastguard Worker jbe L(more8byteseq) 1885*8d67ca89SAndroid Build Coastguard Worker#endif 1886*8d67ca89SAndroid Build Coastguard Worker add $16, %ecx 1887*8d67ca89SAndroid Build Coastguard Worker movdqa %xmm4, %xmm3 1888*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_ashr_15) 1889*8d67ca89SAndroid Build Coastguard Worker 1890*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1891*8d67ca89SAndroid Build Coastguard WorkerL(nibble_ashr_15): 1892*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm0 1893*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %esi 1894*8d67ca89SAndroid Build Coastguard Worker test $0x8000, %esi 1895*8d67ca89SAndroid Build Coastguard Worker jnz L(ashr_15_exittail) 1896*8d67ca89SAndroid Build Coastguard Worker 1897*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1898*8d67ca89SAndroid Build Coastguard Worker cmpl $1, %ebp 1899*8d67ca89SAndroid Build Coastguard Worker jbe L(ashr_15_exittail) 1900*8d67ca89SAndroid Build Coastguard Worker#endif 1901*8d67ca89SAndroid Build Coastguard Worker pxor %xmm0, %xmm0 1902*8d67ca89SAndroid Build Coastguard Worker sub $0x1000, %edi 1903*8d67ca89SAndroid Build Coastguard Worker jmp L(gobble_ashr_15) 1904*8d67ca89SAndroid Build Coastguard Worker 1905*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1906*8d67ca89SAndroid Build Coastguard WorkerL(ashr_15_exittail): 1907*8d67ca89SAndroid Build Coastguard Worker movdqa (%eax, %ecx), %xmm1 1908*8d67ca89SAndroid Build Coastguard Worker psrldq $15, %xmm0 1909*8d67ca89SAndroid Build Coastguard Worker psrldq $15, %xmm3 1910*8d67ca89SAndroid Build Coastguard Worker jmp L(aftertail) 1911*8d67ca89SAndroid Build Coastguard Worker 1912*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1913*8d67ca89SAndroid Build Coastguard WorkerL(aftertail): 1914*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm3, %xmm1 1915*8d67ca89SAndroid Build Coastguard Worker psubb %xmm0, %xmm1 1916*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %esi 1917*8d67ca89SAndroid Build Coastguard Worker not %esi 1918*8d67ca89SAndroid Build Coastguard WorkerL(exit): 1919*8d67ca89SAndroid Build Coastguard Worker mov %ebx, %edi 1920*8d67ca89SAndroid Build Coastguard Worker and $0x1f, %edi 1921*8d67ca89SAndroid Build Coastguard Worker lea -16(%edi, %ecx), %edi 1922*8d67ca89SAndroid Build Coastguard WorkerL(less32bytes): 1923*8d67ca89SAndroid Build Coastguard Worker add %edi, %edx 1924*8d67ca89SAndroid Build Coastguard Worker add %ecx, %eax 1925*8d67ca89SAndroid Build Coastguard Worker test $0x20, %ebx 1926*8d67ca89SAndroid Build Coastguard Worker jz L(ret2) 1927*8d67ca89SAndroid Build Coastguard Worker xchg %eax, %edx 1928*8d67ca89SAndroid Build Coastguard Worker 1929*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1930*8d67ca89SAndroid Build Coastguard WorkerL(ret2): 1931*8d67ca89SAndroid Build Coastguard Worker mov %esi, %ecx 1932*8d67ca89SAndroid Build Coastguard Worker POP (%esi) 1933*8d67ca89SAndroid Build Coastguard Worker POP (%edi) 1934*8d67ca89SAndroid Build Coastguard Worker POP (%ebx) 1935*8d67ca89SAndroid Build Coastguard WorkerL(less16bytes): 1936*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 1937*8d67ca89SAndroid Build Coastguard Worker jz L(2next_8_bytes) 1938*8d67ca89SAndroid Build Coastguard Worker 1939*8d67ca89SAndroid Build Coastguard Worker test $0x01, %cl 1940*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte0) 1941*8d67ca89SAndroid Build Coastguard Worker 1942*8d67ca89SAndroid Build Coastguard Worker test $0x02, %cl 1943*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte1) 1944*8d67ca89SAndroid Build Coastguard Worker 1945*8d67ca89SAndroid Build Coastguard Worker test $0x04, %cl 1946*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte2) 1947*8d67ca89SAndroid Build Coastguard Worker 1948*8d67ca89SAndroid Build Coastguard Worker test $0x08, %cl 1949*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte3) 1950*8d67ca89SAndroid Build Coastguard Worker 1951*8d67ca89SAndroid Build Coastguard Worker test $0x10, %cl 1952*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte4) 1953*8d67ca89SAndroid Build Coastguard Worker 1954*8d67ca89SAndroid Build Coastguard Worker test $0x20, %cl 1955*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte5) 1956*8d67ca89SAndroid Build Coastguard Worker 1957*8d67ca89SAndroid Build Coastguard Worker test $0x40, %cl 1958*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte6) 1959*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1960*8d67ca89SAndroid Build Coastguard Worker cmpl $7, %ebp 1961*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 1962*8d67ca89SAndroid Build Coastguard Worker#endif 1963*8d67ca89SAndroid Build Coastguard Worker 1964*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%eax), %ecx 1965*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%edx), %eax 1966*8d67ca89SAndroid Build Coastguard Worker 1967*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 1968*8d67ca89SAndroid Build Coastguard Worker RETURN 1969*8d67ca89SAndroid Build Coastguard Worker 1970*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1971*8d67ca89SAndroid Build Coastguard WorkerL(Byte0): 1972*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1973*8d67ca89SAndroid Build Coastguard Worker cmpl $0, %ebp 1974*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 1975*8d67ca89SAndroid Build Coastguard Worker#endif 1976*8d67ca89SAndroid Build Coastguard Worker movzbl (%eax), %ecx 1977*8d67ca89SAndroid Build Coastguard Worker movzbl (%edx), %eax 1978*8d67ca89SAndroid Build Coastguard Worker 1979*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 1980*8d67ca89SAndroid Build Coastguard Worker RETURN 1981*8d67ca89SAndroid Build Coastguard Worker 1982*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1983*8d67ca89SAndroid Build Coastguard WorkerL(Byte1): 1984*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1985*8d67ca89SAndroid Build Coastguard Worker cmpl $1, %ebp 1986*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 1987*8d67ca89SAndroid Build Coastguard Worker#endif 1988*8d67ca89SAndroid Build Coastguard Worker movzbl 1(%eax), %ecx 1989*8d67ca89SAndroid Build Coastguard Worker movzbl 1(%edx), %eax 1990*8d67ca89SAndroid Build Coastguard Worker 1991*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 1992*8d67ca89SAndroid Build Coastguard Worker RETURN 1993*8d67ca89SAndroid Build Coastguard Worker 1994*8d67ca89SAndroid Build Coastguard Worker .p2align 4 1995*8d67ca89SAndroid Build Coastguard WorkerL(Byte2): 1996*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 1997*8d67ca89SAndroid Build Coastguard Worker cmpl $2, %ebp 1998*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 1999*8d67ca89SAndroid Build Coastguard Worker#endif 2000*8d67ca89SAndroid Build Coastguard Worker movzbl 2(%eax), %ecx 2001*8d67ca89SAndroid Build Coastguard Worker movzbl 2(%edx), %eax 2002*8d67ca89SAndroid Build Coastguard Worker 2003*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2004*8d67ca89SAndroid Build Coastguard Worker RETURN 2005*8d67ca89SAndroid Build Coastguard Worker 2006*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2007*8d67ca89SAndroid Build Coastguard WorkerL(Byte3): 2008*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2009*8d67ca89SAndroid Build Coastguard Worker cmpl $3, %ebp 2010*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2011*8d67ca89SAndroid Build Coastguard Worker#endif 2012*8d67ca89SAndroid Build Coastguard Worker movzbl 3(%eax), %ecx 2013*8d67ca89SAndroid Build Coastguard Worker movzbl 3(%edx), %eax 2014*8d67ca89SAndroid Build Coastguard Worker 2015*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2016*8d67ca89SAndroid Build Coastguard Worker RETURN 2017*8d67ca89SAndroid Build Coastguard Worker 2018*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2019*8d67ca89SAndroid Build Coastguard WorkerL(Byte4): 2020*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2021*8d67ca89SAndroid Build Coastguard Worker cmpl $4, %ebp 2022*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2023*8d67ca89SAndroid Build Coastguard Worker#endif 2024*8d67ca89SAndroid Build Coastguard Worker movzbl 4(%eax), %ecx 2025*8d67ca89SAndroid Build Coastguard Worker movzbl 4(%edx), %eax 2026*8d67ca89SAndroid Build Coastguard Worker 2027*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2028*8d67ca89SAndroid Build Coastguard Worker RETURN 2029*8d67ca89SAndroid Build Coastguard Worker 2030*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2031*8d67ca89SAndroid Build Coastguard WorkerL(Byte5): 2032*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2033*8d67ca89SAndroid Build Coastguard Worker cmpl $5, %ebp 2034*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2035*8d67ca89SAndroid Build Coastguard Worker#endif 2036*8d67ca89SAndroid Build Coastguard Worker movzbl 5(%eax), %ecx 2037*8d67ca89SAndroid Build Coastguard Worker movzbl 5(%edx), %eax 2038*8d67ca89SAndroid Build Coastguard Worker 2039*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2040*8d67ca89SAndroid Build Coastguard Worker RETURN 2041*8d67ca89SAndroid Build Coastguard Worker 2042*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2043*8d67ca89SAndroid Build Coastguard WorkerL(Byte6): 2044*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2045*8d67ca89SAndroid Build Coastguard Worker cmpl $6, %ebp 2046*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2047*8d67ca89SAndroid Build Coastguard Worker#endif 2048*8d67ca89SAndroid Build Coastguard Worker movzbl 6(%eax), %ecx 2049*8d67ca89SAndroid Build Coastguard Worker movzbl 6(%edx), %eax 2050*8d67ca89SAndroid Build Coastguard Worker 2051*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2052*8d67ca89SAndroid Build Coastguard Worker RETURN 2053*8d67ca89SAndroid Build Coastguard Worker 2054*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2055*8d67ca89SAndroid Build Coastguard WorkerL(2next_8_bytes): 2056*8d67ca89SAndroid Build Coastguard Worker add $8, %eax 2057*8d67ca89SAndroid Build Coastguard Worker add $8, %edx 2058*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2059*8d67ca89SAndroid Build Coastguard Worker cmpl $8, %ebp 2060*8d67ca89SAndroid Build Coastguard Worker lea -8(%ebp), %ebp 2061*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2062*8d67ca89SAndroid Build Coastguard Worker#endif 2063*8d67ca89SAndroid Build Coastguard Worker 2064*8d67ca89SAndroid Build Coastguard Worker test $0x01, %ch 2065*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte0) 2066*8d67ca89SAndroid Build Coastguard Worker 2067*8d67ca89SAndroid Build Coastguard Worker test $0x02, %ch 2068*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte1) 2069*8d67ca89SAndroid Build Coastguard Worker 2070*8d67ca89SAndroid Build Coastguard Worker test $0x04, %ch 2071*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte2) 2072*8d67ca89SAndroid Build Coastguard Worker 2073*8d67ca89SAndroid Build Coastguard Worker test $0x08, %ch 2074*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte3) 2075*8d67ca89SAndroid Build Coastguard Worker 2076*8d67ca89SAndroid Build Coastguard Worker test $0x10, %ch 2077*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte4) 2078*8d67ca89SAndroid Build Coastguard Worker 2079*8d67ca89SAndroid Build Coastguard Worker test $0x20, %ch 2080*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte5) 2081*8d67ca89SAndroid Build Coastguard Worker 2082*8d67ca89SAndroid Build Coastguard Worker test $0x40, %ch 2083*8d67ca89SAndroid Build Coastguard Worker jnz L(Byte6) 2084*8d67ca89SAndroid Build Coastguard Worker 2085*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2086*8d67ca89SAndroid Build Coastguard Worker cmpl $7, %ebp 2087*8d67ca89SAndroid Build Coastguard Worker jbe L(eq) 2088*8d67ca89SAndroid Build Coastguard Worker#endif 2089*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%eax), %ecx 2090*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%edx), %eax 2091*8d67ca89SAndroid Build Coastguard Worker 2092*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %eax 2093*8d67ca89SAndroid Build Coastguard Worker RETURN 2094*8d67ca89SAndroid Build Coastguard Worker 2095*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2096*8d67ca89SAndroid Build Coastguard WorkerL(neq): 2097*8d67ca89SAndroid Build Coastguard Worker mov $1, %eax 2098*8d67ca89SAndroid Build Coastguard Worker ja L(neq_bigger) 2099*8d67ca89SAndroid Build Coastguard Worker neg %eax 2100*8d67ca89SAndroid Build Coastguard WorkerL(neq_bigger): 2101*8d67ca89SAndroid Build Coastguard Worker RETURN 2102*8d67ca89SAndroid Build Coastguard Worker 2103*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2104*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2105*8d67ca89SAndroid Build Coastguard WorkerL(more8byteseq): 2106*8d67ca89SAndroid Build Coastguard Worker POP (%esi) 2107*8d67ca89SAndroid Build Coastguard Worker POP (%edi) 2108*8d67ca89SAndroid Build Coastguard Worker POP (%ebx) 2109*8d67ca89SAndroid Build Coastguard Worker#endif 2110*8d67ca89SAndroid Build Coastguard Worker 2111*8d67ca89SAndroid Build Coastguard WorkerL(eq): 2112*8d67ca89SAndroid Build Coastguard Worker 2113*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2114*8d67ca89SAndroid Build Coastguard Worker POP (%ebp) 2115*8d67ca89SAndroid Build Coastguard Worker#endif 2116*8d67ca89SAndroid Build Coastguard Worker xorl %eax, %eax 2117*8d67ca89SAndroid Build Coastguard Worker ret 2118*8d67ca89SAndroid Build Coastguard Worker 2119*8d67ca89SAndroid Build Coastguard Worker#ifdef USE_AS_STRNCMP 2120*8d67ca89SAndroid Build Coastguard Worker cfi_restore_state 2121*8d67ca89SAndroid Build Coastguard Worker 2122*8d67ca89SAndroid Build Coastguard Worker .p2align 4 2123*8d67ca89SAndroid Build Coastguard WorkerL(less16bytes_sncmp): 2124*8d67ca89SAndroid Build Coastguard Worker test %ebp, %ebp 2125*8d67ca89SAndroid Build Coastguard Worker jz L(eq) 2126*8d67ca89SAndroid Build Coastguard Worker 2127*8d67ca89SAndroid Build Coastguard Worker movzbl (%eax), %ecx 2128*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, (%edx) 2129*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2130*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2131*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2132*8d67ca89SAndroid Build Coastguard Worker 2133*8d67ca89SAndroid Build Coastguard Worker cmpl $1, %ebp 2134*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2135*8d67ca89SAndroid Build Coastguard Worker 2136*8d67ca89SAndroid Build Coastguard Worker movzbl 1(%eax), %ecx 2137*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 1(%edx) 2138*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2139*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2140*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2141*8d67ca89SAndroid Build Coastguard Worker 2142*8d67ca89SAndroid Build Coastguard Worker cmpl $2, %ebp 2143*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2144*8d67ca89SAndroid Build Coastguard Worker 2145*8d67ca89SAndroid Build Coastguard Worker movzbl 2(%eax), %ecx 2146*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 2(%edx) 2147*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2148*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2149*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2150*8d67ca89SAndroid Build Coastguard Worker 2151*8d67ca89SAndroid Build Coastguard Worker cmpl $3, %ebp 2152*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2153*8d67ca89SAndroid Build Coastguard Worker 2154*8d67ca89SAndroid Build Coastguard Worker movzbl 3(%eax), %ecx 2155*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 3(%edx) 2156*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2157*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2158*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2159*8d67ca89SAndroid Build Coastguard Worker 2160*8d67ca89SAndroid Build Coastguard Worker cmpl $4, %ebp 2161*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2162*8d67ca89SAndroid Build Coastguard Worker 2163*8d67ca89SAndroid Build Coastguard Worker movzbl 4(%eax), %ecx 2164*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 4(%edx) 2165*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2166*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2167*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2168*8d67ca89SAndroid Build Coastguard Worker 2169*8d67ca89SAndroid Build Coastguard Worker cmpl $5, %ebp 2170*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2171*8d67ca89SAndroid Build Coastguard Worker 2172*8d67ca89SAndroid Build Coastguard Worker movzbl 5(%eax), %ecx 2173*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 5(%edx) 2174*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2175*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2176*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2177*8d67ca89SAndroid Build Coastguard Worker 2178*8d67ca89SAndroid Build Coastguard Worker cmpl $6, %ebp 2179*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2180*8d67ca89SAndroid Build Coastguard Worker 2181*8d67ca89SAndroid Build Coastguard Worker movzbl 6(%eax), %ecx 2182*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 6(%edx) 2183*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2184*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2185*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2186*8d67ca89SAndroid Build Coastguard Worker 2187*8d67ca89SAndroid Build Coastguard Worker cmpl $7, %ebp 2188*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2189*8d67ca89SAndroid Build Coastguard Worker 2190*8d67ca89SAndroid Build Coastguard Worker movzbl 7(%eax), %ecx 2191*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 7(%edx) 2192*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2193*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2194*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2195*8d67ca89SAndroid Build Coastguard Worker 2196*8d67ca89SAndroid Build Coastguard Worker 2197*8d67ca89SAndroid Build Coastguard Worker cmpl $8, %ebp 2198*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2199*8d67ca89SAndroid Build Coastguard Worker 2200*8d67ca89SAndroid Build Coastguard Worker movzbl 8(%eax), %ecx 2201*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 8(%edx) 2202*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2203*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2204*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2205*8d67ca89SAndroid Build Coastguard Worker 2206*8d67ca89SAndroid Build Coastguard Worker cmpl $9, %ebp 2207*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2208*8d67ca89SAndroid Build Coastguard Worker 2209*8d67ca89SAndroid Build Coastguard Worker movzbl 9(%eax), %ecx 2210*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 9(%edx) 2211*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2212*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2213*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2214*8d67ca89SAndroid Build Coastguard Worker 2215*8d67ca89SAndroid Build Coastguard Worker cmpl $10, %ebp 2216*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2217*8d67ca89SAndroid Build Coastguard Worker 2218*8d67ca89SAndroid Build Coastguard Worker movzbl 10(%eax), %ecx 2219*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 10(%edx) 2220*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2221*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2222*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2223*8d67ca89SAndroid Build Coastguard Worker 2224*8d67ca89SAndroid Build Coastguard Worker cmpl $11, %ebp 2225*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2226*8d67ca89SAndroid Build Coastguard Worker 2227*8d67ca89SAndroid Build Coastguard Worker movzbl 11(%eax), %ecx 2228*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 11(%edx) 2229*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2230*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2231*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2232*8d67ca89SAndroid Build Coastguard Worker 2233*8d67ca89SAndroid Build Coastguard Worker 2234*8d67ca89SAndroid Build Coastguard Worker cmpl $12, %ebp 2235*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2236*8d67ca89SAndroid Build Coastguard Worker 2237*8d67ca89SAndroid Build Coastguard Worker movzbl 12(%eax), %ecx 2238*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 12(%edx) 2239*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2240*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2241*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2242*8d67ca89SAndroid Build Coastguard Worker 2243*8d67ca89SAndroid Build Coastguard Worker cmpl $13, %ebp 2244*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2245*8d67ca89SAndroid Build Coastguard Worker 2246*8d67ca89SAndroid Build Coastguard Worker movzbl 13(%eax), %ecx 2247*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 13(%edx) 2248*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2249*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2250*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2251*8d67ca89SAndroid Build Coastguard Worker 2252*8d67ca89SAndroid Build Coastguard Worker cmpl $14, %ebp 2253*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2254*8d67ca89SAndroid Build Coastguard Worker 2255*8d67ca89SAndroid Build Coastguard Worker movzbl 14(%eax), %ecx 2256*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 14(%edx) 2257*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2258*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2259*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2260*8d67ca89SAndroid Build Coastguard Worker 2261*8d67ca89SAndroid Build Coastguard Worker cmpl $15, %ebp 2262*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2263*8d67ca89SAndroid Build Coastguard Worker 2264*8d67ca89SAndroid Build Coastguard Worker movzbl 15(%eax), %ecx 2265*8d67ca89SAndroid Build Coastguard Worker cmpb %cl, 15(%edx) 2266*8d67ca89SAndroid Build Coastguard Worker jne L(neq) 2267*8d67ca89SAndroid Build Coastguard Worker test %cl, %cl 2268*8d67ca89SAndroid Build Coastguard Worker je L(eq) 2269*8d67ca89SAndroid Build Coastguard Worker 2270*8d67ca89SAndroid Build Coastguard Worker POP (%ebp) 2271*8d67ca89SAndroid Build Coastguard Worker xor %eax, %eax 2272*8d67ca89SAndroid Build Coastguard Worker ret 2273*8d67ca89SAndroid Build Coastguard Worker#endif 2274*8d67ca89SAndroid Build Coastguard Worker 2275*8d67ca89SAndroid Build Coastguard WorkerEND (STRCMP) 2276