12fe8fb19SBen Gras/* 22fe8fb19SBen Gras * Written by J.T. Conklin <jtc@NetBSD.org>. 32fe8fb19SBen Gras * Public domain. 42fe8fb19SBen Gras */ 52fe8fb19SBen Gras 62fe8fb19SBen Gras#include <machine/asm.h> 72fe8fb19SBen Gras 82fe8fb19SBen Gras#if defined(LIBC_SCCS) 9*0a6a1f1dSLionel Sambuc RCSID("$NetBSD: strncmp.S,v 1.4 2014/05/22 15:01:57 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 182fe8fb19SBen GrasENTRY(strncmp) 192fe8fb19SBen Gras testq %rdx,%rdx 202fe8fb19SBen Gras jmp L2 /* Jump into the loop! */ 212fe8fb19SBen Gras 222fe8fb19SBen GrasL1: incq %rdi 232fe8fb19SBen Gras incq %rsi 242fe8fb19SBen Gras decq %rdx 252fe8fb19SBen GrasL2: jz L4 /* strings are equal */ 262fe8fb19SBen Gras movb (%rdi),%al 272fe8fb19SBen Gras testb %al,%al 282fe8fb19SBen Gras jz L3 292fe8fb19SBen Gras cmpb %al,(%rsi) 302fe8fb19SBen Gras jne L3 312fe8fb19SBen Gras 322fe8fb19SBen Gras incq %rdi 332fe8fb19SBen Gras incq %rsi 342fe8fb19SBen Gras decq %rdx 352fe8fb19SBen Gras jz L4 362fe8fb19SBen Gras movb (%rdi),%al 372fe8fb19SBen Gras testb %al,%al 382fe8fb19SBen Gras jz L3 392fe8fb19SBen Gras cmpb %al,(%rsi) 402fe8fb19SBen Gras jne L3 412fe8fb19SBen Gras 422fe8fb19SBen Gras incq %rdi 432fe8fb19SBen Gras incq %rsi 442fe8fb19SBen Gras decq %rdx 452fe8fb19SBen Gras jz L4 462fe8fb19SBen Gras movb (%rdi),%al 472fe8fb19SBen Gras testb %al,%al 482fe8fb19SBen Gras jz L3 492fe8fb19SBen Gras cmpb %al,(%rsi) 502fe8fb19SBen Gras jne L3 512fe8fb19SBen Gras 522fe8fb19SBen Gras incq %rdi 532fe8fb19SBen Gras incq %rsi 542fe8fb19SBen Gras decq %rdx 552fe8fb19SBen Gras jz L4 562fe8fb19SBen Gras movb (%rdi),%al 572fe8fb19SBen Gras testb %al,%al 582fe8fb19SBen Gras jz L3 592fe8fb19SBen Gras cmpb %al,(%rsi) 602fe8fb19SBen Gras jne L3 612fe8fb19SBen Gras 622fe8fb19SBen Gras incq %rdi 632fe8fb19SBen Gras incq %rsi 642fe8fb19SBen Gras decq %rdx 652fe8fb19SBen Gras jz L4 662fe8fb19SBen Gras movb (%rdi),%al 672fe8fb19SBen Gras testb %al,%al 682fe8fb19SBen Gras jz L3 692fe8fb19SBen Gras cmpb %al,(%rsi) 702fe8fb19SBen Gras jne L3 712fe8fb19SBen Gras 722fe8fb19SBen Gras incq %rdi 732fe8fb19SBen Gras incq %rsi 742fe8fb19SBen Gras decq %rdx 752fe8fb19SBen Gras jz L4 762fe8fb19SBen Gras movb (%rdi),%al 772fe8fb19SBen Gras testb %al,%al 782fe8fb19SBen Gras jz L3 792fe8fb19SBen Gras cmpb %al,(%rsi) 802fe8fb19SBen Gras jne L3 812fe8fb19SBen Gras 822fe8fb19SBen Gras incq %rdi 832fe8fb19SBen Gras incq %rsi 842fe8fb19SBen Gras decq %rdx 852fe8fb19SBen Gras jz L4 862fe8fb19SBen Gras movb (%rdi),%al 872fe8fb19SBen Gras testb %al,%al 882fe8fb19SBen Gras jz L3 892fe8fb19SBen Gras cmpb %al,(%rsi) 902fe8fb19SBen Gras jne L3 912fe8fb19SBen Gras 922fe8fb19SBen Gras incq %rdi 932fe8fb19SBen Gras incq %rsi 942fe8fb19SBen Gras decq %rdx 952fe8fb19SBen Gras jz L4 962fe8fb19SBen Gras movb (%rdi),%al 972fe8fb19SBen Gras testb %al,%al 982fe8fb19SBen Gras jz L3 992fe8fb19SBen Gras cmpb %al,(%rsi) 1002fe8fb19SBen Gras je L1 1012fe8fb19SBen Gras 1022fe8fb19SBen GrasL3: movzbl (%rdi),%eax /* unsigned comparison */ 1032fe8fb19SBen Gras movzbl (%rsi),%ecx 1042fe8fb19SBen Gras subl %ecx,%eax 1052fe8fb19SBen Gras ret 1062fe8fb19SBen GrasL4: xorl %eax,%eax 1072fe8fb19SBen Gras ret 108*0a6a1f1dSLionel SambucEND(strncmp) 109