cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

strcat.S (1032B)


      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 <asm/export.h>
      9
     10	.text
     11
     12	.align 3
     13	.globl strcat
     14	.ent strcat
     15strcat:
     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
     55EXPORT_SYMBOL(strcat);