1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  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