linux/arch/alpha/lib/strcat.S
<<
>>
Prefs
   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);
  56