| 1 | /* SPDX-License-Identifier: GPL-2.0-or-later */
|
| 2 | /*
|
| 3 | * Copyright (C) Paul Mackerras 1997.
|
| 4 | *
|
| 5 | * NOTE: this code runs in 32 bit mode and is packaged as ELF32.
|
| 6 | */
|
| 7 |
|
| 8 | |
| 9 |
|
| 10 | .text
|
| 11 | .globl strcpy
|
| 12 | strcpy:
|
| 13 | addi r5,r3,-1
|
| 14 | addi r4,r4,-1
|
| 15 | 1: lbzu r0,1(r4)
|
| 16 | cmpwi 0,r0,0
|
| 17 | stbu r0,1(r5)
|
| 18 | bne 1b
|
| 19 | blr
|
| 20 |
|
| 21 | .globl strcat
|
| 22 | strcat:
|
| 23 | addi r5,r3,-1
|
| 24 | addi r4,r4,-1
|
| 25 | 1: lbzu r0,1(r5)
|
| 26 | cmpwi 0,r0,0
|
| 27 | bne 1b
|
| 28 | addi r5,r5,-1
|
| 29 | 1: lbzu r0,1(r4)
|
| 30 | cmpwi 0,r0,0
|
| 31 | stbu r0,1(r5)
|
| 32 | bne 1b
|
| 33 | blr
|
| 34 |
|
| 35 | .globl strchr
|
| 36 | strchr:
|
| 37 | addi r3,r3,-1
|
| 38 | 1: lbzu r0,1(r3)
|
| 39 | cmpw 0,r0,r4
|
| 40 | beqlr
|
| 41 | cmpwi 0,r0,0
|
| 42 | bne 1b
|
| 43 | li r3,0
|
| 44 | blr
|
| 45 |
|
| 46 | .globl strcmp
|
| 47 | strcmp:
|
| 48 | addi r5,r3,-1
|
| 49 | addi r4,r4,-1
|
| 50 | 1: lbzu r3,1(r5)
|
| 51 | cmpwi 1,r3,0
|
| 52 | lbzu r0,1(r4)
|
| 53 | subf. r3,r0,r3
|
| 54 | beqlr 1
|
| 55 | beq 1b
|
| 56 | blr
|
| 57 |
|
| 58 | .globl strncmp
|
| 59 | strncmp:
|
| 60 | mtctr r5
|
| 61 | addi r5,r3,-1
|
| 62 | addi r4,r4,-1
|
| 63 | 1: lbzu r3,1(r5)
|
| 64 | cmpwi 1,r3,0
|
| 65 | lbzu r0,1(r4)
|
| 66 | subf. r3,r0,r3
|
| 67 | beqlr 1
|
| 68 | bdnzt eq,1b
|
| 69 | blr
|
| 70 |
|
| 71 | .globl strlen
|
| 72 | strlen:
|
| 73 | addi r4,r3,-1
|
| 74 | 1: lbzu r0,1(r4)
|
| 75 | cmpwi 0,r0,0
|
| 76 | bne 1b
|
| 77 | subf r3,r3,r4
|
| 78 | blr
|
| 79 |
|
| 80 | .globl memset
|
| 81 | memset:
|
| 82 | rlwimi r4,r4,8,16,23
|
| 83 | rlwimi r4,r4,16,0,15
|
| 84 | addi r6,r3,-4
|
| 85 | cmplwi 0,r5,4
|
| 86 | blt 7f
|
| 87 | stwu r4,4(r6)
|
| 88 | beqlr
|
| 89 | andi. r0,r6,3
|
| 90 | add r5,r0,r5
|
| 91 | subf r6,r0,r6
|
| 92 | rlwinm r0,r5,32-2,2,31
|
| 93 | mtctr r0
|
| 94 | bdz 6f
|
| 95 | 1: stwu r4,4(r6)
|
| 96 | bdnz 1b
|
| 97 | 6: andi. r5,r5,3
|
| 98 | 7: cmpwi 0,r5,0
|
| 99 | beqlr
|
| 100 | mtctr r5
|
| 101 | addi r6,r6,3
|
| 102 | 8: stbu r4,1(r6)
|
| 103 | bdnz 8b
|
| 104 | blr
|
| 105 |
|
| 106 | .globl memmove
|
| 107 | memmove:
|
| 108 | cmplw 0,r3,r4
|
| 109 | bgt backwards_memcpy
|
| 110 | /* fall through */
|
| 111 |
|
| 112 | .globl memcpy
|
| 113 | memcpy:
|
| 114 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
|
| 115 | addi r6,r3,-4
|
| 116 | addi r4,r4,-4
|
| 117 | beq 3f /* if less than 8 bytes to do */
|
| 118 | andi. r0,r6,3 /* get dest word aligned */
|
| 119 | mtctr r7
|
| 120 | bne 5f
|
| 121 | andi. r0,r4,3 /* check src word aligned too */
|
| 122 | bne 3f
|
| 123 | 1: lwz r7,4(r4)
|
| 124 | lwzu r8,8(r4)
|
| 125 | stw r7,4(r6)
|
| 126 | stwu r8,8(r6)
|
| 127 | bdnz 1b
|
| 128 | andi. r5,r5,7
|
| 129 | 2: cmplwi 0,r5,4
|
| 130 | blt 3f
|
| 131 | lwzu r0,4(r4)
|
| 132 | addi r5,r5,-4
|
| 133 | stwu r0,4(r6)
|
| 134 | 3: cmpwi 0,r5,0
|
| 135 | beqlr
|
| 136 | mtctr r5
|
| 137 | addi r4,r4,3
|
| 138 | addi r6,r6,3
|
| 139 | 4: lbzu r0,1(r4)
|
| 140 | stbu r0,1(r6)
|
| 141 | bdnz 4b
|
| 142 | blr
|
| 143 | 5: subfic r0,r0,4
|
| 144 | cmpw cr1,r0,r5
|
| 145 | add r7,r0,r4
|
| 146 | andi. r7,r7,3 /* will source be word-aligned too? */
|
| 147 | ble cr1,3b
|
| 148 | bne 3b /* do byte-by-byte if not */
|
| 149 | mtctr r0
|
| 150 | 6: lbz r7,4(r4)
|
| 151 | addi r4,r4,1
|
| 152 | stb r7,4(r6)
|
| 153 | addi r6,r6,1
|
| 154 | bdnz 6b
|
| 155 | subf r5,r0,r5
|
| 156 | rlwinm. r7,r5,32-3,3,31
|
| 157 | beq 2b
|
| 158 | mtctr r7
|
| 159 | b 1b
|
| 160 |
|
| 161 | .globl backwards_memcpy
|
| 162 | backwards_memcpy:
|
| 163 | rlwinm. r7,r5,32-3,3,31 /* r7 = r5 >> 3 */
|
| 164 | add r6,r3,r5
|
| 165 | add r4,r4,r5
|
| 166 | beq 3f
|
| 167 | andi. r0,r6,3
|
| 168 | mtctr r7
|
| 169 | bne 5f
|
| 170 | andi. r0,r4,3
|
| 171 | bne 3f
|
| 172 | 1: lwz r7,-4(r4)
|
| 173 | lwzu r8,-8(r4)
|
| 174 | stw r7,-4(r6)
|
| 175 | stwu r8,-8(r6)
|
| 176 | bdnz 1b
|
| 177 | andi. r5,r5,7
|
| 178 | 2: cmplwi 0,r5,4
|
| 179 | blt 3f
|
| 180 | lwzu r0,-4(r4)
|
| 181 | subi r5,r5,4
|
| 182 | stwu r0,-4(r6)
|
| 183 | 3: cmpwi 0,r5,0
|
| 184 | beqlr
|
| 185 | mtctr r5
|
| 186 | 4: lbzu r0,-1(r4)
|
| 187 | stbu r0,-1(r6)
|
| 188 | bdnz 4b
|
| 189 | blr
|
| 190 | 5: cmpw cr1,r0,r5
|
| 191 | subf r7,r0,r4
|
| 192 | andi. r7,r7,3
|
| 193 | ble cr1,3b
|
| 194 | bne 3b
|
| 195 | mtctr r0
|
| 196 | 6: lbzu r7,-1(r4)
|
| 197 | stbu r7,-1(r6)
|
| 198 | bdnz 6b
|
| 199 | subf r5,r0,r5
|
| 200 | rlwinm. r7,r5,32-3,3,31
|
| 201 | beq 2b
|
| 202 | mtctr r7
|
| 203 | b 1b
|
| 204 |
|
| 205 | .globl memchr
|
| 206 | memchr:
|
| 207 | cmpwi 0,r5,0
|
| 208 | blelr
|
| 209 | mtctr r5
|
| 210 | addi r3,r3,-1
|
| 211 | 1: lbzu r0,1(r3)
|
| 212 | cmpw r0,r4
|
| 213 | beqlr
|
| 214 | bdnz 1b
|
| 215 | li r3,0
|
| 216 | blr
|
| 217 |
|
| 218 | .globl memcmp
|
| 219 | memcmp:
|
| 220 | cmpwi 0,r5,0
|
| 221 | ble 2f
|
| 222 | mtctr r5
|
| 223 | addi r6,r3,-1
|
| 224 | addi r4,r4,-1
|
| 225 | 1: lbzu r3,1(r6)
|
| 226 | lbzu r0,1(r4)
|
| 227 | subf. r3,r0,r3
|
| 228 | bdnzt 2,1b
|
| 229 | blr
|
| 230 | 2: li r3,0
|
| 231 | blr
|
| 232 |
|
| 233 |
|
| 234 | /*
|
| 235 | * Flush the dcache and invalidate the icache for a range of addresses.
|
| 236 | *
|
| 237 | * flush_cache(addr, len)
|
| 238 | */
|
| 239 | .global flush_cache
|
| 240 | flush_cache:
|
| 241 | addi 4,4,0x1f /* len = (len + 0x1f) / 0x20 */
|
| 242 | rlwinm. 4,4,27,5,31
|
| 243 | mtctr 4
|
| 244 | beqlr
|
| 245 | 1: dcbf 0,3
|
| 246 | icbi 0,3
|
| 247 | addi 3,3,0x20
|
| 248 | bdnz 1b
|
| 249 | sync
|
| 250 | isync
|
| 251 | blr
|
| 252 |
|