linux-bk/arch/ppc64/boot/string.S
<<
>>
Prefs
   1/*
   2 * Copyright (C) Paul Mackerras 1997.
   3 *
   4 * This program is free software; you can redistribute it and/or
   5 * modify it under the terms of the GNU General Public License
   6 * as published by the Free Software Foundation; either version
   7 * 2 of the License, or (at your option) any later version.
   8 *
   9 * NOTE: this code runs in 32 bit mode and is packaged as ELF32.
  10 */
  11
  12#include <asm/ppc_asm.h>
  13
  14        .text
  15        .globl  strcpy
  16strcpy:
  17        addi    r5,r3,-1
  18        addi    r4,r4,-1
  191:      lbzu    r0,1(r4)
  20        cmpwi   0,r0,0
  21        stbu    r0,1(r5)
  22        bne     1b
  23        blr
  24
  25        .globl  strncpy
  26strncpy:
  27        cmpwi   0,r5,0
  28        beqlr
  29        mtctr   r5
  30        addi    r6,r3,-1
  31        addi    r4,r4,-1
  321:      lbzu    r0,1(r4)
  33        cmpwi   0,r0,0
  34        stbu    r0,1(r6)
  35        bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
  36        blr
  37
  38        .globl  strcat
  39strcat:
  40        addi    r5,r3,-1
  41        addi    r4,r4,-1
  421:      lbzu    r0,1(r5)
  43        cmpwi   0,r0,0
  44        bne     1b
  45        addi    r5,r5,-1
  461:      lbzu    r0,1(r4)
  47        cmpwi   0,r0,0
  48        stbu    r0,1(r5)
  49        bne     1b
  50        blr
  51
  52        .globl  strcmp
  53strcmp:
  54        addi    r5,r3,-1
  55        addi    r4,r4,-1
  561:      lbzu    r3,1(r5)
  57        cmpwi   1,r3,0
  58        lbzu    r0,1(r4)
  59        subf.   r3,r0,r3
  60        beqlr   1
  61        beq     1b
  62        blr
  63
  64        .globl  strlen
  65strlen:
  66        addi    r4,r3,-1
  671:      lbzu    r0,1(r4)
  68        cmpwi   0,r0,0
  69        bne     1b
  70        subf    r3,r3,r4
  71        blr
  72
  73        .globl  memset
  74memset:
  75        rlwimi  r4,r4,8,16,23
  76        rlwimi  r4,r4,16,0,15
  77        addi    r6,r3,-4
  78        cmplwi  0,r5,4
  79        blt     7f
  80        stwu    r4,4(r6)
  81        beqlr
  82        andi.   r0,r6,3
  83        add     r5,r0,r5
  84        subf    r6,r0,r6
  85        rlwinm  r0,r5,32-2,2,31
  86        mtctr   r0
  87        bdz     6f
  881:      stwu    r4,4(r6)
  89        bdnz    1b
  906:      andi.   r5,r5,3
  917:      cmpwi   0,r5,0
  92        beqlr
  93        mtctr   r5
  94        addi    r6,r6,3
  958:      stbu    r4,1(r6)
  96        bdnz    8b
  97        blr
  98
  99        .globl  bcopy
 100bcopy:
 101        mr      r6,r3
 102        mr      r3,r4
 103        mr      r4,r6
 104        b       memcpy
 105
 106        .globl  memmove
 107memmove:
 108        cmplw   0,r3,r4
 109        bgt     backwards_memcpy
 110        /* fall through */
 111
 112        .globl  memcpy
 113memcpy:
 114        rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
 115        addi    r6,r3,-4
 116        addi    r4,r4,-4
 117        beq     2f                      /* if less than 8 bytes to do */
 118        andi.   r0,r6,3                 /* get dest word aligned */
 119        mtctr   r7
 120        bne     5f
 1211:      lwz     r7,4(r4)
 122        lwzu    r8,8(r4)
 123        stw     r7,4(r6)
 124        stwu    r8,8(r6)
 125        bdnz    1b
 126        andi.   r5,r5,7
 1272:      cmplwi  0,r5,4
 128        blt     3f
 129        lwzu    r0,4(r4)
 130        addi    r5,r5,-4
 131        stwu    r0,4(r6)
 1323:      cmpwi   0,r5,0
 133        beqlr
 134        mtctr   r5
 135        addi    r4,r4,3
 136        addi    r6,r6,3
 1374:      lbzu    r0,1(r4)
 138        stbu    r0,1(r6)
 139        bdnz    4b
 140        blr
 1415:      subfic  r0,r0,4
 142        mtctr   r0
 1436:      lbz     r7,4(r4)
 144        addi    r4,r4,1
 145        stb     r7,4(r6)
 146        addi    r6,r6,1
 147        bdnz    6b
 148        subf    r5,r0,r5
 149        rlwinm. r7,r5,32-3,3,31
 150        beq     2b
 151        mtctr   r7
 152        b       1b
 153
 154        .globl  backwards_memcpy
 155backwards_memcpy:
 156        rlwinm. r7,r5,32-3,3,31         /* r0 = r5 >> 3 */
 157        add     r6,r3,r5
 158        add     r4,r4,r5
 159        beq     2f
 160        andi.   r0,r6,3
 161        mtctr   r7
 162        bne     5f
 1631:      lwz     r7,-4(r4)
 164        lwzu    r8,-8(r4)
 165        stw     r7,-4(r6)
 166        stwu    r8,-8(r6)
 167        bdnz    1b
 168        andi.   r5,r5,7
 1692:      cmplwi  0,r5,4
 170        blt     3f
 171        lwzu    r0,-4(r4)
 172        subi    r5,r5,4
 173        stwu    r0,-4(r6)
 1743:      cmpwi   0,r5,0
 175        beqlr
 176        mtctr   r5
 1774:      lbzu    r0,-1(r4)
 178        stbu    r0,-1(r6)
 179        bdnz    4b
 180        blr
 1815:      mtctr   r0
 1826:      lbzu    r7,-1(r4)
 183        stbu    r7,-1(r6)
 184        bdnz    6b
 185        subf    r5,r0,r5
 186        rlwinm. r7,r5,32-3,3,31
 187        beq     2b
 188        mtctr   r7
 189        b       1b
 190
 191        .globl  memcmp
 192memcmp:
 193        cmpwi   0,r5,0
 194        blelr
 195        mtctr   r5
 196        addi    r6,r3,-1
 197        addi    r4,r4,-1
 1981:      lbzu    r3,1(r6)
 199        lbzu    r0,1(r4)
 200        subf.   r3,r0,r3
 201        bdnzt   2,1b
 202        blr
 203
 204
 205/*
 206 * Flush the dcache and invalidate the icache for a range of addresses.
 207 *
 208 * flush_cache(addr, len)
 209 */
 210        .global flush_cache
 211flush_cache:
 212        addi    4,4,0x1f        /* len = (len + 0x1f) / 0x20 */
 213        rlwinm. 4,4,27,5,31
 214        mtctr   4
 215        beqlr
 2161:      dcbf    0,3
 217        icbi    0,3
 218        addi    3,3,0x20
 219        bdnz    1b
 220        sync
 221        isync
 222        blr
 223
 224
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.