Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/arch/alpha/lib/strcat.S
26424 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
/*
3
* arch/alpha/lib/strcat.S
4
* Contributed by Richard Henderson ([email protected])
5
*
6
* Append a null-terminated string from SRC to DST.
7
*/
8
#include <linux/export.h>
9
10
.text
11
12
.align 3
13
.globl strcat
14
.ent strcat
15
strcat:
16
.frame $30, 0, $26
17
.prologue 0
18
19
mov $16, $0 # set up return value
20
21
/* Find the end of the string. */
22
23
ldq_u $1, 0($16) # load first quadword (a0 may be misaligned)
24
lda $2, -1
25
insqh $2, $16, $2
26
andnot $16, 7, $16
27
or $2, $1, $1
28
cmpbge $31, $1, $2 # bits set iff byte == 0
29
bne $2, $found
30
31
$loop: ldq $1, 8($16)
32
addq $16, 8, $16
33
cmpbge $31, $1, $2
34
beq $2, $loop
35
36
$found: negq $2, $3 # clear all but least set bit
37
and $2, $3, $2
38
39
and $2, 0xf0, $3 # binary search for that set bit
40
and $2, 0xcc, $4
41
and $2, 0xaa, $5
42
cmovne $3, 4, $3
43
cmovne $4, 2, $4
44
cmovne $5, 1, $5
45
addq $3, $4, $3
46
addq $16, $5, $16
47
addq $16, $3, $16
48
49
/* Now do the append. */
50
51
mov $26, $23
52
br __stxcpy
53
54
.end strcat
55
EXPORT_SYMBOL(strcat);
56
57