memcmp.s

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· S 代码 · 共 115 行

S
115
字号
	TEXT	memcmp(SB), $0MOVW R1, 0(FP)/* * performance: *	alligned about 1.0us/call and 17.4mb/sec *	unalligned is about 3.1mb/sec */	MOVW	n+8(FP), R3		/* R3 is count */	MOVW	s1+0(FP), R4		/* R4 is pointer1 */	MOVW	s2+4(FP), R5		/* R5 is pointer2 */	ADDU	R3,R4, R6		/* R6 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. */	SGT	$4,R3, R1	BNE	R1, out/* * test if both pointers * are similarly word alligned */	XOR	R4,R5, R1	AND	$3, R1	BNE	R1, out/* * byte at a time to word allign */l1:	AND	$3,R4, R1	BEQ	R1, l2	MOVBU	0(R4), R8	MOVBU	0(R5), R9	ADDU	$1, R4	BNE	R8,R9, ne	ADDU	$1, R5	JMP	l1/* * turn R3 into end pointer1-15 * cmp 16 at a time while theres room */l2:	ADDU	$-15,R6, R3l3:	SGTU	R3,R4, R1	BEQ	R1, l4	MOVW	0(R4), R8	MOVW	0(R5), R9	MOVW	4(R4), R10	BNE	R8,R9, ne	MOVW	4(R5), R11	MOVW	8(R4), R8	BNE	R10,R11, ne1	MOVW	8(R5), R9	MOVW	12(R4), R10	BNE	R8,R9, ne	MOVW	12(R5), R11	ADDU	$16, R4	BNE	R10,R11, ne1	BNE	R8,R9, ne	ADDU	$16, R5	JMP	l3/* * turn R3 into end pointer1-3 * cmp 4 at a time while theres room */l4:	ADDU	$-3,R6, R3l5:	SGTU	R3,R4, R1	BEQ	R1, out	MOVW	0(R4), R8	MOVW	0(R5), R9	ADDU	$4, R4	BNE	R8,R9, ne	/* only works because big endian */	ADDU	$4, R5	JMP	l5/* * last loop, cmp byte at a time */out:	SGTU	R6,R4, R1	BEQ	R1, ret	MOVBU	0(R4), R8	MOVBU	0(R5), R9	ADDU	$1, R4	BNE	R8,R9, ne	ADDU	$1, R5	JMP	outne1:	SGTU	R10,R11, R1	BNE	R1, ret	MOVW	$-1,R1	RETne:	SGTU	R8,R9, R1	BNE	R1, ret	MOVW	$-1,R1ret:	RET	END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?