arch/sh/lib/memcpy.S

Source file repositories/reference/linux-study-clean/arch/sh/lib/memcpy.S

File Facts

System
Linux kernel
Corpus path
arch/sh/lib/memcpy.S
Extension
.S
Size
3689 bytes
Lines
229
Domain
Architecture Layer
Bucket
arch/sh
Inferred role
Architecture Layer: arch/sh
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

#include <linux/linkage.h>
ENTRY(memcpy)
	tst	r6,r6
	bt/s	9f		! if n=0, do nothing
	 mov	r4,r0
	sub	r4,r5		! From here, r5 has the distance to r0
	add	r6,r0		! From here, r0 points the end of copying point
	mov	#12,r1
	cmp/gt	r6,r1
	bt/s	7f		! if it's too small, copy a byte at once
	 add	#-1,r5
	add	#1,r5
	!			From here, r6 is free
	!
	!      r4   -->  [ ...  ] DST             [ ...  ] SRC
	!	         [ ...  ]                 [ ...  ]
	!	           :                        :
	!      r0   -->  [ ...  ]       r0+r5 --> [ ...  ]
	!
	!
	mov	r5,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	4
jmptable:
	.long	case0
	.long	case1
	.long	case2
	.long	case3

	! copy a byte at once
7:	mov	r4,r2
	add	#1,r2
8:
	cmp/hi	r2,r0
	mov.b	@(r0,r5),r1
	bt/s	8b			! while (r0>r2)
	 mov.b	r1,@-r0
9:
	rts
	 nop

case0:
	!
	!	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	#-4,r5
	add	#3,r5
1:	dt	r3
	mov.b	@(r0,r5),r1
	bf/s	1b
	 mov.b	r1,@-r0
	!
	add	#-3,r5
2:	! Second, copy a long word at once
	mov	r4,r2
	add	#7,r2
3:	mov.l	@(r0,r5),r1

Annotation

Implementation Notes