1/* strncmp.s 4.2 84/11/01 */ 2 3/* 4 * Compare at most n characters of string 5 * s1 lexicographically to string s2. 6 * Return: 7 * 0 s1 == s2 8 * > 0 s1 > s2 9 * < 0 s2 < s2 10 * 11 * strncmp(s1, s2, n) 12 * char *s1, *s2; 13 * int n; 14 */ 15#include "DEFS.h" 16 17ENTRY(strncmp, 0) 18 movl 12(ap),r5 # r5 = n 19 movq 4(ap),r3 # r3 = s1; r4 = s2 201: 21 locc $0,$65535,(r4) # look for '\0' in s2 22 bneq 2f 23 cmpl r5,$65535 # n > chunk size? 24 bgtr 4f # yes 25 movl r5,r1 # no, compare only n bytes 26 jbr 5f 274: 28 subl2 $65535,r5 # adjust n 29 cmpc3 $65535,(r4),(r3)# compare full block 30 bneq 3f 31 movl r1,r4 # advance s2 32 jbr 1b # matched, next block 332: 34 subl2 r4,r1 # calculate length 35 incl r1 # +1 for '\0' 36 cmpl r1,r5 # length <= n 37 bleq 5f # yes, compare full string 38 movl r5,r1 # no, compare only n bytes 395: 40 cmpc3 r1,(r4),(r3) # compare remainder 41 bneq 3f 42 ret # r0 = 0 already 433: 44 subb3 (r1),(r3),r0 # r0 = *s1 - *s2 45 cvtbl r0,r0 46 ret 47