⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memcmp.c

📁 Newlib 嵌入式 C库 标准实现代码
💻 C
字号:
#if defined __thumb__#include "../../string/memcmp.c"#else#include <string.h>#include "xscale.h"intmemcmp (const void * s1, const void * s2, size_t len){  int result;  asm (#ifndef __OPTIMIZE_SIZE__ "\n\	cmp	%2, #0x3	@ Is the length a multiple of four ?\n\	bls	6f		@ no  = goto SLOW CHECK\n\	and	r2, %0, #0x3	@ get alignment of first pointer\n\	and	r3, %1, #0x3	@ get alignment of second pointer\n\	cmp	r2, r3		@ Do the two pointers share the same alignment ?\n\	bne	6f		@ no = goto SLOW CHECK\n\	mov	lr, %0		@ copy first pointer into LR\n\	mov	r4, %1		@ copy second pointer into R4\n\	cmp	r2, #0x0	@ Are we comparing word aligned pointers ?\n\	beq	3f		@ yes = goto START WORD CHECK LOOP\n\	b	1f		@ jump to LOOP TEST\n\0:			       @ LOOP START\n\	ldrb	r2, [lr], #1	@ load byte from LR, post inc.\n\"	PRELOADSTR("lr") "	@ preload\n\	ldrb	r3, [r4], #1	@ load byte from R4, post inc.\n\"	PRELOADSTR("r4") "	@ preload\n\	cmp	r2, r3		@ are the two bytes the same ?\n\	bne	5f		@ no = goto EXIT\n\	tst	lr, #0x3	@ has the LR become word aligned ?\n\	bne     1f		@ no = skip the next test\n\	cmp     %2, #4		@ is the count >= 4 ?\n\	bhs     3f		@ yes = goto START WORD CHECK LOOP\n\1:			       @ LOOP TEST\n\	sub	%2, %2, #1	@ decrement count by one\n\	cmn	%2, #0x1	@ has the count reached -1 ?\n\	bne	0b		@ no = loop back to LOOP START\n\	b	4f		@ goto PASS END\n\\n\0:			       @ ??\n\	cmp	%2, #0x7	@ Is the count a multiple of 8 ?\n\	bls	3f		@ no = goto ???\n\	ldmia	lr,{r2, r3}	@ get two words from first pointer, post inc\n\	ldmia	r4,{r5, r6}	@ get two words from second pointer, post inc\n\	sub	%2, %2, #0x4	@ decrement count by 4\n\	cmp	r2, r5		@ has the count reached ????\n\	bne	1f		@ no = goto\n\	sub	%2, %2, #0x4	@ decrement the count by 4\n\	add	lr, lr, #0x4	@ add 4 to first pointer\n\	add	r4, r4, #0x4	@ add 4 to second pointer\n\	cmp	r3, r6		@ ???\n\	beq	0b		@ goto ???\n\1:			       @ ??\n\	add	%2, %2, #0x4	@ Add four to count\n\	sub	%0, lr, #0x4	@ decrement first pointer by 4\n\	sub	%1, r4, #0x4	@ decrement second pointer by 4\n\	b	6f		@ goto SLOW CHECK\n\\n\3:			       @ START WORD CHECK LOOP\n\	cmp	%2, #0x3	@ is the count <= 3 ?\n\	bls	1f		@ yes = goto CHECK BYTES BY HAND\n\	ldr	r2, [lr], #4	@ get word from LR, post inc\n\	ldr	r3, [r4], #4	@ get word from R4, post inc\n\	sub	%2, %2, #4	@ decrement count by 4\n\	cmp	r2, r3		@ are the two words the same ?\n\	bne	1f		@ no = goto CHECK WORD CONTENTS\n\0:			       @ WORD CHECK LOOP\n\	cmp	%2, #0x3	@ is the count <= 3 ?\n\	bls	1f		@ yes = goto CHECK BYTES BY HAND\n\	ldr	r2, [lr], #4	@ load word from LR, post inc\n\"	PRELOADSTR("lr") "	@ preload\n\	ldr	r3, [r4], #4	@ load word from R4, post inc\n\"	PRELOADSTR("r4") "	@ preload\n\	sub	%2, %2, #4	@ decrement count by 4\n\	cmp	r2, r3		@ are the two words the same ?\n\	beq	0b		@ yes = goto WORD CHECK LOOP\n\1:			       @ CHECK BYTES BY HAND\n\	sub	%0, lr, #0x4	@ move LR back a word and put into first pointer\n\	sub	%1, r4, #0x4	@ move R4 back a word and put into second pointer\n\	add	%2, %2, #4	@ increment the count by 4\n\				@ fall through into SLOW CHECK"#endif /* !__OPTIMIZE_SIZE__ */"\n\6:			       @ SLOW CHECK\n\	sub	%2, %2, #1	@ Decrement the count by one\n\	cmn	%2, #0x1	@ Has the count reached -1 ?\n\	beq	4f		@ Yes - we are finished, goto PASS END\n\0:			       @ LOOP1\n\	ldrb	r2, [%0], #1	@ get byte from first pointer\n\"	PRELOADSTR("%0") "	@ preload first pointer\n\	ldrb	r3, [%1], #1	@ get byte from second pointer\n\"	PRELOADSTR("%1") "	@ preload second pointer\n\	cmp	r2, r3		@ compare the two loaded bytes\n\	bne	5f		@ if they are not equal goto EXIT\n\	sub	%2, %2, #1	@ decremented count by 1\n\	cmn	%2, #0x1	@ has the count reached -1 ?\n\	bne	0b		@ no = then go back to LOOP1\n\4:			       @ PASS END\n\	mov	r3, r2		@ Default return value is 0\n\5:			       @ EXIT\n\	rsb	%0, r3, r2	@ return difference between last two bytes loaded"       : "=r" (result), "=&r" (s2), "=&r" (len)       : "0" (s1), "1" (s2), "2" (len)       : "r2", "r3", "r4", "r5", "r6", "cc", "lr");  return result;}#endif

⌨️ 快捷键说明

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