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