/* SPDX-License-Identifier: GPL-2.0 */
/*
* strlen . S ( c ) 1995 David Mosberger ( davidm @ cs . arizona . edu )
*
* Finds length of a 0 - terminated string . Optimized for the
* Alpha architecture :
*
* - memory accessed as aligned quadwords only
* - uses bcmpge to compare 8 bytes in parallel
* - does binary search to find 0 byte in last
* quadword ( HAKMEM needed 12 instructions to
* do this instead of the 9 instructions that
* binary search needs ) .
*/
#include <linux/export.h>
.set noreorder
.set noat
.align 3
.globl strlen
.ent strlen
strlen:
ldq_u $1 , 0 ($16 ) # load first quadword ($16 may be misaligned)
lda $2 , -1 ($31 )
insqh $2 , $16 , $2
andnot $16 , 7 , $0
or $2 , $1 , $1
cmpbge $31 , $1 , $2 # $2 <- bitmask: bit i == 1 <==> i-th byte == 0
bne $2 , found
loop: ldq $1 , 8 ($0 )
addq $0 , 8 , $0 # addr += 8
nop # helps dual issue last two insns
cmpbge $31 , $1 , $2
beq $2 , loop
found: blbs $2 , done # make aligned case fast
negq $2 , $3
and $2 , $3 , $2
and $2 , 0 x0f, $1
addq $0 , 4 , $3
cmoveq $1 , $3 , $0
and $2 , 0 x33, $1
addq $0 , 2 , $3
cmoveq $1 , $3 , $0
and $2 , 0 x55, $1
addq $0 , 1 , $3
cmoveq $1 , $3 , $0
done: subq $0 , $16 , $0
ret $31 , ($26 )
.end strlen
EXPORT_SYMBOL(strlen)
Messung V0.5 in Prozent C=97 H=100 G=98
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-09-29)
¤
*© Formatika GbR, Deutschland