1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * arch/alpha/lib/strcat.S
4  * Contributed by Richard Henderson (rth@tamu.edu)
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