1/* Copyright (C) 2000-2022 Free Software Foundation, Inc. 2 This file is part of the GNU C Library. 3 4 The GNU C Library is free software; you can redistribute it and/or 5 modify it under the terms of the GNU Lesser General Public 6 License as published by the Free Software Foundation; either 7 version 2.1 of the License, or (at your option) any later version. 8 9 The GNU C Library is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 Lesser General Public License for more details. 13 14 You should have received a copy of the GNU Lesser General Public 15 License along with the GNU C Library. If not, see 16 <https://www.gnu.org/licenses/>. */ 17 18/* Append no more than COUNT characters from the null-terminated string SRC 19 to the null-terminated string DST. Always null-terminate the new DST. */ 20 21#include <sysdep.h> 22 23 .arch ev6 24 .set noreorder 25 .text 26 27ENTRY(strncat) 28 ldgp gp, 0(pv) 29#ifdef PROF 30 .set noat 31 lda AT, _mcount 32 jsr AT, (AT), _mcount 33 .set at 34#endif 35 .prologue 1 36 37 mov a0, v0 # set up return value 38 beq a2, $zerocount # U : 39 /* Find the end of the string. */ 40 ldq_u t0, 0(a0) # L : load first quadword (a0 may be misaligned) 41 lda t1, -1 # E : 42 43 insqh t1, v0, t1 # U : 44 andnot a0, 7, a0 # E : 45 nop # E : 46 or t1, t0, t0 # E : 47 48 nop # E : 49 nop # E : 50 cmpbge zero, t0, t1 # E : bits set iff byte == 0 51 bne t1, $found # U : 52 53$loop: ldq t0, 8(a0) # L : 54 addq a0, 8, a0 # E : 55 cmpbge zero, t0, t1 # E : 56 beq t1, $loop # U : 57 58$found: cttz t1, t2 # U0 : 59 addq a0, t2, a0 # E : 60 jsr t9, __stxncpy # L0 : Now do the append. 61 62 /* Worry about the null termination. */ 63 64 cttz t10, t2 # U0: byte offset of end-of-count. 65 bic a0, 7, a0 # E : word align the last write address. 66 zapnot t0, t8, t1 # U : was last byte a null? 67 nop # E : 68 69 bne t1, 0f # U : 70 nop # E : 71 nop # E : 72 ret # L0 : 73 740: addq t2, a0, a0 # E : address of end-of-count 75 stb zero, 1(a0) # L : 76 nop # E : 77 ret # L0 : 78 79$zerocount: 80 nop # E : 81 nop # E : 82 nop # E : 83 ret # L0 : 84 85 END(strncat) 86