linux/arch/sparc/lib/strlen.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/* strlen.S: Sparc optimized strlen code
   3 * Hand optimized from GNU libc's strlen
   4 * Copyright (C) 1991,1996 Free Software Foundation
   5 * Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net)
   6 * Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
   7 */
   8
   9#include <linux/linkage.h>
  10#include <asm/asm.h>
  11#include <asm/export.h>
  12
  13#define LO_MAGIC 0x01010101
  14#define HI_MAGIC 0x80808080
  15
  16        .text
  17ENTRY(strlen)
  18        mov     %o0, %o1
  19        andcc   %o0, 3, %g0
  20        BRANCH32(be, pt, 9f)
  21         sethi  %hi(HI_MAGIC), %o4
  22        ldub    [%o0], %o5
  23        BRANCH_REG_ZERO(pn, %o5, 11f)
  24         add    %o0, 1, %o0
  25        andcc   %o0, 3, %g0
  26        BRANCH32(be, pn, 4f)
  27         or     %o4, %lo(HI_MAGIC), %o3
  28        ldub    [%o0], %o5
  29        BRANCH_REG_ZERO(pn, %o5, 12f)
  30         add    %o0, 1, %o0
  31        andcc   %o0, 3, %g0
  32        BRANCH32(be, pt, 5f)
  33         sethi  %hi(LO_MAGIC), %o4
  34        ldub    [%o0], %o5
  35        BRANCH_REG_ZERO(pn, %o5, 13f)
  36         add    %o0, 1, %o0
  37        BRANCH32(ba, pt, 8f)
  38         or     %o4, %lo(LO_MAGIC), %o2
  399:
  40        or      %o4, %lo(HI_MAGIC), %o3
  414:
  42        sethi   %hi(LO_MAGIC), %o4
  435:
  44        or      %o4, %lo(LO_MAGIC), %o2
  458:
  46        ld      [%o0], %o5
  472:
  48        sub     %o5, %o2, %o4
  49        andcc   %o4, %o3, %g0
  50        BRANCH32(be, pt, 8b)
  51         add    %o0, 4, %o0
  52
  53        /* Check every byte. */
  54        srl     %o5, 24, %g7
  55        andcc   %g7, 0xff, %g0
  56        BRANCH32(be, pn, 1f)
  57         add    %o0, -4, %o4
  58        srl     %o5, 16, %g7
  59        andcc   %g7, 0xff, %g0
  60        BRANCH32(be, pn, 1f)
  61         add    %o4, 1, %o4
  62        srl     %o5, 8, %g7
  63        andcc   %g7, 0xff, %g0
  64        BRANCH32(be, pn, 1f)
  65         add    %o4, 1, %o4
  66        andcc   %o5, 0xff, %g0
  67        BRANCH32_ANNUL(bne, pt, 2b)
  68         ld     [%o0], %o5
  69        add     %o4, 1, %o4
  701:
  71        retl
  72         sub    %o4, %o1, %o0
  7311:
  74        retl
  75         mov    0, %o0
  7612:
  77        retl
  78         mov    1, %o0
  7913:
  80        retl
  81         mov    2, %o0
  82ENDPROC(strlen)
  83EXPORT_SYMBOL(strlen)
  84