1*8d67ca89SAndroid Build Coastguard Worker/* 2*8d67ca89SAndroid Build Coastguard WorkerCopyright (c) 2011, 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 ENTRY 56*8d67ca89SAndroid Build Coastguard Worker# define ENTRY(name) \ 57*8d67ca89SAndroid Build Coastguard Worker .type name, @function; \ 58*8d67ca89SAndroid Build Coastguard Worker .globl name; \ 59*8d67ca89SAndroid Build Coastguard Worker .p2align 4; \ 60*8d67ca89SAndroid Build Coastguard Workername: \ 61*8d67ca89SAndroid Build Coastguard Worker cfi_startproc 62*8d67ca89SAndroid Build Coastguard Worker#endif 63*8d67ca89SAndroid Build Coastguard Worker 64*8d67ca89SAndroid Build Coastguard Worker#ifndef END 65*8d67ca89SAndroid Build Coastguard Worker# define END(name) \ 66*8d67ca89SAndroid Build Coastguard Worker cfi_endproc; \ 67*8d67ca89SAndroid Build Coastguard Worker .size name, .-name 68*8d67ca89SAndroid Build Coastguard Worker#endif 69*8d67ca89SAndroid Build Coastguard Worker 70*8d67ca89SAndroid Build Coastguard Worker#define CFI_PUSH(REG) \ 71*8d67ca89SAndroid Build Coastguard Worker cfi_adjust_cfa_offset (4); \ 72*8d67ca89SAndroid Build Coastguard Worker cfi_rel_offset (REG, 0) 73*8d67ca89SAndroid Build Coastguard Worker 74*8d67ca89SAndroid Build Coastguard Worker#define CFI_POP(REG) \ 75*8d67ca89SAndroid Build Coastguard Worker cfi_adjust_cfa_offset (-4); \ 76*8d67ca89SAndroid Build Coastguard Worker cfi_restore (REG) 77*8d67ca89SAndroid Build Coastguard Worker 78*8d67ca89SAndroid Build Coastguard Worker#define PUSH(REG) pushl REG; CFI_PUSH (REG) 79*8d67ca89SAndroid Build Coastguard Worker#define POP(REG) popl REG; CFI_POP (REG) 80*8d67ca89SAndroid Build Coastguard Worker 81*8d67ca89SAndroid Build Coastguard Worker#define ENTRANCE PUSH (%edi); 82*8d67ca89SAndroid Build Coastguard Worker#define PARMS 8 83*8d67ca89SAndroid Build Coastguard Worker#define RETURN POP (%edi); ret; CFI_PUSH (%edi); 84*8d67ca89SAndroid Build Coastguard Worker 85*8d67ca89SAndroid Build Coastguard Worker#define STR1 PARMS 86*8d67ca89SAndroid Build Coastguard Worker#define STR2 STR1+4 87*8d67ca89SAndroid Build Coastguard Worker#define LEN STR2+4 88*8d67ca89SAndroid Build Coastguard Worker 89*8d67ca89SAndroid Build Coastguard Worker .text 90*8d67ca89SAndroid Build Coastguard WorkerENTRY (memchr) 91*8d67ca89SAndroid Build Coastguard Worker ENTRANCE 92*8d67ca89SAndroid Build Coastguard Worker mov STR1(%esp), %ecx 93*8d67ca89SAndroid Build Coastguard Worker movd STR2(%esp), %xmm1 94*8d67ca89SAndroid Build Coastguard Worker mov LEN(%esp), %edx 95*8d67ca89SAndroid Build Coastguard Worker test %edx, %edx 96*8d67ca89SAndroid Build Coastguard Worker jz L(return_null) 97*8d67ca89SAndroid Build Coastguard Worker 98*8d67ca89SAndroid Build Coastguard Worker punpcklbw %xmm1, %xmm1 99*8d67ca89SAndroid Build Coastguard Worker mov %ecx, %edi 100*8d67ca89SAndroid Build Coastguard Worker punpcklbw %xmm1, %xmm1 101*8d67ca89SAndroid Build Coastguard Worker 102*8d67ca89SAndroid Build Coastguard Worker and $63, %ecx 103*8d67ca89SAndroid Build Coastguard Worker pshufd $0, %xmm1, %xmm1 104*8d67ca89SAndroid Build Coastguard Worker cmp $48, %ecx 105*8d67ca89SAndroid Build Coastguard Worker ja L(crosscache) 106*8d67ca89SAndroid Build Coastguard Worker 107*8d67ca89SAndroid Build Coastguard Worker movdqu (%edi), %xmm0 108*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 109*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 110*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 111*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2_prolog) 112*8d67ca89SAndroid Build Coastguard Worker 113*8d67ca89SAndroid Build Coastguard Worker sub $16, %edx 114*8d67ca89SAndroid Build Coastguard Worker jbe L(return_null) 115*8d67ca89SAndroid Build Coastguard Worker lea 16(%edi), %edi 116*8d67ca89SAndroid Build Coastguard Worker and $15, %ecx 117*8d67ca89SAndroid Build Coastguard Worker and $-16, %edi 118*8d67ca89SAndroid Build Coastguard Worker add %ecx, %edx 119*8d67ca89SAndroid Build Coastguard Worker sub $64, %edx 120*8d67ca89SAndroid Build Coastguard Worker jbe L(exit_loop) 121*8d67ca89SAndroid Build Coastguard Worker jmp L(loop_prolog) 122*8d67ca89SAndroid Build Coastguard Worker 123*8d67ca89SAndroid Build Coastguard Worker .p2align 4 124*8d67ca89SAndroid Build Coastguard WorkerL(crosscache): 125*8d67ca89SAndroid Build Coastguard Worker and $15, %ecx 126*8d67ca89SAndroid Build Coastguard Worker and $-16, %edi 127*8d67ca89SAndroid Build Coastguard Worker movdqa (%edi), %xmm0 128*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 129*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 130*8d67ca89SAndroid Build Coastguard Worker sar %cl, %eax 131*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 132*8d67ca89SAndroid Build Coastguard Worker 133*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2_prolog1) 134*8d67ca89SAndroid Build Coastguard Worker lea -16(%edx), %edx 135*8d67ca89SAndroid Build Coastguard Worker add %ecx, %edx 136*8d67ca89SAndroid Build Coastguard Worker jle L(return_null) 137*8d67ca89SAndroid Build Coastguard Worker lea 16(%edi), %edi 138*8d67ca89SAndroid Build Coastguard Worker sub $64, %edx 139*8d67ca89SAndroid Build Coastguard Worker jbe L(exit_loop) 140*8d67ca89SAndroid Build Coastguard Worker 141*8d67ca89SAndroid Build Coastguard Worker .p2align 4 142*8d67ca89SAndroid Build Coastguard WorkerL(loop_prolog): 143*8d67ca89SAndroid Build Coastguard Worker movdqa (%edi), %xmm0 144*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 145*8d67ca89SAndroid Build Coastguard Worker xor %ecx, %ecx 146*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 147*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 148*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 149*8d67ca89SAndroid Build Coastguard Worker 150*8d67ca89SAndroid Build Coastguard Worker movdqa 16(%edi), %xmm2 151*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 152*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 153*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %eax 154*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 155*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 156*8d67ca89SAndroid Build Coastguard Worker 157*8d67ca89SAndroid Build Coastguard Worker movdqa 32(%edi), %xmm3 158*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm3 159*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 160*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %eax 161*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 162*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 163*8d67ca89SAndroid Build Coastguard Worker 164*8d67ca89SAndroid Build Coastguard Worker movdqa 48(%edi), %xmm4 165*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm4 166*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 167*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm4, %eax 168*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 169*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 170*8d67ca89SAndroid Build Coastguard Worker 171*8d67ca89SAndroid Build Coastguard Worker lea 64(%edi), %edi 172*8d67ca89SAndroid Build Coastguard Worker sub $64, %edx 173*8d67ca89SAndroid Build Coastguard Worker jbe L(exit_loop) 174*8d67ca89SAndroid Build Coastguard Worker 175*8d67ca89SAndroid Build Coastguard Worker movdqa (%edi), %xmm0 176*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 177*8d67ca89SAndroid Build Coastguard Worker xor %ecx, %ecx 178*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 179*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 180*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 181*8d67ca89SAndroid Build Coastguard Worker 182*8d67ca89SAndroid Build Coastguard Worker movdqa 16(%edi), %xmm2 183*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 184*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 185*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %eax 186*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 187*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 188*8d67ca89SAndroid Build Coastguard Worker 189*8d67ca89SAndroid Build Coastguard Worker movdqa 32(%edi), %xmm3 190*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm3 191*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 192*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %eax 193*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 194*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 195*8d67ca89SAndroid Build Coastguard Worker 196*8d67ca89SAndroid Build Coastguard Worker movdqa 48(%edi), %xmm4 197*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm4 198*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 199*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm4, %eax 200*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 201*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 202*8d67ca89SAndroid Build Coastguard Worker 203*8d67ca89SAndroid Build Coastguard Worker lea 64(%edi), %edi 204*8d67ca89SAndroid Build Coastguard Worker mov %edi, %ecx 205*8d67ca89SAndroid Build Coastguard Worker and $-64, %edi 206*8d67ca89SAndroid Build Coastguard Worker and $63, %ecx 207*8d67ca89SAndroid Build Coastguard Worker add %ecx, %edx 208*8d67ca89SAndroid Build Coastguard Worker 209*8d67ca89SAndroid Build Coastguard Worker .p2align 4 210*8d67ca89SAndroid Build Coastguard WorkerL(align64_loop): 211*8d67ca89SAndroid Build Coastguard Worker sub $64, %edx 212*8d67ca89SAndroid Build Coastguard Worker jbe L(exit_loop) 213*8d67ca89SAndroid Build Coastguard Worker movdqa (%edi), %xmm0 214*8d67ca89SAndroid Build Coastguard Worker movdqa 16(%edi), %xmm2 215*8d67ca89SAndroid Build Coastguard Worker movdqa 32(%edi), %xmm3 216*8d67ca89SAndroid Build Coastguard Worker movdqa 48(%edi), %xmm4 217*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 218*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 219*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm3 220*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm4 221*8d67ca89SAndroid Build Coastguard Worker 222*8d67ca89SAndroid Build Coastguard Worker pmaxub %xmm0, %xmm3 223*8d67ca89SAndroid Build Coastguard Worker pmaxub %xmm2, %xmm4 224*8d67ca89SAndroid Build Coastguard Worker pmaxub %xmm3, %xmm4 225*8d67ca89SAndroid Build Coastguard Worker add $64, %edi 226*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm4, %eax 227*8d67ca89SAndroid Build Coastguard Worker 228*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 229*8d67ca89SAndroid Build Coastguard Worker jz L(align64_loop) 230*8d67ca89SAndroid Build Coastguard Worker 231*8d67ca89SAndroid Build Coastguard Worker sub $64, %edi 232*8d67ca89SAndroid Build Coastguard Worker 233*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 234*8d67ca89SAndroid Build Coastguard Worker xor %ecx, %ecx 235*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 236*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 237*8d67ca89SAndroid Build Coastguard Worker 238*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %eax 239*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 240*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 241*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 242*8d67ca89SAndroid Build Coastguard Worker 243*8d67ca89SAndroid Build Coastguard Worker movdqa 32(%edi), %xmm3 244*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm3 245*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %eax 246*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 247*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 248*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case1) 249*8d67ca89SAndroid Build Coastguard Worker 250*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%edi), %xmm1 251*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %eax 252*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 253*8d67ca89SAndroid Build Coastguard Worker 254*8d67ca89SAndroid Build Coastguard Worker .p2align 4 255*8d67ca89SAndroid Build Coastguard WorkerL(match_case1): 256*8d67ca89SAndroid Build Coastguard Worker add %ecx, %edi 257*8d67ca89SAndroid Build Coastguard Worker test %al, %al 258*8d67ca89SAndroid Build Coastguard Worker jz L(match_case1_high) 259*8d67ca89SAndroid Build Coastguard Worker mov %al, %cl 260*8d67ca89SAndroid Build Coastguard Worker and $15, %cl 261*8d67ca89SAndroid Build Coastguard Worker jz L(match_case1_8) 262*8d67ca89SAndroid Build Coastguard Worker test $0x01, %al 263*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_1) 264*8d67ca89SAndroid Build Coastguard Worker test $0x02, %al 265*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_2) 266*8d67ca89SAndroid Build Coastguard Worker test $0x04, %al 267*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_3) 268*8d67ca89SAndroid Build Coastguard Worker lea 3(%edi), %eax 269*8d67ca89SAndroid Build Coastguard Worker RETURN 270*8d67ca89SAndroid Build Coastguard Worker 271*8d67ca89SAndroid Build Coastguard Worker .p2align 4 272*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_8): 273*8d67ca89SAndroid Build Coastguard Worker test $0x10, %al 274*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_5) 275*8d67ca89SAndroid Build Coastguard Worker test $0x20, %al 276*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_6) 277*8d67ca89SAndroid Build Coastguard Worker test $0x40, %al 278*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_7) 279*8d67ca89SAndroid Build Coastguard Worker lea 7(%edi), %eax 280*8d67ca89SAndroid Build Coastguard Worker RETURN 281*8d67ca89SAndroid Build Coastguard Worker 282*8d67ca89SAndroid Build Coastguard Worker .p2align 4 283*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_high): 284*8d67ca89SAndroid Build Coastguard Worker mov %ah, %ch 285*8d67ca89SAndroid Build Coastguard Worker and $15, %ch 286*8d67ca89SAndroid Build Coastguard Worker jz L(match_case1_high_8) 287*8d67ca89SAndroid Build Coastguard Worker test $0x01, %ah 288*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_9) 289*8d67ca89SAndroid Build Coastguard Worker test $0x02, %ah 290*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_10) 291*8d67ca89SAndroid Build Coastguard Worker test $0x04, %ah 292*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_11) 293*8d67ca89SAndroid Build Coastguard Worker lea 11(%edi), %eax 294*8d67ca89SAndroid Build Coastguard Worker RETURN 295*8d67ca89SAndroid Build Coastguard Worker 296*8d67ca89SAndroid Build Coastguard Worker .p2align 4 297*8d67ca89SAndroid Build Coastguard WorkerL(match_case1_high_8): 298*8d67ca89SAndroid Build Coastguard Worker test $0x10, %ah 299*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_13) 300*8d67ca89SAndroid Build Coastguard Worker test $0x20, %ah 301*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_14) 302*8d67ca89SAndroid Build Coastguard Worker test $0x40, %ah 303*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case1_15) 304*8d67ca89SAndroid Build Coastguard Worker lea 15(%edi), %eax 305*8d67ca89SAndroid Build Coastguard Worker RETURN 306*8d67ca89SAndroid Build Coastguard Worker 307*8d67ca89SAndroid Build Coastguard Worker .p2align 4 308*8d67ca89SAndroid Build Coastguard WorkerL(exit_loop): 309*8d67ca89SAndroid Build Coastguard Worker add $64, %edx 310*8d67ca89SAndroid Build Coastguard Worker 311*8d67ca89SAndroid Build Coastguard Worker movdqa (%edi), %xmm0 312*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm0 313*8d67ca89SAndroid Build Coastguard Worker xor %ecx, %ecx 314*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm0, %eax 315*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 316*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2) 317*8d67ca89SAndroid Build Coastguard Worker cmp $16, %edx 318*8d67ca89SAndroid Build Coastguard Worker jbe L(return_null) 319*8d67ca89SAndroid Build Coastguard Worker 320*8d67ca89SAndroid Build Coastguard Worker movdqa 16(%edi), %xmm2 321*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm2 322*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 323*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm2, %eax 324*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 325*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2) 326*8d67ca89SAndroid Build Coastguard Worker cmp $32, %edx 327*8d67ca89SAndroid Build Coastguard Worker jbe L(return_null) 328*8d67ca89SAndroid Build Coastguard Worker 329*8d67ca89SAndroid Build Coastguard Worker movdqa 32(%edi), %xmm3 330*8d67ca89SAndroid Build Coastguard Worker pcmpeqb %xmm1, %xmm3 331*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 332*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm3, %eax 333*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 334*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2) 335*8d67ca89SAndroid Build Coastguard Worker cmp $48, %edx 336*8d67ca89SAndroid Build Coastguard Worker jbe L(return_null) 337*8d67ca89SAndroid Build Coastguard Worker 338*8d67ca89SAndroid Build Coastguard Worker pcmpeqb 48(%edi), %xmm1 339*8d67ca89SAndroid Build Coastguard Worker lea 16(%ecx), %ecx 340*8d67ca89SAndroid Build Coastguard Worker pmovmskb %xmm1, %eax 341*8d67ca89SAndroid Build Coastguard Worker test %eax, %eax 342*8d67ca89SAndroid Build Coastguard Worker jnz L(match_case2) 343*8d67ca89SAndroid Build Coastguard Worker 344*8d67ca89SAndroid Build Coastguard Worker xor %eax, %eax 345*8d67ca89SAndroid Build Coastguard Worker RETURN 346*8d67ca89SAndroid Build Coastguard Worker 347*8d67ca89SAndroid Build Coastguard Worker .p2align 4 348*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_1): 349*8d67ca89SAndroid Build Coastguard Worker mov %edi, %eax 350*8d67ca89SAndroid Build Coastguard Worker RETURN 351*8d67ca89SAndroid Build Coastguard Worker 352*8d67ca89SAndroid Build Coastguard Worker .p2align 4 353*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_2): 354*8d67ca89SAndroid Build Coastguard Worker lea 1(%edi), %eax 355*8d67ca89SAndroid Build Coastguard Worker RETURN 356*8d67ca89SAndroid Build Coastguard Worker 357*8d67ca89SAndroid Build Coastguard Worker .p2align 4 358*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_3): 359*8d67ca89SAndroid Build Coastguard Worker lea 2(%edi), %eax 360*8d67ca89SAndroid Build Coastguard Worker RETURN 361*8d67ca89SAndroid Build Coastguard Worker 362*8d67ca89SAndroid Build Coastguard Worker .p2align 4 363*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_5): 364*8d67ca89SAndroid Build Coastguard Worker lea 4(%edi), %eax 365*8d67ca89SAndroid Build Coastguard Worker RETURN 366*8d67ca89SAndroid Build Coastguard Worker 367*8d67ca89SAndroid Build Coastguard Worker .p2align 4 368*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_6): 369*8d67ca89SAndroid Build Coastguard Worker lea 5(%edi), %eax 370*8d67ca89SAndroid Build Coastguard Worker RETURN 371*8d67ca89SAndroid Build Coastguard Worker 372*8d67ca89SAndroid Build Coastguard Worker .p2align 4 373*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_7): 374*8d67ca89SAndroid Build Coastguard Worker lea 6(%edi), %eax 375*8d67ca89SAndroid Build Coastguard Worker RETURN 376*8d67ca89SAndroid Build Coastguard Worker 377*8d67ca89SAndroid Build Coastguard Worker .p2align 4 378*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_9): 379*8d67ca89SAndroid Build Coastguard Worker lea 8(%edi), %eax 380*8d67ca89SAndroid Build Coastguard Worker RETURN 381*8d67ca89SAndroid Build Coastguard Worker 382*8d67ca89SAndroid Build Coastguard Worker .p2align 4 383*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_10): 384*8d67ca89SAndroid Build Coastguard Worker lea 9(%edi), %eax 385*8d67ca89SAndroid Build Coastguard Worker RETURN 386*8d67ca89SAndroid Build Coastguard Worker 387*8d67ca89SAndroid Build Coastguard Worker .p2align 4 388*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_11): 389*8d67ca89SAndroid Build Coastguard Worker lea 10(%edi), %eax 390*8d67ca89SAndroid Build Coastguard Worker RETURN 391*8d67ca89SAndroid Build Coastguard Worker 392*8d67ca89SAndroid Build Coastguard Worker .p2align 4 393*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_13): 394*8d67ca89SAndroid Build Coastguard Worker lea 12(%edi), %eax 395*8d67ca89SAndroid Build Coastguard Worker RETURN 396*8d67ca89SAndroid Build Coastguard Worker 397*8d67ca89SAndroid Build Coastguard Worker .p2align 4 398*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_14): 399*8d67ca89SAndroid Build Coastguard Worker lea 13(%edi), %eax 400*8d67ca89SAndroid Build Coastguard Worker RETURN 401*8d67ca89SAndroid Build Coastguard Worker 402*8d67ca89SAndroid Build Coastguard Worker .p2align 4 403*8d67ca89SAndroid Build Coastguard WorkerL(exit_case1_15): 404*8d67ca89SAndroid Build Coastguard Worker lea 14(%edi), %eax 405*8d67ca89SAndroid Build Coastguard Worker RETURN 406*8d67ca89SAndroid Build Coastguard Worker 407*8d67ca89SAndroid Build Coastguard Worker .p2align 4 408*8d67ca89SAndroid Build Coastguard WorkerL(match_case2): 409*8d67ca89SAndroid Build Coastguard Worker sub %ecx, %edx 410*8d67ca89SAndroid Build Coastguard WorkerL(match_case2_prolog1): 411*8d67ca89SAndroid Build Coastguard Worker add %ecx, %edi 412*8d67ca89SAndroid Build Coastguard WorkerL(match_case2_prolog): 413*8d67ca89SAndroid Build Coastguard Worker test %al, %al 414*8d67ca89SAndroid Build Coastguard Worker jz L(match_case2_high) 415*8d67ca89SAndroid Build Coastguard Worker mov %al, %cl 416*8d67ca89SAndroid Build Coastguard Worker and $15, %cl 417*8d67ca89SAndroid Build Coastguard Worker jz L(match_case2_8) 418*8d67ca89SAndroid Build Coastguard Worker test $0x01, %al 419*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_1) 420*8d67ca89SAndroid Build Coastguard Worker test $0x02, %al 421*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_2) 422*8d67ca89SAndroid Build Coastguard Worker test $0x04, %al 423*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_3) 424*8d67ca89SAndroid Build Coastguard Worker sub $4, %edx 425*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 426*8d67ca89SAndroid Build Coastguard Worker lea 3(%edi), %eax 427*8d67ca89SAndroid Build Coastguard Worker RETURN 428*8d67ca89SAndroid Build Coastguard Worker 429*8d67ca89SAndroid Build Coastguard Worker .p2align 4 430*8d67ca89SAndroid Build Coastguard WorkerL(match_case2_8): 431*8d67ca89SAndroid Build Coastguard Worker test $0x10, %al 432*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_5) 433*8d67ca89SAndroid Build Coastguard Worker test $0x20, %al 434*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_6) 435*8d67ca89SAndroid Build Coastguard Worker test $0x40, %al 436*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_7) 437*8d67ca89SAndroid Build Coastguard Worker sub $8, %edx 438*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 439*8d67ca89SAndroid Build Coastguard Worker lea 7(%edi), %eax 440*8d67ca89SAndroid Build Coastguard Worker RETURN 441*8d67ca89SAndroid Build Coastguard Worker 442*8d67ca89SAndroid Build Coastguard Worker .p2align 4 443*8d67ca89SAndroid Build Coastguard WorkerL(match_case2_high): 444*8d67ca89SAndroid Build Coastguard Worker mov %ah, %ch 445*8d67ca89SAndroid Build Coastguard Worker and $15, %ch 446*8d67ca89SAndroid Build Coastguard Worker jz L(match_case2_high_8) 447*8d67ca89SAndroid Build Coastguard Worker test $0x01, %ah 448*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_9) 449*8d67ca89SAndroid Build Coastguard Worker test $0x02, %ah 450*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_10) 451*8d67ca89SAndroid Build Coastguard Worker test $0x04, %ah 452*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_11) 453*8d67ca89SAndroid Build Coastguard Worker sub $12, %edx 454*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 455*8d67ca89SAndroid Build Coastguard Worker lea 11(%edi), %eax 456*8d67ca89SAndroid Build Coastguard Worker RETURN 457*8d67ca89SAndroid Build Coastguard Worker 458*8d67ca89SAndroid Build Coastguard Worker .p2align 4 459*8d67ca89SAndroid Build Coastguard WorkerL(match_case2_high_8): 460*8d67ca89SAndroid Build Coastguard Worker test $0x10, %ah 461*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_13) 462*8d67ca89SAndroid Build Coastguard Worker test $0x20, %ah 463*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_14) 464*8d67ca89SAndroid Build Coastguard Worker test $0x40, %ah 465*8d67ca89SAndroid Build Coastguard Worker jnz L(exit_case2_15) 466*8d67ca89SAndroid Build Coastguard Worker sub $16, %edx 467*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 468*8d67ca89SAndroid Build Coastguard Worker lea 15(%edi), %eax 469*8d67ca89SAndroid Build Coastguard Worker RETURN 470*8d67ca89SAndroid Build Coastguard Worker 471*8d67ca89SAndroid Build Coastguard Worker .p2align 4 472*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_1): 473*8d67ca89SAndroid Build Coastguard Worker mov %edi, %eax 474*8d67ca89SAndroid Build Coastguard Worker RETURN 475*8d67ca89SAndroid Build Coastguard Worker 476*8d67ca89SAndroid Build Coastguard Worker .p2align 4 477*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_2): 478*8d67ca89SAndroid Build Coastguard Worker sub $2, %edx 479*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 480*8d67ca89SAndroid Build Coastguard Worker lea 1(%edi), %eax 481*8d67ca89SAndroid Build Coastguard Worker RETURN 482*8d67ca89SAndroid Build Coastguard Worker 483*8d67ca89SAndroid Build Coastguard Worker .p2align 4 484*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_3): 485*8d67ca89SAndroid Build Coastguard Worker sub $3, %edx 486*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 487*8d67ca89SAndroid Build Coastguard Worker lea 2(%edi), %eax 488*8d67ca89SAndroid Build Coastguard Worker RETURN 489*8d67ca89SAndroid Build Coastguard Worker 490*8d67ca89SAndroid Build Coastguard Worker .p2align 4 491*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_5): 492*8d67ca89SAndroid Build Coastguard Worker sub $5, %edx 493*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 494*8d67ca89SAndroid Build Coastguard Worker lea 4(%edi), %eax 495*8d67ca89SAndroid Build Coastguard Worker RETURN 496*8d67ca89SAndroid Build Coastguard Worker 497*8d67ca89SAndroid Build Coastguard Worker .p2align 4 498*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_6): 499*8d67ca89SAndroid Build Coastguard Worker sub $6, %edx 500*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 501*8d67ca89SAndroid Build Coastguard Worker lea 5(%edi), %eax 502*8d67ca89SAndroid Build Coastguard Worker RETURN 503*8d67ca89SAndroid Build Coastguard Worker 504*8d67ca89SAndroid Build Coastguard Worker .p2align 4 505*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_7): 506*8d67ca89SAndroid Build Coastguard Worker sub $7, %edx 507*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 508*8d67ca89SAndroid Build Coastguard Worker lea 6(%edi), %eax 509*8d67ca89SAndroid Build Coastguard Worker RETURN 510*8d67ca89SAndroid Build Coastguard Worker 511*8d67ca89SAndroid Build Coastguard Worker .p2align 4 512*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_9): 513*8d67ca89SAndroid Build Coastguard Worker sub $9, %edx 514*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 515*8d67ca89SAndroid Build Coastguard Worker lea 8(%edi), %eax 516*8d67ca89SAndroid Build Coastguard Worker RETURN 517*8d67ca89SAndroid Build Coastguard Worker 518*8d67ca89SAndroid Build Coastguard Worker .p2align 4 519*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_10): 520*8d67ca89SAndroid Build Coastguard Worker sub $10, %edx 521*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 522*8d67ca89SAndroid Build Coastguard Worker lea 9(%edi), %eax 523*8d67ca89SAndroid Build Coastguard Worker RETURN 524*8d67ca89SAndroid Build Coastguard Worker 525*8d67ca89SAndroid Build Coastguard Worker .p2align 4 526*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_11): 527*8d67ca89SAndroid Build Coastguard Worker sub $11, %edx 528*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 529*8d67ca89SAndroid Build Coastguard Worker lea 10(%edi), %eax 530*8d67ca89SAndroid Build Coastguard Worker RETURN 531*8d67ca89SAndroid Build Coastguard Worker 532*8d67ca89SAndroid Build Coastguard Worker .p2align 4 533*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_13): 534*8d67ca89SAndroid Build Coastguard Worker sub $13, %edx 535*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 536*8d67ca89SAndroid Build Coastguard Worker lea 12(%edi), %eax 537*8d67ca89SAndroid Build Coastguard Worker RETURN 538*8d67ca89SAndroid Build Coastguard Worker 539*8d67ca89SAndroid Build Coastguard Worker .p2align 4 540*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_14): 541*8d67ca89SAndroid Build Coastguard Worker sub $14, %edx 542*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 543*8d67ca89SAndroid Build Coastguard Worker lea 13(%edi), %eax 544*8d67ca89SAndroid Build Coastguard Worker RETURN 545*8d67ca89SAndroid Build Coastguard Worker 546*8d67ca89SAndroid Build Coastguard Worker .p2align 4 547*8d67ca89SAndroid Build Coastguard WorkerL(exit_case2_15): 548*8d67ca89SAndroid Build Coastguard Worker sub $15, %edx 549*8d67ca89SAndroid Build Coastguard Worker jb L(return_null) 550*8d67ca89SAndroid Build Coastguard Worker lea 14(%edi), %eax 551*8d67ca89SAndroid Build Coastguard Worker RETURN 552*8d67ca89SAndroid Build Coastguard Worker .p2align 4 553*8d67ca89SAndroid Build Coastguard WorkerL(return_null): 554*8d67ca89SAndroid Build Coastguard Worker xor %eax, %eax 555*8d67ca89SAndroid Build Coastguard Worker RETURN 556*8d67ca89SAndroid Build Coastguard WorkerEND (memchr) 557