root/arch/sh/lib/strlen.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 /* $Id: strlen.S,v 1.2 2001/06/29 14:07:15 gniibe Exp $
   3  *
   4  * "strlen" implementation of SuperH
   5  *
   6  * Copyright (C) 1999  Kaz Kojima
   7  *
   8  */
   9 
  10 /* size_t strlen (const char *s)  */
  11 
  12 #include <linux/linkage.h>
  13 ENTRY(strlen)
  14         mov     r4,r0
  15         and     #3,r0
  16         tst     r0,r0
  17         bt/s    1f
  18          mov    #0,r2
  19 
  20         add     #-1,r0
  21         shll2   r0
  22         shll    r0
  23         braf    r0
  24          nop
  25 
  26         mov.b   @r4+,r1
  27         tst     r1,r1
  28         bt      8f
  29         add     #1,r2
  30 
  31         mov.b   @r4+,r1
  32         tst     r1,r1
  33         bt      8f
  34         add     #1,r2
  35 
  36         mov.b   @r4+,r1
  37         tst     r1,r1
  38         bt      8f
  39         add     #1,r2
  40 
  41 1:
  42         mov     #0,r3
  43 2:
  44         mov.l   @r4+,r1
  45         cmp/str r3,r1
  46         bf/s    2b
  47          add    #4,r2
  48 
  49         add     #-4,r2
  50 #ifndef __LITTLE_ENDIAN__
  51         swap.b  r1,r1
  52         swap.w  r1,r1
  53         swap.b  r1,r1
  54 #endif
  55         extu.b  r1,r0
  56         tst     r0,r0
  57         bt/s    8f
  58          shlr8  r1
  59         add     #1,r2
  60         extu.b  r1,r0
  61         tst     r0,r0
  62         bt/s    8f
  63          shlr8  r1
  64         add     #1,r2
  65         extu.b  r1,r0
  66         tst     r0,r0
  67         bt      8f
  68         add     #1,r2
  69 8:
  70         rts
  71          mov    r2,r0

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