~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/csky/abiv2/memset.S

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 // Copyright (C) 2018 Hangzhou C-SKY Microsystems co.,ltd.
  3 
  4 #include <linux/linkage.h>
  5 #include "sysdep.h"
  6 
  7         .weak memset
  8 ENTRY(__memset)
  9 ENTRY(memset)
 10         /* Test if len less than 4 bytes.  */
 11         mov     r12, r0
 12         cmplti  r2, 8
 13         bt      .L_set_by_byte
 14 
 15         andi    r13, r0, 3
 16         movi    r19, 4
 17         /* Test if dest is not 4 bytes aligned.  */
 18         bnez    r13, .L_dest_not_aligned
 19         /* Hardware can handle unaligned access directly.  */
 20 .L_dest_aligned:
 21         zextb   r3, r1
 22         lsli    r1, 8
 23         or      r1, r3
 24         lsli    r3, r1, 16
 25         or      r3, r1
 26 
 27         /* If dest is aligned, then copy.  */
 28         zext    r18, r2, 31, 4
 29         /* Test if len less than 16 bytes.  */
 30         bez     r18, .L_len_less_16bytes
 31 
 32         LABLE_ALIGN
 33 .L_len_larger_16bytes:
 34         stw     r3, (r0, 0)
 35         stw     r3, (r0, 4)
 36         stw     r3, (r0, 8)
 37         stw     r3, (r0, 12)
 38         PRE_BNEZAD (r18)
 39         addi    r0, 16
 40         BNEZAD (r18, .L_len_larger_16bytes)
 41 
 42 .L_len_less_16bytes:
 43         zext    r18, r2, 3, 2
 44         andi    r2, 3
 45         bez     r18, .L_set_by_byte
 46 .L_len_less_16bytes_loop:
 47         stw     r3, (r0, 0)
 48         PRE_BNEZAD (r18)
 49         addi    r0, 4
 50         BNEZAD (r18, .L_len_less_16bytes_loop)
 51 
 52         /* Test if len less than 4 bytes.  */
 53 .L_set_by_byte:
 54         zext    r18, r2, 2, 0
 55         bez     r18, .L_return
 56 .L_set_by_byte_loop:
 57         stb     r1, (r0, 0)
 58         PRE_BNEZAD (r18)
 59         addi    r0, 1
 60         BNEZAD (r18, .L_set_by_byte_loop)
 61 
 62 .L_return:
 63         mov     r0, r12
 64         rts
 65 
 66         /* If dest is not aligned, just set some bytes makes the dest
 67            align.  */
 68 
 69 .L_dest_not_aligned:
 70         sub     r13, r19, r13
 71         sub     r2, r13
 72 .L_dest_not_aligned_loop:
 73         /* Makes the dest align.  */
 74         stb     r1, (r0, 0)
 75         PRE_BNEZAD (r13)
 76         addi    r0, 1
 77         BNEZAD (r13, .L_dest_not_aligned_loop)
 78         cmplti  r2, 8
 79         bt      .L_set_by_byte
 80         /* Check whether the src is aligned.  */
 81         jbr     .L_dest_aligned
 82 ENDPROC(memset)
 83 ENDPROC(__memset)

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php