uboot/tools/updater/ppcstring.S
<<
>>
Prefs
   1/*
   2 * String handling functions for PowerPC.
   3 *
   4 * Copyright (C) 1996 Paul Mackerras.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public License
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the License, or (at your option) any later version.
  10 */
  11#include <ppc_asm.tmpl>
  12#include <asm/errno.h>
  13
  14        .globl  strcpy
  15strcpy:
  16        addi    r5,r3,-1
  17        addi    r4,r4,-1
  181:      lbzu    r0,1(r4)
  19        cmpwi   0,r0,0
  20        stbu    r0,1(r5)
  21        bne     1b
  22        blr
  23
  24        .globl  strncpy
  25strncpy:
  26        cmpwi   0,r5,0
  27        beqlr
  28        mtctr   r5
  29        addi    r6,r3,-1
  30        addi    r4,r4,-1
  311:      lbzu    r0,1(r4)
  32        cmpwi   0,r0,0
  33        stbu    r0,1(r6)
  34        bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
  35        blr
  36
  37        .globl  strcat
  38strcat:
  39        addi    r5,r3,-1
  40        addi    r4,r4,-1
  411:      lbzu    r0,1(r5)
  42        cmpwi   0,r0,0
  43        bne     1b
  44        addi    r5,r5,-1
  451:      lbzu    r0,1(r4)
  46        cmpwi   0,r0,0
  47        stbu    r0,1(r5)
  48        bne     1b
  49        blr
  50
  51        .globl  strcmp
  52strcmp:
  53        addi    r5,r3,-1
  54        addi    r4,r4,-1
  551:      lbzu    r3,1(r5)
  56        cmpwi   1,r3,0
  57        lbzu    r0,1(r4)
  58        subf.   r3,r0,r3
  59        beqlr   1
  60        beq     1b
  61        blr
  62
  63        .globl  strlen
  64strlen:
  65        addi    r4,r3,-1
  661:      lbzu    r0,1(r4)
  67        cmpwi   0,r0,0
  68        bne     1b
  69        subf    r3,r3,r4
  70        blr
  71
  72        .globl  memset
  73memset:
  74        rlwimi  r4,r4,8,16,23
  75        rlwimi  r4,r4,16,0,15
  76        addi    r6,r3,-4
  77        cmplwi  0,r5,4
  78        blt     7f
  79        stwu    r4,4(r6)
  80        beqlr
  81        andi.   r0,r6,3
  82        add     r5,r0,r5
  83        subf    r6,r0,r6
  84        rlwinm  r0,r5,32-2,2,31
  85        mtctr   r0
  86        bdz     6f
  871:      stwu    r4,4(r6)
  88        bdnz    1b
  896:      andi.   r5,r5,3
  907:      cmpwi   0,r5,0
  91        beqlr
  92        mtctr   r5
  93        addi    r6,r6,3
  948:      stbu    r4,1(r6)
  95        bdnz    8b
  96        blr
  97
  98        .globl  bcopy
  99bcopy:
 100        mr      r6,r3
 101        mr      r3,r4
 102        mr      r4,r6
 103        b       memcpy
 104
 105        .globl  memmove
 106memmove:
 107        cmplw   0,r3,r4
 108        bgt     backwards_memcpy
 109        /* fall through */
 110
 111        .globl  memcpy
 112memcpy:
 113        rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
 114        addi    r6,r3,-4
 115        addi    r4,r4,-4
 116        beq     2f                      /* if less than 8 bytes to do */
 117        andi.   r0,r6,3                 /* get dest word aligned */
 118        mtctr   r7
 119        bne     5f
 1201:      lwz     r7,4(r4)
 121        lwzu    r8,8(r4)
 122        stw     r7,4(r6)
 123        stwu    r8,8(r6)
 124        bdnz    1b
 125        andi.   r5,r5,7
 1262:      cmplwi  0,r5,4
 127        blt     3f
 128        lwzu    r0,4(r4)
 129        addi    r5,r5,-4
 130        stwu    r0,4(r6)
 1313:      cmpwi   0,r5,0
 132        beqlr
 133        mtctr   r5
 134        addi    r4,r4,3
 135        addi    r6,r6,3
 1364:      lbzu    r0,1(r4)
 137        stbu    r0,1(r6)
 138        bdnz    4b
 139        blr
 1405:      subfic  r0,r0,4
 141        mtctr   r0
 1426:      lbz     r7,4(r4)
 143        addi    r4,r4,1
 144        stb     r7,4(r6)
 145        addi    r6,r6,1
 146        bdnz    6b
 147        subf    r5,r0,r5
 148        rlwinm. r7,r5,32-3,3,31
 149        beq     2b
 150        mtctr   r7
 151        b       1b
 152
 153        .globl  backwards_memcpy
 154backwards_memcpy:
 155        rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
 156        add     r6,r3,r5
 157        add     r4,r4,r5
 158        beq     2f
 159        andi.   r0,r6,3
 160        mtctr   r7
 161        bne     5f
 1621:      lwz     r7,-4(r4)
 163        lwzu    r8,-8(r4)
 164        stw     r7,-4(r6)
 165        stwu    r8,-8(r6)
 166        bdnz    1b
 167        andi.   r5,r5,7
 1682:      cmplwi  0,r5,4
 169        blt     3f
 170        lwzu    r0,-4(r4)
 171        subi    r5,r5,4
 172        stwu    r0,-4(r6)
 1733:      cmpwi   0,r5,0
 174        beqlr
 175        mtctr   r5
 1764:      lbzu    r0,-1(r4)
 177        stbu    r0,-1(r6)
 178        bdnz    4b
 179        blr
 1805:      mtctr   r0
 1816:      lbzu    r7,-1(r4)
 182        stbu    r7,-1(r6)
 183        bdnz    6b
 184        subf    r5,r0,r5
 185        rlwinm. r7,r5,32-3,3,31
 186        beq     2b
 187        mtctr   r7
 188        b       1b
 189
 190        .globl  memcmp
 191memcmp:
 192        cmpwi   0,r5,0
 193        ble-    2f
 194        mtctr   r5
 195        addi    r6,r3,-1
 196        addi    r4,r4,-1
 1971:      lbzu    r3,1(r6)
 198        lbzu    r0,1(r4)
 199        subf.   r3,r0,r3
 200        bdnzt   2,1b
 201        blr
 2022:      li      r3,0
 203        blr
 204
 205        .global memchr
 206memchr:
 207        cmpwi   0,r5,0
 208        ble-    2f
 209        mtctr   r5
 210        addi    r3,r3,-1
 2111:      lbzu    r0,1(r3)
 212        cmpw    0,r0,r4
 213        bdnzf   2,1b
 214        beqlr
 2152:      li      r3,0
 216        blr
 217