TEXT memccpy(SB),$0 MOVL n+24(FP), CX CMPL CX, $0 JEQ none MOVQ p2+8(FP), DI MOVBLZX c+16(FP), AX CLD/* * find the character in the second string */ REPN; SCASB JEQ found /* * if not found, set count to 'n' */none: MOVL $0, AX MOVL n+24(FP), BX JMP memcpy /* * if found, set count to bytes thru character */found: MOVQ DI, AX SUBQ p2+8(FP), AX MOVQ AX, BX ADDQ RARG, AX /* * copy the memory */ memcpy: MOVQ RARG, DI MOVQ p2+8(FP), SI/* * copy whole longs, if aligned */ MOVQ DI, DX ORQ SI, DX ANDL $3, DX JNE c3 MOVL BX, CX SHRQ $2, CX REP; MOVSL/* * copy the rest, by bytes */ ANDL $3, BXc3: MOVL BX, CX REP; MOVSB RET
TEXT memccpy(SB),$0
MOVL n+24(FP), CX
CMPL CX, $0
JEQ none
MOVQ p2+8(FP), DI
MOVBLZX c+16(FP), AX
CLD
/*
* find the character in the second string
*/
REPN; SCASB
JEQ found
/*
* if not found, set count to 'n'
*/
none:
MOVL $0, AX
MOVL n+24(FP), BX
JMP memcpy
/*
* if found, set count to bytes thru character
*/
found:
MOVQ DI, AX
SUBQ p2+8(FP), AX
MOVQ AX, BX
ADDQ RARG, AX
/*
* copy the memory
*/
memcpy:
MOVQ RARG, DI
MOVQ p2+8(FP), SI
/*
* copy whole longs, if aligned
*/
MOVQ DI, DX
ORQ SI, DX
ANDL $3, DX
JNE c3
MOVL BX, CX
SHRQ $2, CX
REP; MOVSL
/*
* copy the rest, by bytes
*/
ANDL $3, BX
c3:
MOVL BX, CX
REP; MOVSB
RET