1*272efad7SDavid du Colombier TEXT strcat(SB),$0 2*272efad7SDavid du Colombier 3*272efad7SDavid du Colombier MOVL $0, AX 4*272efad7SDavid du Colombier MOVQ $-1, CX 5*272efad7SDavid du Colombier CLD 6*272efad7SDavid du Colombier 7*272efad7SDavid du Colombier/* 8*272efad7SDavid du Colombier * find length of second string 9*272efad7SDavid du Colombier */ 10*272efad7SDavid du Colombier 11*272efad7SDavid du Colombier MOVQ p2+8(FP), DI 12*272efad7SDavid du Colombier REPN; SCASB 13*272efad7SDavid du Colombier 14*272efad7SDavid du Colombier MOVQ DI, BX 15*272efad7SDavid du Colombier SUBQ p2+8(FP), BX 16*272efad7SDavid du Colombier 17*272efad7SDavid du Colombier/* 18*272efad7SDavid du Colombier * find end of first string 19*272efad7SDavid du Colombier */ 20*272efad7SDavid du Colombier 21*272efad7SDavid du Colombier MOVQ RARG, DI 22*272efad7SDavid du Colombier REPN; SCASB 23*272efad7SDavid du Colombier 24*272efad7SDavid du Colombier/* 25*272efad7SDavid du Colombier * copy the memory 26*272efad7SDavid du Colombier */ 27*272efad7SDavid du Colombier SUBQ $1, DI 28*272efad7SDavid du Colombier MOVQ p2+8(FP), SI 29*272efad7SDavid du Colombier/* 30*272efad7SDavid du Colombier * copy whole longs, if aligned 31*272efad7SDavid du Colombier */ 32*272efad7SDavid du Colombier MOVQ DI, CX 33*272efad7SDavid du Colombier ORQ SI, CX 34*272efad7SDavid du Colombier ANDL $3, CX 35*272efad7SDavid du Colombier JNE c3 36*272efad7SDavid du Colombier MOVQ BX, CX 37*272efad7SDavid du Colombier SHRQ $2, CX 38*272efad7SDavid du Colombier REP; MOVSL 39*272efad7SDavid du Colombier/* 40*272efad7SDavid du Colombier * copy the rest, by bytes 41*272efad7SDavid du Colombier */ 42*272efad7SDavid du Colombier ANDL $3, BX 43*272efad7SDavid du Colombierc3: 44*272efad7SDavid du Colombier MOVQ BX, CX 45*272efad7SDavid du Colombier REP; MOVSB 46*272efad7SDavid du Colombier 47*272efad7SDavid du Colombier MOVQ RARG, AX 48*272efad7SDavid du Colombier RET 49