linux/arch/sh/lib/strlen.S
<<
>>
Prefs
   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>
  13ENTRY(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
  411:
  42        mov     #0,r3
  432:
  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
  698:
  70        rts
  71         mov    r2,r0
  72