1 /* SPDX-License-Identifier: GPL-2.0 */ << 2 /* 1 /* 3 * strlen.S (c) 1995 David Mosberger (davidm@c 2 * strlen.S (c) 1995 David Mosberger (davidm@cs.arizona.edu) 4 * 3 * 5 * Finds length of a 0-terminated string. Opt 4 * Finds length of a 0-terminated string. Optimized for the 6 * Alpha architecture: 5 * Alpha architecture: 7 * 6 * 8 * - memory accessed as aligned quadwords 7 * - memory accessed as aligned quadwords only 9 * - uses bcmpge to compare 8 bytes in pa 8 * - uses bcmpge to compare 8 bytes in parallel 10 * - does binary search to find 0 byte in 9 * - does binary search to find 0 byte in last 11 * quadword (HAKMEM needed 12 instructi 10 * quadword (HAKMEM needed 12 instructions to 12 * do this instead of the 9 instruction 11 * do this instead of the 9 instructions that 13 * binary search needs). 12 * binary search needs). 14 */ 13 */ 15 #include <linux/export.h> !! 14 #include <asm/export.h> 16 .set noreorder 15 .set noreorder 17 .set noat 16 .set noat 18 17 19 .align 3 18 .align 3 20 19 21 .globl strlen 20 .globl strlen 22 .ent strlen 21 .ent strlen 23 22 24 strlen: 23 strlen: 25 ldq_u $1, 0($16) # load first q 24 ldq_u $1, 0($16) # load first quadword ($16 may be misaligned) 26 lda $2, -1($31) 25 lda $2, -1($31) 27 insqh $2, $16, $2 26 insqh $2, $16, $2 28 andnot $16, 7, $0 27 andnot $16, 7, $0 29 or $2, $1, $1 28 or $2, $1, $1 30 cmpbge $31, $1, $2 # $2 <- bitma 29 cmpbge $31, $1, $2 # $2 <- bitmask: bit i == 1 <==> i-th byte == 0 31 bne $2, found 30 bne $2, found 32 31 33 loop: ldq $1, 8($0) 32 loop: ldq $1, 8($0) 34 addq $0, 8, $0 # addr += 8 33 addq $0, 8, $0 # addr += 8 35 nop # helps dual i 34 nop # helps dual issue last two insns 36 cmpbge $31, $1, $2 35 cmpbge $31, $1, $2 37 beq $2, loop 36 beq $2, loop 38 37 39 found: blbs $2, done # make aligned 38 found: blbs $2, done # make aligned case fast 40 negq $2, $3 39 negq $2, $3 41 and $2, $3, $2 40 and $2, $3, $2 42 41 43 and $2, 0x0f, $1 42 and $2, 0x0f, $1 44 addq $0, 4, $3 43 addq $0, 4, $3 45 cmoveq $1, $3, $0 44 cmoveq $1, $3, $0 46 45 47 and $2, 0x33, $1 46 and $2, 0x33, $1 48 addq $0, 2, $3 47 addq $0, 2, $3 49 cmoveq $1, $3, $0 48 cmoveq $1, $3, $0 50 49 51 and $2, 0x55, $1 50 and $2, 0x55, $1 52 addq $0, 1, $3 51 addq $0, 1, $3 53 cmoveq $1, $3, $0 52 cmoveq $1, $3, $0 54 53 55 done: subq $0, $16, $0 54 done: subq $0, $16, $0 56 ret $31, ($26) 55 ret $31, ($26) 57 56 58 .end strlen 57 .end strlen 59 EXPORT_SYMBOL(strlen) 58 EXPORT_SYMBOL(strlen)
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.