12fe8fb19SBen Gras/* 22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>. 32fe8fb19SBen Gras * Public domain. 42fe8fb19SBen Gras */ 5cbd276e4SArun Thomas 69a21d1a2SArun Thomas#include <machine/asm.h> 79a21d1a2SArun Thomas 82fe8fb19SBen Gras#if defined(LIBC_SCCS) 9*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: strncmp.S,v 1.15 2014/05/23 02:34:19 uebayasi Exp $") 102fe8fb19SBen Gras#endif 112fe8fb19SBen Gras 122fe8fb19SBen Gras/* 132fe8fb19SBen Gras * NOTE: I've unrolled the loop eight times: large enough to make a 142fe8fb19SBen Gras * significant difference, and small enough not to totally trash the 152fe8fb19SBen Gras * cache. 162fe8fb19SBen Gras */ 172fe8fb19SBen Gras 189a21d1a2SArun ThomasENTRY(strncmp) 192fe8fb19SBen Gras pushl %ebx 202fe8fb19SBen Gras movl 8(%esp),%eax 212fe8fb19SBen Gras movl 12(%esp),%ecx 222fe8fb19SBen Gras movl 16(%esp),%edx 232fe8fb19SBen Gras testl %edx,%edx 242fe8fb19SBen Gras jmp L2 /* Jump into the loop! */ 252fe8fb19SBen Gras 262fe8fb19SBen Gras _ALIGN_TEXT,0x90 272fe8fb19SBen GrasL1: incl %eax 282fe8fb19SBen Gras incl %ecx 292fe8fb19SBen Gras decl %edx 302fe8fb19SBen GrasL2: jz L4 /* strings are equal */ 312fe8fb19SBen Gras movb (%eax),%bl 322fe8fb19SBen Gras testb %bl,%bl 332fe8fb19SBen Gras jz L3 342fe8fb19SBen Gras cmpb %bl,(%ecx) 352fe8fb19SBen Gras jne L3 362fe8fb19SBen Gras 372fe8fb19SBen Gras incl %eax 382fe8fb19SBen Gras incl %ecx 392fe8fb19SBen Gras decl %edx 402fe8fb19SBen Gras jz L4 412fe8fb19SBen Gras movb (%eax),%bl 422fe8fb19SBen Gras testb %bl,%bl 432fe8fb19SBen Gras jz L3 442fe8fb19SBen Gras cmpb %bl,(%ecx) 452fe8fb19SBen Gras jne L3 462fe8fb19SBen Gras 472fe8fb19SBen Gras incl %eax 482fe8fb19SBen Gras incl %ecx 492fe8fb19SBen Gras decl %edx 502fe8fb19SBen Gras jz L4 512fe8fb19SBen Gras movb (%eax),%bl 522fe8fb19SBen Gras testb %bl,%bl 532fe8fb19SBen Gras jz L3 542fe8fb19SBen Gras cmpb %bl,(%ecx) 552fe8fb19SBen Gras jne L3 562fe8fb19SBen Gras 572fe8fb19SBen Gras incl %eax 582fe8fb19SBen Gras incl %ecx 592fe8fb19SBen Gras decl %edx 602fe8fb19SBen Gras jz L4 612fe8fb19SBen Gras movb (%eax),%bl 622fe8fb19SBen Gras testb %bl,%bl 632fe8fb19SBen Gras jz L3 642fe8fb19SBen Gras cmpb %bl,(%ecx) 652fe8fb19SBen Gras jne L3 662fe8fb19SBen Gras 672fe8fb19SBen Gras incl %eax 682fe8fb19SBen Gras incl %ecx 692fe8fb19SBen Gras decl %edx 702fe8fb19SBen Gras jz L4 712fe8fb19SBen Gras movb (%eax),%bl 722fe8fb19SBen Gras testb %bl,%bl 732fe8fb19SBen Gras jz L3 742fe8fb19SBen Gras cmpb %bl,(%ecx) 752fe8fb19SBen Gras jne L3 762fe8fb19SBen Gras 772fe8fb19SBen Gras incl %eax 782fe8fb19SBen Gras incl %ecx 792fe8fb19SBen Gras decl %edx 802fe8fb19SBen Gras jz L4 812fe8fb19SBen Gras movb (%eax),%bl 822fe8fb19SBen Gras testb %bl,%bl 832fe8fb19SBen Gras jz L3 842fe8fb19SBen Gras cmpb %bl,(%ecx) 852fe8fb19SBen Gras jne L3 862fe8fb19SBen Gras 872fe8fb19SBen Gras incl %eax 882fe8fb19SBen Gras incl %ecx 892fe8fb19SBen Gras decl %edx 902fe8fb19SBen Gras jz L4 912fe8fb19SBen Gras movb (%eax),%bl 922fe8fb19SBen Gras testb %bl,%bl 932fe8fb19SBen Gras jz L3 942fe8fb19SBen Gras cmpb %bl,(%ecx) 952fe8fb19SBen Gras jne L3 962fe8fb19SBen Gras 972fe8fb19SBen Gras incl %eax 982fe8fb19SBen Gras incl %ecx 992fe8fb19SBen Gras decl %edx 1002fe8fb19SBen Gras jz L4 1012fe8fb19SBen Gras movb (%eax),%bl 1022fe8fb19SBen Gras testb %bl,%bl 1032fe8fb19SBen Gras jz L3 1042fe8fb19SBen Gras cmpb %bl,(%ecx) 1052fe8fb19SBen Gras je L1 1062fe8fb19SBen Gras 1072fe8fb19SBen Gras _ALIGN_TEXT,0x90 1082fe8fb19SBen GrasL3: movzbl (%eax),%eax /* unsigned comparison */ 1092fe8fb19SBen Gras movzbl (%ecx),%ecx 1102fe8fb19SBen Gras subl %ecx,%eax 1112fe8fb19SBen Gras popl %ebx 1122fe8fb19SBen Gras ret 1132fe8fb19SBen Gras _ALIGN_TEXT,0x90 1142fe8fb19SBen GrasL4: xorl %eax,%eax 1152fe8fb19SBen Gras popl %ebx 1162fe8fb19SBen Gras ret 117*0a6a1f1dSLionel SambucEND(strncmp) 118