xref: /plan9-contrib/sys/src/libc/amd64/memccpy.s (revision 272efad760864ee41cfe633b56aea9b4f5cf3ae7)
1*272efad7SDavid du Colombier	TEXT	memccpy(SB),$0
2*272efad7SDavid du Colombier
3*272efad7SDavid du Colombier	MOVL	n+24(FP), CX
4*272efad7SDavid du Colombier	CMPL	CX, $0
5*272efad7SDavid du Colombier	JEQ	none
6*272efad7SDavid du Colombier	MOVQ	p2+8(FP), DI
7*272efad7SDavid du Colombier	MOVBLZX	c+16(FP), AX
8*272efad7SDavid du Colombier	CLD
9*272efad7SDavid du Colombier/*
10*272efad7SDavid du Colombier * find the character in the second string
11*272efad7SDavid du Colombier */
12*272efad7SDavid du Colombier
13*272efad7SDavid du Colombier	REPN;	SCASB
14*272efad7SDavid du Colombier	JEQ	found
15*272efad7SDavid du Colombier
16*272efad7SDavid du Colombier/*
17*272efad7SDavid du Colombier * if not found, set count to 'n'
18*272efad7SDavid du Colombier */
19*272efad7SDavid du Colombiernone:
20*272efad7SDavid du Colombier	MOVL	$0, AX
21*272efad7SDavid du Colombier	MOVL	n+24(FP), BX
22*272efad7SDavid du Colombier	JMP	memcpy
23*272efad7SDavid du Colombier
24*272efad7SDavid du Colombier/*
25*272efad7SDavid du Colombier * if found, set count to bytes thru character
26*272efad7SDavid du Colombier */
27*272efad7SDavid du Colombierfound:
28*272efad7SDavid du Colombier	MOVQ	DI, AX
29*272efad7SDavid du Colombier	SUBQ	p2+8(FP), AX
30*272efad7SDavid du Colombier	MOVQ	AX, BX
31*272efad7SDavid du Colombier	ADDQ	RARG, AX
32*272efad7SDavid du Colombier
33*272efad7SDavid du Colombier/*
34*272efad7SDavid du Colombier * copy the memory
35*272efad7SDavid du Colombier */
36*272efad7SDavid du Colombier
37*272efad7SDavid du Colombiermemcpy:
38*272efad7SDavid du Colombier	MOVQ	RARG, DI
39*272efad7SDavid du Colombier	MOVQ	p2+8(FP), SI
40*272efad7SDavid du Colombier/*
41*272efad7SDavid du Colombier * copy whole longs, if aligned
42*272efad7SDavid du Colombier */
43*272efad7SDavid du Colombier	MOVQ	DI, DX
44*272efad7SDavid du Colombier	ORQ	SI, DX
45*272efad7SDavid du Colombier	ANDL	$3, DX
46*272efad7SDavid du Colombier	JNE	c3
47*272efad7SDavid du Colombier	MOVL	BX, CX
48*272efad7SDavid du Colombier	SHRQ	$2, CX
49*272efad7SDavid du Colombier	REP;	MOVSL
50*272efad7SDavid du Colombier/*
51*272efad7SDavid du Colombier * copy the rest, by bytes
52*272efad7SDavid du Colombier */
53*272efad7SDavid du Colombier	ANDL	$3, BX
54*272efad7SDavid du Colombierc3:
55*272efad7SDavid du Colombier	MOVL	BX, CX
56*272efad7SDavid du Colombier	REP;	MOVSB
57*272efad7SDavid du Colombier
58*272efad7SDavid du Colombier	RET
59