|
|
1.1 ! root 1: .file "memccpy.s" ! 2: # @(#)memccpy.s 1.5 ! 3: # Fast assembler language version of the following C-program ! 4: # memccpy ! 5: # which represents the `standard' for the C-library. ! 6: ! 7: # Copy s2 to s1, stopping if character c is copied. Copy no more than n bytes. ! 8: # Return a pointer to the byte after character c in the copy, ! 9: # or NULL if c is not found in the first n bytes. ! 10: ! 11: # char * ! 12: # memccpy(s1, s2, c, n) ! 13: # register char *s1, *s2; ! 14: # register int c, n; ! 15: # { ! 16: # while (--n >= 0) ! 17: # if ((*s1++ = *s2++) == c) ! 18: # return (s1); ! 19: # return (0); ! 20: # } ! 21: .globl _memccpy ! 22: .text ! 23: .align 2 ! 24: _memccpy: ! 25: .word 0x00c0 # uses regs. 0,1,2,3,4,5,6,7 ! 26: movq 12(ap),r6 # escape char in r6, len in r7 ! 27: tstl r7 # source length (arg `n') ! 28: bleq L2 # n <= 0, so return now! ! 29: movq 4(ap),r3 # dest ptr in r3, src ptr in r4 ! 30: movl r4,r1 # src ptr in r1 also ! 31: L0: ! 32: cmpl $65535,r7 # is max len VERY large? ! 33: bgeq L1 # hop if not ! 34: locc r6,$65535,(r1) # look for escape char in src. ! 35: bneq L3 # found it ! 36: movc3 $65535,(r4),(r3) # copy all the chars ! 37: movl r1,r4 # updated src ptr ! 38: subl2 $65535,r7 ! 39: jbr L0 # go look at some more chars ! 40: L1: ! 41: locc r6,r7,(r1) # look for escape char in src. ! 42: bneq L4 # found it ! 43: movc3 r7,(r4),(r3) # copy all the chars ! 44: ret # done (r0 is now 0) ! 45: L2: ! 46: clrl r0 # char not found, return zero ! 47: ret ! 48: L3: ! 49: movl $65535,r7 # len of BLOCK when len VERY large ! 50: L4: ! 51: subl2 r0,r7 # number of bytes to escape char ! 52: incl r7 # move the escape char also ! 53: movc3 r7,(r4),(r3) # copy the chars ! 54: movl r3,r0 # we're done - return ptr to next dest char ! 55: ret
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.