/* SPDX-License-Identifier: GPL-2.0 */
/* strlen.S: Sparc optimized strlen code
* Hand optimized from GNU libc's strlen
* Copyright (C) 1991,1996 Free Software Foundation
* Copyright (C) 1996,2008 David S. Miller (davem@davemloft.net)
* Copyright (C) 1996, 1997 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
*/
#include <linux/export.h>
#include <linux/linkage.h>
#include <asm/asm.h>
#define LO_MAGIC 0 x01010101
#define HI_MAGIC 0 x80808080
.text
ENTRY(strlen)
mov %o0, %o1
andcc %o0, 3 , %g0
BRANCH32(be, pt, 9 f)
sethi %hi (HI_MAGIC), %o4
ldub [%o0], %o5
BRANCH_REG_ZERO(pn, %o5, 11 f)
add %o0, 1 , %o0
andcc %o0, 3 , %g0
BRANCH32(be, pn, 4 f)
or %o4, %lo (HI_MAGIC), %o3
ldub [%o0], %o5
BRANCH_REG_ZERO(pn, %o5, 12 f)
add %o0, 1 , %o0
andcc %o0, 3 , %g0
BRANCH32(be, pt, 5 f)
sethi %hi (LO_MAGIC), %o4
ldub [%o0], %o5
BRANCH_REG_ZERO(pn, %o5, 13 f)
add %o0, 1 , %o0
BRANCH32(ba, pt, 8 f)
or %o4, %lo (LO_MAGIC), %o2
9 :
or %o4, %lo (HI_MAGIC), %o3
4 :
sethi %hi (LO_MAGIC), %o4
5 :
or %o4, %lo (LO_MAGIC), %o2
8 :
ld [%o0], %o5
2 :
sub %o5, %o2, %o4
andcc %o4, %o3, %g0
BRANCH32(be, pt, 8 b)
add %o0, 4 , %o0
/* Check every byte. */
srl %o5, 24 , %g7
andcc %g7, 0 xff, %g0
BRANCH32(be, pn, 1 f)
add %o0, -4 , %o4
srl %o5, 16 , %g7
andcc %g7, 0 xff, %g0
BRANCH32(be, pn, 1 f)
add %o4, 1 , %o4
srl %o5, 8 , %g7
andcc %g7, 0 xff, %g0
BRANCH32(be, pn, 1 f)
add %o4, 1 , %o4
andcc %o5, 0 xff, %g0
BRANCH32_ANNUL(bne, pt, 2 b)
ld [%o0], %o5
add %o4, 1 , %o4
1 :
retl
sub %o4, %o1, %o0
11 :
retl
mov 0 , %o0
12 :
retl
mov 1 , %o0
13 :
retl
mov 2 , %o0
ENDPROC(strlen)
EXPORT_SYMBOL(strlen)
Messung V0.5 in Prozent C=95 H=93 G=93
¤ Dauer der Verarbeitung: 0.8 Sekunden
(vorverarbeitet am 2026-06-08)
¤
*© Formatika GbR, Deutschland