xref: /openbmc/linux/arch/alpha/lib/strcat.S (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds/*
31da177e4SLinus Torvalds * arch/alpha/lib/strcat.S
41da177e4SLinus Torvalds * Contributed by Richard Henderson (rth@tamu.edu)
51da177e4SLinus Torvalds *
61da177e4SLinus Torvalds * Append a null-terminated string from SRC to DST.
71da177e4SLinus Torvalds */
8*f3c78e94SMasahiro Yamada#include <linux/export.h>
91da177e4SLinus Torvalds
101da177e4SLinus Torvalds	.text
111da177e4SLinus Torvalds
121da177e4SLinus Torvalds	.align 3
131da177e4SLinus Torvalds	.globl strcat
141da177e4SLinus Torvalds	.ent strcat
151da177e4SLinus Torvaldsstrcat:
161da177e4SLinus Torvalds	.frame $30, 0, $26
171da177e4SLinus Torvalds	.prologue 0
181da177e4SLinus Torvalds
191da177e4SLinus Torvalds	mov	$16, $0		# set up return value
201da177e4SLinus Torvalds
211da177e4SLinus Torvalds	/* Find the end of the string.  */
221da177e4SLinus Torvalds
231da177e4SLinus Torvalds	ldq_u   $1, 0($16)	# load first quadword (a0 may be misaligned)
241da177e4SLinus Torvalds	lda     $2, -1
251da177e4SLinus Torvalds	insqh   $2, $16, $2
261da177e4SLinus Torvalds	andnot  $16, 7, $16
271da177e4SLinus Torvalds	or      $2, $1, $1
281da177e4SLinus Torvalds	cmpbge  $31, $1, $2	# bits set iff byte == 0
291da177e4SLinus Torvalds	bne     $2, $found
301da177e4SLinus Torvalds
311da177e4SLinus Torvalds$loop:	ldq     $1, 8($16)
321da177e4SLinus Torvalds	addq    $16, 8, $16
331da177e4SLinus Torvalds	cmpbge  $31, $1, $2
341da177e4SLinus Torvalds	beq     $2, $loop
351da177e4SLinus Torvalds
361da177e4SLinus Torvalds$found:	negq    $2, $3		# clear all but least set bit
371da177e4SLinus Torvalds	and     $2, $3, $2
381da177e4SLinus Torvalds
391da177e4SLinus Torvalds	and     $2, 0xf0, $3	# binary search for that set bit
401da177e4SLinus Torvalds	and	$2, 0xcc, $4
411da177e4SLinus Torvalds	and	$2, 0xaa, $5
421da177e4SLinus Torvalds	cmovne	$3, 4, $3
431da177e4SLinus Torvalds	cmovne	$4, 2, $4
441da177e4SLinus Torvalds	cmovne	$5, 1, $5
451da177e4SLinus Torvalds	addq	$3, $4, $3
461da177e4SLinus Torvalds	addq	$16, $5, $16
471da177e4SLinus Torvalds	addq	$16, $3, $16
481da177e4SLinus Torvalds
491da177e4SLinus Torvalds	/* Now do the append.  */
501da177e4SLinus Torvalds
511da177e4SLinus Torvalds	mov	$26, $23
521da177e4SLinus Torvalds	br	__stxcpy
531da177e4SLinus Torvalds
541da177e4SLinus Torvalds	.end strcat
5500fc0e0dSAl ViroEXPORT_SYMBOL(strcat);
56