10a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* 20a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaCopyright (c) 2011, Intel Corporation 30a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaAll rights reserved. 40a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 50a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaRedistribution and use in source and binary forms, with or without 60a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievamodification, are permitted provided that the following conditions are met: 70a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 80a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * Redistributions of source code must retain the above copyright notice, 90a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * this list of conditions and the following disclaimer. 100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * Redistributions in binary form must reproduce the above copyright notice, 120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * this list of conditions and the following disclaimer in the documentation 130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * and/or other materials provided with the distribution. 140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * Neither the name of Intel Corporation nor the names of its contributors 160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * may be used to endorse or promote products derived from this software 170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva * without specific prior written permission. 180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 190a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 200a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 210a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 220a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 230a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 250a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 260a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 280a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva*/ 300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef L 320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define L(label) .L##label 330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_startproc 360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_startproc .cfi_startproc 370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_endproc 400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_endproc .cfi_endproc 410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_rel_offset 440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off 450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_restore 480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_restore(reg) .cfi_restore reg 490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef cfi_adjust_cfa_offset 520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off 530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef ENTRY 560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define ENTRY(name) \ 570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .type name, @function; \ 580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .globl name; \ 590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4; \ 600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrievaname: \ 610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_startproc 620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#ifndef END 650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva# define END(name) \ 660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_endproc; \ 670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .size name, .-name 680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#endif 690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_PUSH(REG) \ 710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_adjust_cfa_offset (4); \ 720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_rel_offset (REG, 0) 730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define CFI_POP(REG) \ 750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_adjust_cfa_offset (-4); \ 760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva cfi_restore (REG) 770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PUSH(REG) pushl REG; CFI_PUSH (REG) 790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define POP(REG) popl REG; CFI_POP (REG) 800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define PARMS 8 820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define ENTRANCE PUSH(%edi) 830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define RETURN POP (%edi); ret; CFI_PUSH (%edi); 840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR1 PARMS 870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva#define STR2 STR1+4 880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .text 900a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaENTRY (strchr) 910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva ENTRANCE 930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov STR1(%esp), %ecx 940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movd STR2(%esp), %xmm1 950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pxor %xmm2, %xmm2 970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov %ecx, %edi 980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva punpcklbw %xmm1, %xmm1 990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva punpcklbw %xmm1, %xmm1 1000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva /* ECX has OFFSET. */ 1010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $15, %ecx 1020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pshufd $0, %xmm1, %xmm1 1030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva je L(loop) 1040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Handle unaligned string. */ 1060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $-16, %edi 1070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movdqa (%edi), %xmm0 1080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm0, %xmm2 1090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm1, %xmm0 1100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva /* Find where NULL is. */ 1110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm2, %edx 1120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva /* Check if there is a match. */ 1130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm0, %eax 1140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva /* Remove the leading bytes. */ 1150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva sarl %cl, %edx 1160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva sarl %cl, %eax 1170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %eax, %eax 1180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jz L(unaligned_no_match) 1190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add %ecx, %edi 1200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jz L(match_case1) 1220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jmp L(match_case2) 1230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 1250a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(unaligned_no_match): 1260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jne L(return_null) 1280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pxor %xmm2, %xmm2 1300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add $16, %edi 1310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 1330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva/* Loop start on aligned string. */ 1340a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(loop): 1350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movdqa (%edi), %xmm0 1360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm0, %xmm2 1370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm1, %xmm0 1380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm2, %edx 1390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm0, %eax 1400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %eax, %eax 1410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(matches) 1420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 1440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add $16, %edi 1450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movdqa (%edi), %xmm0 1470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm0, %xmm2 1480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm1, %xmm0 1490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm2, %edx 1500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm0, %eax 1510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %eax, %eax 1520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(matches) 1530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 1550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add $16, %edi 1560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movdqa (%edi), %xmm0 1580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm0, %xmm2 1590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm1, %xmm0 1600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm2, %edx 1610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm0, %eax 1620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %eax, %eax 1630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(matches) 1640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 1660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add $16, %edi 1670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva movdqa (%edi), %xmm0 1690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm0, %xmm2 1700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pcmpeqb %xmm1, %xmm0 1710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm2, %edx 1720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva pmovmskb %xmm0, %eax 1730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %eax, %eax 1740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(matches) 1750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 1770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva add $16, %edi 1780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jmp L(loop) 1790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1800a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(matches): 1810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva /* There is a match. First find where NULL is. */ 1820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %edx, %edx 1830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jz L(match_case1) 1840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 1860a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_case2): 1870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %al, %al 1880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jz L(match_higth_case2) 1890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov %al, %cl 1910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $15, %cl 1920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(match_case2_4) 1930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov %dl, %ch 1950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $15, %ch 1960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 1970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 1980a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %al 1990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit5) 2000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %dl 2010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %al 2030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit6) 2040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %dl 2050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %al 2070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit7) 2080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %dl 2090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 7(%edi), %eax 2110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 2120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 2140a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_case2_4): 2150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %al 2160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit1) 2170a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %dl 2180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %al 2200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit2) 2210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %dl 2220a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %al 2240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit3) 2250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %dl 2260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2270a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 3(%edi), %eax 2280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 2290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 2310a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_higth_case2): 2320a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %dl, %dl 2330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov %ah, %cl 2360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $15, %cl 2370a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(match_case2_12) 2380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva mov %dh, %ch 2400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva and $15, %ch 2410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2420a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %ah 2440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit13) 2450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %dh 2460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2470a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %ah 2480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit14) 2490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %dh 2500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %ah 2520a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit15) 2530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %dh 2540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 15(%edi), %eax 2560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 2570a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 2590a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_case2_12): 2600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %ah 2610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit9) 2620a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %dh 2630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %ah 2650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit10) 2660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %dh 2670a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %ah 2690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit11) 2700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %dh 2710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(return_null) 2720a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 11(%edi), %eax 2730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 2740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 2760a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_case1): 2770a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test %al, %al 2780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jz L(match_higth_case1) 2790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %al 2810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit1) 2820a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %al 2830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit2) 2840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %al 2850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit3) 2860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x08, %al 2870a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit4) 2880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %al 2890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit5) 2900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %al 2910a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit6) 2920a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %al 2930a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit7) 2940a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 7(%edi), %eax 2950a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 2960a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 2970a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 2980a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(match_higth_case1): 2990a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x01, %ah 3000a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit9) 3010a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x02, %ah 3020a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit10) 3030a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x04, %ah 3040a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit11) 3050a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x08, %ah 3060a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit12) 3070a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x10, %ah 3080a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit13) 3090a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x20, %ah 3100a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit14) 3110a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva test $0x40, %ah 3120a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva jnz L(Exit15) 3130a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 15(%edi), %eax 3140a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3150a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3160a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3170a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit1): 3180a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea (%edi), %eax 3190a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3200a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3210a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3220a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit2): 3230a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 1(%edi), %eax 3240a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3250a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3260a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3270a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit3): 3280a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 2(%edi), %eax 3290a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3300a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3310a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3320a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit4): 3330a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 3(%edi), %eax 3340a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3350a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3360a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3370a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit5): 3380a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 4(%edi), %eax 3390a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3400a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3410a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3420a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit6): 3430a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 5(%edi), %eax 3440a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3450a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3460a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3470a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit7): 3480a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 6(%edi), %eax 3490a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3500a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3510a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3520a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit9): 3530a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 8(%edi), %eax 3540a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3550a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3560a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3570a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit10): 3580a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 9(%edi), %eax 3590a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3600a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3610a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3620a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit11): 3630a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 10(%edi), %eax 3640a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3650a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3660a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3670a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit12): 3680a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 11(%edi), %eax 3690a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3700a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3710a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3720a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit13): 3730a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 12(%edi), %eax 3740a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3750a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3760a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3770a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit14): 3780a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 13(%edi), %eax 3790a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3800a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3810a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3820a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(Exit15): 3830a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva lea 14(%edi), %eax 3840a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3850a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3860a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva .p2align 4 3870a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaL(return_null): 3880a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva xor %eax, %eax 3890a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva RETURN 3900a490665a3a287cd3aee1e7327f2381222c387c4Liubov Dmitrieva 3910a490665a3a287cd3aee1e7327f2381222c387c4Liubov DmitrievaEND (strchr) 392