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