120 lines · 1.7 KB · Assembly
RawDownload
	TEXT	memcmp(SB), $0 /* * performance: *	(tba) */ 	MOVW	R7, 0(FP)	MOVW	n+8(FP), R9		/* R9 is count */	MOVW	s1+0(FP), R10		/* R10 is pointer1 */	MOVW	s2+4(FP), R11		/* R11 is pointer2 */	ADD	R9,R10, R12		/* R12 is end pointer1 */ /* * if not at least 4 chars, * dont even mess around. * 3 chars to guarantee any * rounding up to a word * boundary and 4 characters * to get at least maybe one * full word cmp. */	SUBCC	$4,R9, R0	BL	out /* * test if both pointers * are similarly word alligned */	XOR	R10,R11, R7	ANDCC	$3,R7, R0	BNE	out /* * byte at a time to word allign */l1:	ANDCC	$3,R10, R0	BE	l2	MOVBU	0(R10), R16	MOVBU	0(R11), R17	ADD	$1, R10	SUBCC	R16,R17, R0	BNE	ne	ADD	$1, R11	JMP	l1 /* * turn R9 into end pointer1-15 * cmp 16 at a time while theres room */l2:	SUB	$15,R12, R9l3:	SUBCC	R10,R9, R0	BLEU	l4	MOVW	0(R10), R16	MOVW	0(R11), R17	MOVW	4(R10), R18	SUBCC	R16,R17, R0	BNE	ne	MOVW	4(R11), R19	MOVW	8(R10), R16	SUBCC	R18,R19, R0	BNE	ne	MOVW	8(R11), R17	MOVW	12(R10), R18	SUBCC	R16,R17, R0	BNE	ne	MOVW	12(R11), R19	ADD	$16, R10	SUBCC	R18,R19, R0	BNE	ne	SUBCC	R16,R17, R0	BNE	ne	ADD	$16, R11	JMP	l3 /* * turn R9 into end pointer1-3 * cmp 4 at a time while theres room */l4:	SUB	$3,R12, R9l5:	SUBCC	R10,R9, R0	BLEU	out	MOVW	0(R10), R16	MOVW	0(R11), R17	ADD	$4, R10	SUBCC	R16,R17, R0		/* only works because big endian */	BNE	ne	ADD	$4, R11	JMP	l5 /* * last loop, cmp byte at a time */out:	SUBCC	R10,R12, R0	BE	zero	MOVBU	0(R10), R16	MOVBU	0(R11), R17	ADD	$1, R10	SUBCC	R16,R17, R0	BNE	ne	ADD	$1, R11	JMP	out ne:	BGU	plus	MOVW	$1, R7	RETURNplus:	MOVW	$-1, R7	RETURN zero:	MOVW	R0, R7	RETURN