18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci// Copyright (C) 2005-2017 Andes Technology Corporation
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci	beq	$r1, $r0, quit_memcpy
68c2ecf20Sopenharmony_ci	beqz	$r2, quit_memcpy
78c2ecf20Sopenharmony_ci	srli    $r3, $r2, #5	! check if len < cache-line size 32
88c2ecf20Sopenharmony_ci	beqz	$r3, word_copy_entry
98c2ecf20Sopenharmony_ci	andi	$r4, $r0, #0x3	! check byte-align
108c2ecf20Sopenharmony_ci	beqz	$r4, unalign_word_copy_entry
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci	addi	$r4, $r4,#-4
138c2ecf20Sopenharmony_ci	abs	$r4, $r4	! check how many un-align byte to copy
148c2ecf20Sopenharmony_ci	sub	$r2, $r2, $r4	! update $R2
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciunalign_byte_copy:
178c2ecf20Sopenharmony_ci	lbi1	$r3, $r1, #1
188c2ecf20Sopenharmony_ci	addi	$r4, $r4, #-1
198c2ecf20Sopenharmony_ci	sbi1	$r3, $r0, #1
208c2ecf20Sopenharmony_ci	bnez	$r4, unalign_byte_copy
218c2ecf20Sopenharmony_ci	beqz	$r2, quit_memcpy
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_ciunalign_word_copy_entry:
248c2ecf20Sopenharmony_ci	andi	$r3, $r0, 0x1f	! check cache-line unaligncount
258c2ecf20Sopenharmony_ci	beqz	$r3, cache_copy
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	addi	$r3, $r3, #-32
288c2ecf20Sopenharmony_ci	abs	$r3, $r3
298c2ecf20Sopenharmony_ci	sub	$r2, $r2, $r3	! update $R2
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ciunalign_word_copy:
328c2ecf20Sopenharmony_ci	lmw1	$r4, $r1, $r4
338c2ecf20Sopenharmony_ci	addi	$r3, $r3, #-4
348c2ecf20Sopenharmony_ci	smw1	$r4, $r0, $r4
358c2ecf20Sopenharmony_ci	bnez	$r3, unalign_word_copy
368c2ecf20Sopenharmony_ci	beqz	$r2, quit_memcpy
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci	addi	$r3, $r2, #-32	! to check $r2< cache_line , than go to word_copy
398c2ecf20Sopenharmony_ci	bltz	$r3, word_copy_entry
408c2ecf20Sopenharmony_cicache_copy:
418c2ecf20Sopenharmony_ci	srli	$r3, $r2, #5
428c2ecf20Sopenharmony_ci	beqz	$r3, word_copy_entry
438c2ecf20Sopenharmony_ci3:
448c2ecf20Sopenharmony_ci	lmw1	$r17, $r1, $r24
458c2ecf20Sopenharmony_ci	addi	$r3, $r3, #-1
468c2ecf20Sopenharmony_ci	smw1	$r17, $r0, $r24
478c2ecf20Sopenharmony_ci	bnez	$r3, 3b
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ciword_copy_entry:
508c2ecf20Sopenharmony_ci	andi	$r2, $r2, #31
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci	beqz	$r2, quit_memcpy
538c2ecf20Sopenharmony_ci5:
548c2ecf20Sopenharmony_ci	srli	$r3, $r2, #2
558c2ecf20Sopenharmony_ci	beqz	$r3, byte_copy
568c2ecf20Sopenharmony_ciword_copy:
578c2ecf20Sopenharmony_ci	lmw1	$r4, $r1, $r4
588c2ecf20Sopenharmony_ci	addi	$r3, $r3, #-1
598c2ecf20Sopenharmony_ci	smw1	$r4, $r0, $r4
608c2ecf20Sopenharmony_ci	bnez	$r3, word_copy
618c2ecf20Sopenharmony_ci	andi	$r2, $r2, #3
628c2ecf20Sopenharmony_ci	beqz	$r2, quit_memcpy
638c2ecf20Sopenharmony_cibyte_copy:
648c2ecf20Sopenharmony_ci	lbi1	$r3, $r1, #1
658c2ecf20Sopenharmony_ci	addi	$r2, $r2, #-1
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci	sbi1	$r3, $r0, #1
688c2ecf20Sopenharmony_ci	bnez	$r2, byte_copy
698c2ecf20Sopenharmony_ciquit_memcpy:
70