root/arch/arc/lib/memcpy-700.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
   4  */
   5 
   6 #include <linux/linkage.h>
   7 
   8 ENTRY_CFI(memcpy)
   9         or      r3,r0,r1
  10         asl_s   r3,r3,30
  11         mov_s   r5,r0
  12         brls.d  r2,r3,.Lcopy_bytewise
  13         sub.f   r3,r2,1
  14         ld_s    r12,[r1,0]
  15         asr.f   lp_count,r3,3
  16         bbit0.d r3,2,.Lnox4
  17         bmsk_s  r2,r2,1
  18         st.ab   r12,[r5,4]
  19         ld.a    r12,[r1,4]
  20 .Lnox4:
  21         lppnz   .Lendloop
  22         ld_s    r3,[r1,4]
  23         st.ab   r12,[r5,4]
  24         ld.a    r12,[r1,8]
  25         st.ab   r3,[r5,4]
  26 .Lendloop:
  27         breq    r2,0,.Last_store
  28         ld      r3,[r5,0]
  29 #ifdef __LITTLE_ENDIAN__
  30         add3    r2,-1,r2
  31         ; uses long immediate
  32         xor_s   r12,r12,r3
  33         bmsk    r12,r12,r2
  34     xor_s       r12,r12,r3
  35 #else /* BIG ENDIAN */
  36         sub3    r2,31,r2
  37         ; uses long immediate
  38         xor_s   r3,r3,r12
  39         bmsk    r3,r3,r2
  40         xor_s   r12,r12,r3
  41 #endif /* ENDIAN */
  42 .Last_store:
  43         j_s.d   [blink]
  44         st      r12,[r5,0]
  45 
  46         .balign 4
  47 .Lcopy_bytewise:
  48         jcs     [blink]
  49         ldb_s   r12,[r1,0]
  50         lsr.f   lp_count,r3
  51         bhs_s   .Lnox1
  52         stb.ab  r12,[r5,1]
  53         ldb.a   r12,[r1,1]
  54 .Lnox1:
  55         lppnz   .Lendbloop
  56         ldb_s   r3,[r1,1]
  57         stb.ab  r12,[r5,1]
  58         ldb.a   r12,[r1,2]
  59         stb.ab  r3,[r5,1]
  60 .Lendbloop:
  61         j_s.d   [blink]
  62         stb     r12,[r5,0]
  63 END_CFI(memcpy)

/* [<][>][^][v][top][bottom][index][help] */