shithub: riscv

ref: c4ecd0fee0f0cef485a223d6e638a56bafd5bbda
dir: /sys/src/ape/lib/ap/sparc/strcpy.s/

View raw version
	TEXT	strcpy(SB), $0

MOVW	R7, 0(FP)
	MOVW	s1+0(FP), R9		/* R9 is to pointer */
	MOVW	s2+4(FP), R10		/* R10 is from pointer */

/*
 * test if both pointers
 * are similarly word aligned
 */
	XOR	R9,R10, R7
	ANDCC	$3,R7, R0
	BNE	una

/*
 * make byte masks
 */
	MOVW	$0xff, R17
	SLL	$8,R17, R16
	SLL	$16,R17, R13
	SLL	$24,R17, R12

/*
 * byte at a time to word align
 */
al1:
	ANDCC	$3,R10, R0
	BE	al2
	MOVB	(R10), R11
	ADD	$1, R10
	MOVB	R11, (R9)
	ADD	$1, R9
	SUBCC	R0,R11, R0
	BNE	al1
	JMP	out

/*
 * word at a time
 */
al2:
	ADD	$4, R9
	MOVW	(R10), R11	/* fetch */
	ADD	$4, R10
	ANDCC	R12,R11, R0	/* is it byte 0 */
	BE	b0
	ANDCC	R13,R11, R0	/* is it byte 1 */
	BE	b1
	ANDCC	R16,R11, R0	/* is it byte 2 */
	BE	b2
	MOVW	R11, -4(R9)	/* store */
	ANDCC	R17,R11, R0	/* is it byte 3 */
	BNE	al2

	JMP	out

b0:
	MOVB	R0, -4(R9)
	JMP	out

b1:
	SRL	$24, R11
	MOVB	R11, -4(R9)
	MOVB	R0, -3(R9)
	JMP	out

b2:
	SRL	$24,R11, R7
	MOVB	R7, -4(R9)
	SRL	$16, R11
	MOVB	R11, -3(R9)
	MOVB	R0, -2(R9)
	JMP	out

una:
	MOVB	(R10), R11
	ADD	$1, R10
	MOVB	R11, (R9)
	ADD	$1, R9
	SUBCC	R0,R11, R0
	BNE	una

out:
	MOVW	s1+0(FP),R7
	RETURN