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