1/* Copy SRC to DEST returning the address of the terminating '\0' in DEST. 2 For SPARC v7. 3 Copyright (C) 1996-2021 Free Software Foundation, Inc. 4 This file is part of the GNU C Library. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <https://www.gnu.org/licenses/>. */ 19 20#include <sysdep.h> 21 22 /* Normally, this uses ((xword - 0x01010101) & 0x80808080) test 23 to find out if any byte in xword could be zero. This is fast, but 24 also gives false alarm for any byte in range 0x81-0xff. It does 25 not matter for correctness, as if this test tells us there could 26 be some zero byte, we check it byte by byte, but if bytes with 27 high bits set are common in the strings, then this will give poor 28 performance. You can #define EIGHTBIT_NOT_RARE and the algorithm 29 will use one tick slower, but more precise test 30 ((xword - 0x01010101) & (~xword) & 0x80808080), 31 which does not give any false alarms (but if some bits are set, 32 one cannot assume from it which bytes are zero and which are not). 33 It is yet to be measured, what is the correct default for glibc 34 in these days for an average user. 35 */ 36 37 .text 38 .align 4 39 40ENTRY(__stpcpy) 41 andcc %o1, 3, %g0 42 be 20f 43 sethi %hi(0x80808080), %o4 44 45 ldub [%o1], %o5 46 stb %o5, [%o0] 47 cmp %o5, 0 48 add %o0, 1, %o0 49 be 1f 50 add %o1, 1, %o1 51 andcc %o1, 3, %g0 52 be 4f 53 or %o4, %lo(0x80808080), %o3 54 ldub [%o1], %o5 55 stb %o5, [%o0] 56 cmp %o5, 0 57 add %o0, 1, %o0 58 be 1f 59 add %o1, 1, %o1 60 andcc %o1, 3, %g0 61 be 5f 62 sethi %hi(0x01010101), %o4 63 ldub [%o1], %o5 64 stb %o5, [%o0] 65 cmp %o5, 0 66 add %o0, 1, %o0 67 be 1f 68 add %o1, 1, %o1 69 b 6f 70 or %o4, %lo(0x01010101), %o2 711: retl 72 add %o0, -1, %o0 73 7420: or %o4, %lo(0x80808080), %o3 754: sethi %hi(0x01010101), %o4 765: or %o4, %lo(0x01010101), %o2 776: andcc %o0, 3, %g0 78 bne 16f 79 sub %g0, 4, %g1 80 8111: add %g1, 4, %g1 82 ld [%o1 + %g1], %o5 83 sub %o5, %o2, %o4 84#ifdef EIGHTBIT_NOT_RARE 85 andn %o4, %o5, %o4 86#endif 87 andcc %o4, %o3, %g0 88 be,a 11b 89 st %o5, [%o0 + %g1] 90 91 /* Check every byte. */ 92 srl %o5, 24, %g5 93 andcc %g5, 0xff, %g0 94 be 14f 95 srl %o5, 16, %g5 96 andcc %g5, 0xff, %g0 97 be 13f 98 srl %o5, 8, %g5 99 andcc %g5, 0xff, %g0 100 be 12f 101 andcc %o5, 0xff, %g0 102 bne 11b 103 st %o5, [%o0 + %g1] 104 add %o0, %g1, %o0 105 retl 106 add %o0, 3, %o0 10712: srl %o5, 16, %o5 108 sth %o5, [%o0 + %g1] 109 add %g1, 2, %g1 110 stb %g0, [%o0 + %g1] 111 retl 112 add %o0, %g1, %o0 11313: srl %o5, 16, %o5 114 sth %o5, [%o0 + %g1] 115 add %g1, 1, %g1 116 retl 117 add %o0, %g1, %o0 11814: stb %g0, [%o0 + %g1] 119 retl 120 add %o0, %g1, %o0 121 12215: srl %o5, 24, %o4 123 srl %o5, 16, %g1 124 stb %o4, [%o0] 125 srl %o5, 8, %g4 126 stb %g1, [%o0 + 1] 127 stb %g4, [%o0 + 2] 128 stb %o5, [%o0 + 3] 129 add %o0, 4, %o0 13016: ld [%o1], %o5 131 sub %o5, %o2, %o4 132 andcc %o4, %o3, %g0 133 be 15b 134 add %o1, 4, %o1 135 136 /* Check every byte. */ 137 srl %o5, 24, %g5 138 andcc %g5, 0xff, %g4 139 be 19f 140 stb %g4, [%o0] 141 srl %o5, 16, %g5 142 andcc %g5, 0xff, %g4 143 be 18f 144 stb %g4, [%o0 + 1] 145 srl %o5, 8, %g5 146 andcc %g5, 0xff, %g4 147 be 17f 148 stb %g4, [%o0 + 2] 149 andcc %o5, 0xff, %g4 150 stb %g4, [%o0 + 3] 151 bne 16b 152 add %o0, 4, %o0 153 retl 154 sub %o0, 1, %o0 15517: retl 156 add %o0, 2, %o0 15718: retl 158 add %o0, 1, %o0 15919: retl 160 nop 161END(__stpcpy) 162 163weak_alias (__stpcpy, stpcpy) 164libc_hidden_def (__stpcpy) 165libc_hidden_builtin_def (stpcpy) 166