1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  | /* SPDX-License-Identifier: GPL-2.0-or-later */ 
 |  /* 
 |   * String handling functions for PowerPC. 
 |   * 
 |   * Copyright (C) 1996 Paul Mackerras. 
 |   */ 
 |  #include <asm/ppc_asm.h> 
 |  #include <asm/export.h> 
 |  #include <asm/cache.h> 
 |    
 |      .text 
 |       
 |  /* This clears out any unused part of the destination buffer, 
 |     just as the libc version does.  -- paulus */ 
 |  _GLOBAL(strncpy) 
 |      PPC_LCMPI 0,r5,0 
 |      beqlr 
 |      mtctr    r5 
 |      addi    r6,r3,-1 
 |      addi    r4,r4,-1 
 |      .balign IFETCH_ALIGN_BYTES 
 |  1:    lbzu    r0,1(r4) 
 |      cmpwi    0,r0,0 
 |      stbu    r0,1(r6) 
 |      bdnzf    2,1b        /* dec ctr, branch if ctr != 0 && !cr0.eq */ 
 |      bnelr            /* if we didn't hit a null char, we're done */ 
 |      mfctr    r5 
 |      PPC_LCMPI 0,r5,0    /* any space left in destination buffer? */ 
 |      beqlr            /* we know r0 == 0 here */ 
 |  2:    stbu    r0,1(r6)    /* clear it out if so */ 
 |      bdnz    2b 
 |      blr 
 |  EXPORT_SYMBOL(strncpy) 
 |    
 |  _GLOBAL(strncmp) 
 |      PPC_LCMPI 0,r5,0 
 |      beq-    2f 
 |      mtctr    r5 
 |      addi    r5,r3,-1 
 |      addi    r4,r4,-1 
 |      .balign IFETCH_ALIGN_BYTES 
 |  1:    lbzu    r3,1(r5) 
 |      cmpwi    1,r3,0 
 |      lbzu    r0,1(r4) 
 |      subf.    r3,r0,r3 
 |      beqlr    1 
 |      bdnzt    eq,1b 
 |      blr 
 |  2:    li    r3,0 
 |      blr 
 |  EXPORT_SYMBOL(strncmp) 
 |    
 |  _GLOBAL(memchr) 
 |      PPC_LCMPI 0,r5,0 
 |      beq-    2f 
 |      mtctr    r5 
 |      addi    r3,r3,-1 
 |      .balign IFETCH_ALIGN_BYTES 
 |  1:    lbzu    r0,1(r3) 
 |      cmpw    0,r0,r4 
 |      bdnzf    2,1b 
 |      beqlr 
 |  2:    li    r3,0 
 |      blr 
 |  EXPORT_SYMBOL(memchr) 
 |  
  |