blob: d13e0760351955b16be34cb5ae2e29484c35c17d [file] [log] [blame]
Paul Mackerras14cf11a2005-09-26 16:04:21 +10001/*
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 */
Paul Mackerras14cf11a2005-09-26 16:04:21 +100011#include <asm/processor.h>
12#include <asm/errno.h>
13#include <asm/ppc_asm.h>
Al Viro9445aa12016-01-13 23:33:46 -050014#include <asm/export.h>
Paul Mackerras14cf11a2005-09-26 16:04:21 +100015
Paul Mackerras14cf11a2005-09-26 16:04:21 +100016 .section __ex_table,"a"
Michael Ellerman76bfdcf2008-07-17 17:17:52 +100017 PPC_LONG_ALIGN
Paul Mackerras14cf11a2005-09-26 16:04:21 +100018 .text
19
Paul Mackerras14cf11a2005-09-26 16:04:21 +100020/* This clears out any unused part of the destination buffer,
21 just as the libc version does. -- paulus */
22_GLOBAL(strncpy)
Andreas Schwabca5d0672010-05-18 08:15:21 +000023 PPC_LCMPI 0,r5,0
Paul Mackerras14cf11a2005-09-26 16:04:21 +100024 beqlr
25 mtctr r5
26 addi r6,r3,-1
27 addi r4,r4,-1
Anton Blanchard87a156f2016-05-26 08:39:55 +100028 .balign 16
Paul Mackerras14cf11a2005-09-26 16:04:21 +1000291: lbzu r0,1(r4)
30 cmpwi 0,r0,0
31 stbu r0,1(r6)
32 bdnzf 2,1b /* dec ctr, branch if ctr != 0 && !cr0.eq */
33 bnelr /* if we didn't hit a null char, we're done */
34 mfctr r5
Andreas Schwabca5d0672010-05-18 08:15:21 +000035 PPC_LCMPI 0,r5,0 /* any space left in destination buffer? */
Paul Mackerras14cf11a2005-09-26 16:04:21 +100036 beqlr /* we know r0 == 0 here */
372: stbu r0,1(r6) /* clear it out if so */
38 bdnz 2b
39 blr
Al Viro9445aa12016-01-13 23:33:46 -050040EXPORT_SYMBOL(strncpy)
Paul Mackerras14cf11a2005-09-26 16:04:21 +100041
Steven Rostedt01195362008-03-01 03:04:57 +110042_GLOBAL(strncmp)
Andreas Schwabca5d0672010-05-18 08:15:21 +000043 PPC_LCMPI 0,r5,0
44 beq- 2f
Steven Rostedt01195362008-03-01 03:04:57 +110045 mtctr r5
46 addi r5,r3,-1
47 addi r4,r4,-1
Anton Blanchard87a156f2016-05-26 08:39:55 +100048 .balign 16
Steven Rostedt01195362008-03-01 03:04:57 +1100491: lbzu r3,1(r5)
50 cmpwi 1,r3,0
51 lbzu r0,1(r4)
52 subf. r3,r0,r3
53 beqlr 1
54 bdnzt eq,1b
55 blr
Jeff Mahoney637a9902010-03-17 10:55:51 +0000562: li r3,0
57 blr
Al Viro9445aa12016-01-13 23:33:46 -050058EXPORT_SYMBOL(strncmp)
Steven Rostedt01195362008-03-01 03:04:57 +110059
Anton Blanchard15c2d452015-01-21 12:27:38 +110060#ifdef CONFIG_PPC32
Paul Mackerras14cf11a2005-09-26 16:04:21 +100061_GLOBAL(memcmp)
Andreas Schwabca5d0672010-05-18 08:15:21 +000062 PPC_LCMPI 0,r5,0
63 beq- 2f
Paul Mackerras14cf11a2005-09-26 16:04:21 +100064 mtctr r5
65 addi r6,r3,-1
66 addi r4,r4,-1
671: lbzu r3,1(r6)
68 lbzu r0,1(r4)
69 subf. r3,r0,r3
70 bdnzt 2,1b
71 blr
722: li r3,0
73 blr
Al Viro9445aa12016-01-13 23:33:46 -050074EXPORT_SYMBOL(memcmp)
Anton Blanchard15c2d452015-01-21 12:27:38 +110075#endif
Paul Mackerras14cf11a2005-09-26 16:04:21 +100076
77_GLOBAL(memchr)
Andreas Schwabca5d0672010-05-18 08:15:21 +000078 PPC_LCMPI 0,r5,0
79 beq- 2f
Paul Mackerras14cf11a2005-09-26 16:04:21 +100080 mtctr r5
81 addi r3,r3,-1
Anton Blanchard87a156f2016-05-26 08:39:55 +100082 .balign 16
Paul Mackerras14cf11a2005-09-26 16:04:21 +1000831: lbzu r0,1(r3)
84 cmpw 0,r0,r4
85 bdnzf 2,1b
86 beqlr
872: li r3,0
88 blr
Al Viro9445aa12016-01-13 23:33:46 -050089EXPORT_SYMBOL(memchr)
Paul Mackerras14cf11a2005-09-26 16:04:21 +100090
Anton Blanchard17968fb2012-05-27 19:54:03 +000091#ifdef CONFIG_PPC32
Paul Mackerras14cf11a2005-09-26 16:04:21 +100092_GLOBAL(__clear_user)
93 addi r6,r3,-4
94 li r3,0
95 li r5,0
96 cmplwi 0,r4,4
97 blt 7f
98 /* clear a single word */
9911: stwu r5,4(r6)
100 beqlr
101 /* clear word sized chunks */
102 andi. r0,r6,3
103 add r4,r0,r4
104 subf r6,r0,r6
105 srwi r0,r4,2
106 andi. r4,r4,3
107 mtctr r0
108 bdz 7f
1091: stwu r5,4(r6)
110 bdnz 1b
111 /* clear byte sized chunks */
1127: cmpwi 0,r4,0
113 beqlr
114 mtctr r4
115 addi r6,r6,3
1168: stbu r5,1(r6)
117 bdnz 8b
118 blr
11990: mr r3,r4
120 blr
12191: mfctr r3
122 slwi r3,r3,2
123 add r3,r3,r4
124 blr
12592: mfctr r3
126 blr
127
128 .section __ex_table,"a"
Michael Ellerman76bfdcf2008-07-17 17:17:52 +1000129 PPC_LONG 11b,90b
130 PPC_LONG 1b,91b
131 PPC_LONG 8b,92b
Paul Mackerras14cf11a2005-09-26 16:04:21 +1000132 .text
Al Viro9445aa12016-01-13 23:33:46 -0500133EXPORT_SYMBOL(__clear_user)
Anton Blanchard17968fb2012-05-27 19:54:03 +0000134#endif