linux/arch/powerpc/lib/string.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 <asm/processor.h>
  12#include <asm/errno.h>
  13#include <asm/ppc_asm.h>
  14#include <asm/export.h>
  15
  16        .text
  17        
  18/* This clears out any unused part of the destination buffer,
  19   just as the libc version does.  -- paulus */
  20_GLOBAL(strncpy)
  21        PPC_LCMPI 0,r5,0
  22        beqlr
  23        mtctr   r5
  24        addi    r6,r3,-1
  25        addi    r4,r4,-1
  26        .balign 16
  271:      lbzu    r0,1(r4)
  28        cmpwi   0,r0,0
  29        stbu    r0,1(r6)
  30        bdnzf   2,1b            /* dec ctr, branch if ctr != 0 && !cr0.eq */
  31        bnelr                   /* if we didn't hit a null char, we're done */
  32        mfctr   r5
  33        PPC_LCMPI 0,r5,0        /* any space left in destination buffer? */
  34        beqlr                   /* we know r0 == 0 here */
  352:      stbu    r0,1(r6)        /* clear it out if so */
  36        bdnz    2b
  37        blr
  38EXPORT_SYMBOL(strncpy)
  39
  40_GLOBAL(strncmp)
  41        PPC_LCMPI 0,r5,0
  42        beq-    2f
  43        mtctr   r5
  44        addi    r5,r3,-1
  45        addi    r4,r4,-1
  46        .balign 16
  471:      lbzu    r3,1(r5)
  48        cmpwi   1,r3,0
  49        lbzu    r0,1(r4)
  50        subf.   r3,r0,r3
  51        beqlr   1
  52        bdnzt   eq,1b
  53        blr
  542:      li      r3,0
  55        blr
  56EXPORT_SYMBOL(strncmp)
  57
  58#ifdef CONFIG_PPC32
  59_GLOBAL(memcmp)
  60        PPC_LCMPI 0,r5,0
  61        beq-    2f
  62        mtctr   r5
  63        addi    r6,r3,-1
  64        addi    r4,r4,-1
  651:      lbzu    r3,1(r6)
  66        lbzu    r0,1(r4)
  67        subf.   r3,r0,r3
  68        bdnzt   2,1b
  69        blr
  702:      li      r3,0
  71        blr
  72EXPORT_SYMBOL(memcmp)
  73#endif
  74
  75_GLOBAL(memchr)
  76        PPC_LCMPI 0,r5,0
  77        beq-    2f
  78        mtctr   r5
  79        addi    r3,r3,-1
  80        .balign 16
  811:      lbzu    r0,1(r3)
  82        cmpw    0,r0,r4
  83        bdnzf   2,1b
  84        beqlr
  852:      li      r3,0
  86        blr
  87EXPORT_SYMBOL(memchr)
  88
  89#ifdef CONFIG_PPC32
  90_GLOBAL(__clear_user)
  91        addi    r6,r3,-4
  92        li      r3,0
  93        li      r5,0
  94        cmplwi  0,r4,4
  95        blt     7f
  96        /* clear a single word */
  9711:     stwu    r5,4(r6)
  98        beqlr
  99        /* clear word sized chunks */
 100        andi.   r0,r6,3
 101        add     r4,r0,r4
 102        subf    r6,r0,r6
 103        srwi    r0,r4,2
 104        andi.   r4,r4,3
 105        mtctr   r0
 106        bdz     7f
 1071:      stwu    r5,4(r6)
 108        bdnz    1b
 109        /* clear byte sized chunks */
 1107:      cmpwi   0,r4,0
 111        beqlr
 112        mtctr   r4
 113        addi    r6,r6,3
 1148:      stbu    r5,1(r6)
 115        bdnz    8b
 116        blr
 11790:     mr      r3,r4
 118        blr
 11991:     mfctr   r3
 120        slwi    r3,r3,2
 121        add     r3,r3,r4
 122        blr
 12392:     mfctr   r3
 124        blr
 125
 126        EX_TABLE(11b, 90b)
 127        EX_TABLE(1b, 91b)
 128        EX_TABLE(8b, 92b)
 129
 130EXPORT_SYMBOL(__clear_user)
 131#endif
 132