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