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

📄 memmove.s

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 S
字号:
/* $Id: memmove.S,v 1.2 1999/09/21 12:55:49 gniibe Exp $ * * "memmove" implementation of SuperH * * Copyright (C) 1999  Niibe Yutaka * *//* * void *memmove(void *dst, const void *src, size_t n); * The memory areas may overlap. */#include <linux/linkage.h>ENTRY(memmove)	! if dest > src, call memcpy (it copies in decreasing order)	cmp/hi	r5,r4	bf	1f	mov.l	2f,r0	jmp	@r0	 nop	.balign 42:	.long	SYMBOL_NAME(memcpy)1:	sub	r5,r4		! From here, r4 has the distance to r0	tst	r6,r6	bt/s	9f		! if n=0, do nothing	 mov	r5,r0	add	r6,r5	mov	#12,r1	cmp/gt	r6,r1	bt/s	8f		! if it's too small, copy a byte at once	 add	#-1,r4	add	#1,r4	!	!                [ ...  ] DST             [ ...  ] SRC	!	         [ ...  ]                 [ ...  ]	!	           :                        :	!      r0+r4-->  [ ...  ]       r0    --> [ ...  ]	!	           :                        :	!	         [ ...  ]                 [ ...  ]	!			        r5    -->	!	mov	r4,r1	mov	#3,r2	and	r2,r1	shll2	r1	mov	r0,r3		! Save the value on R0 to R3	mova	jmptable,r0	add	r1,r0	mov.l	@r0,r1	jmp	@r1	 mov	r3,r0		! and back to R0	.balign	4jmptable:	.long	case0	.long	case1	.long	case2	.long	case3	! copy a byte at once8:	mov.b	@r0+,r1	cmp/hs	r5,r0	bf/s	8b			! while (r0<r5)	 mov.b	r1,@(r0,r4)	add	#1,r49:	add	r4,r0	rts	 sub	r6,r0case_none:	bra	8b	 add	#-1,r4case0:	!	!	GHIJ KLMN OPQR -->  GHIJ KLMN OPQR	!	! First, align to long word boundary	mov	r0,r3	and	r2,r3	tst	r3,r3	bt/s	2f	 add	#-1,r4	mov	#4,r2	sub	r3,r21:	dt	r2	mov.b	@r0+,r1	bf/s	1b	 mov.b	r1,@(r0,r4)	!2:	! Second, copy a long word at once	add	#-3,r4	add	#-3,r53:	mov.l	@r0+,r1	cmp/hs	r5,r0	bf/s	3b	 mov.l	r1,@(r0,r4)	add	#3,r5	!	! Third, copy a byte at once, if necessary	cmp/eq	r5,r0	bt/s	9b	 add	#4,r4	bra	8b	 add	#-1,r4case3:	!	!	GHIJ KLMN OPQR -->  ...G HIJK LMNO PQR.	!	! First, align to long word boundary	mov	r0,r3	and	r2,r3	tst	r3,r3	bt/s	2f	 add	#-1,r4	mov	#4,r2	sub	r3,r21:	dt	r2	mov.b	@r0+,r1	bf/s	1b	 mov.b	r1,@(r0,r4)	!2:	! Second, read a long word and write a long word at once	add	#-2,r4	mov.l	@(r0,r4),r1	add	#-7,r5	add	#-4,r4	!#ifdef __LITTLE_ENDIAN__	shll8	r13:	mov	r1,r3		! JIHG	shlr8	r3		! xJIH	mov.l	@r0+,r1		! NMLK	mov	r1,r2	shll16	r2	shll8	r2		! Kxxx	or	r2,r3		! KJIH	cmp/hs	r5,r0	bf/s	3b	 mov.l	r3,@(r0,r4)#else	shlr8	r13:	mov	r1,r3		! GHIJ	shll8	r3		! HIJx	mov.l	@r0+,r1		! KLMN	mov	r1,r2	shlr16	r2	shlr8	r2		! xxxK	or	r2,r3		! HIJK	cmp/hs	r5,r0	bf/s	3b	 mov.l	r3,@(r0,r4)#endif	add	#7,r5	!	! Third, copy a byte at once, if necessary	cmp/eq	r5,r0	bt/s	9b	 add	#7,r4	add	#-3,r0	bra	8b	 add	#-1,r4case2:	!	!	GHIJ KLMN OPQR -->  ..GH IJKL MNOP QR..	!	! First, align to word boundary	tst	#1,r0	bt/s	2f	 add	#-1,r4	mov.b	@r0+,r1	mov.b	r1,@(r0,r4)	!2:	! Second, read a word and write a word at once	add	#-1,r4	add	#-1,r5	!3:	mov.w	@r0+,r1	cmp/hs	r5,r0	bf/s	3b	 mov.w	r1,@(r0,r4)	add	#1,r5	!	! Third, copy a byte at once, if necessary	cmp/eq	r5,r0	bt/s	9b	 add	#2,r4	mov.b	@r0,r1	mov.b	r1,@(r0,r4)	bra	9b	 add	#1,r0case1:	!	!	GHIJ KLMN OPQR -->  .GHI JKLM NOPQ R...	!	! First, align to long word boundary	mov	r0,r3	and	r2,r3	tst	r3,r3	bt/s	2f	 add	#-1,r4	mov	#4,r2	sub	r3,r21:	dt	r2	mov.b	@r0+,r1	bf/s	1b	 mov.b	r1,@(r0,r4)	!2:	! Second, read a long word and write a long word at once	mov.l	@(r0,r4),r1	add	#-7,r5	add	#-4,r4	!#ifdef __LITTLE_ENDIAN__	shll16	r1	shll8	r13:	mov	r1,r3		! JIHG	shlr16	r3	shlr8	r3		! xxxJ	mov.l	@r0+,r1		! NMLK	mov	r1,r2	shll8	r2		! MLKx	or	r2,r3		! MLKJ	cmp/hs	r5,r0	bf/s	3b	 mov.l	r3,@(r0,r4)#else	shlr16	r1	shlr8	r13:	mov	r1,r3		! GHIJ	shll16	r3	shll8	r3		! Jxxx	mov.l	@r0+,r1		! KLMN	mov	r1,r2	shlr8	r2		! xKLM	or	r2,r3		! JKLM	cmp/hs	r5,r0	bf/s	3b		! while(r0<r5)	 mov.l	r3,@(r0,r4)#endif	add	#7,r5	!	! Third, copy a byte at once, if necessary	cmp/eq	r5,r0	bt/s	9b	 add	#5,r4	add	#-3,r0	bra	8b	 add	#-1,r4

⌨️ 快捷键说明

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