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