xref: /OK3568_Linux_fs/kernel/arch/nds32/lib/copy_template.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun// SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun// Copyright (C) 2005-2017 Andes Technology Corporation
3*4882a593Smuzhiyun
4*4882a593Smuzhiyun
5*4882a593Smuzhiyun	beq	$r1, $r0, quit_memcpy
6*4882a593Smuzhiyun	beqz	$r2, quit_memcpy
7*4882a593Smuzhiyun	srli    $r3, $r2, #5	! check if len < cache-line size 32
8*4882a593Smuzhiyun	beqz	$r3, word_copy_entry
9*4882a593Smuzhiyun	andi	$r4, $r0, #0x3	! check byte-align
10*4882a593Smuzhiyun	beqz	$r4, unalign_word_copy_entry
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun	addi	$r4, $r4,#-4
13*4882a593Smuzhiyun	abs	$r4, $r4	! check how many un-align byte to copy
14*4882a593Smuzhiyun	sub	$r2, $r2, $r4	! update $R2
15*4882a593Smuzhiyun
16*4882a593Smuzhiyununalign_byte_copy:
17*4882a593Smuzhiyun	lbi1	$r3, $r1, #1
18*4882a593Smuzhiyun	addi	$r4, $r4, #-1
19*4882a593Smuzhiyun	sbi1	$r3, $r0, #1
20*4882a593Smuzhiyun	bnez	$r4, unalign_byte_copy
21*4882a593Smuzhiyun	beqz	$r2, quit_memcpy
22*4882a593Smuzhiyun
23*4882a593Smuzhiyununalign_word_copy_entry:
24*4882a593Smuzhiyun	andi	$r3, $r0, 0x1f	! check cache-line unaligncount
25*4882a593Smuzhiyun	beqz	$r3, cache_copy
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun	addi	$r3, $r3, #-32
28*4882a593Smuzhiyun	abs	$r3, $r3
29*4882a593Smuzhiyun	sub	$r2, $r2, $r3	! update $R2
30*4882a593Smuzhiyun
31*4882a593Smuzhiyununalign_word_copy:
32*4882a593Smuzhiyun	lmw1	$r4, $r1, $r4
33*4882a593Smuzhiyun	addi	$r3, $r3, #-4
34*4882a593Smuzhiyun	smw1	$r4, $r0, $r4
35*4882a593Smuzhiyun	bnez	$r3, unalign_word_copy
36*4882a593Smuzhiyun	beqz	$r2, quit_memcpy
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun	addi	$r3, $r2, #-32	! to check $r2< cache_line , than go to word_copy
39*4882a593Smuzhiyun	bltz	$r3, word_copy_entry
40*4882a593Smuzhiyuncache_copy:
41*4882a593Smuzhiyun	srli	$r3, $r2, #5
42*4882a593Smuzhiyun	beqz	$r3, word_copy_entry
43*4882a593Smuzhiyun3:
44*4882a593Smuzhiyun	lmw1	$r17, $r1, $r24
45*4882a593Smuzhiyun	addi	$r3, $r3, #-1
46*4882a593Smuzhiyun	smw1	$r17, $r0, $r24
47*4882a593Smuzhiyun	bnez	$r3, 3b
48*4882a593Smuzhiyun
49*4882a593Smuzhiyunword_copy_entry:
50*4882a593Smuzhiyun	andi	$r2, $r2, #31
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun	beqz	$r2, quit_memcpy
53*4882a593Smuzhiyun5:
54*4882a593Smuzhiyun	srli	$r3, $r2, #2
55*4882a593Smuzhiyun	beqz	$r3, byte_copy
56*4882a593Smuzhiyunword_copy:
57*4882a593Smuzhiyun	lmw1	$r4, $r1, $r4
58*4882a593Smuzhiyun	addi	$r3, $r3, #-1
59*4882a593Smuzhiyun	smw1	$r4, $r0, $r4
60*4882a593Smuzhiyun	bnez	$r3, word_copy
61*4882a593Smuzhiyun	andi	$r2, $r2, #3
62*4882a593Smuzhiyun	beqz	$r2, quit_memcpy
63*4882a593Smuzhiyunbyte_copy:
64*4882a593Smuzhiyun	lbi1	$r3, $r1, #1
65*4882a593Smuzhiyun	addi	$r2, $r2, #-1
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun	sbi1	$r3, $r0, #1
68*4882a593Smuzhiyun	bnez	$r2, byte_copy
69*4882a593Smuzhiyunquit_memcpy:
70