blob: 85fa9869aec5848d1c22c7b24e297cb51f1d4a9d [file] [log] [blame]
Paul Mackerras70d64ce2005-10-10 21:52:43 +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 */
11#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 Mackerras70d64ce2005-10-10 21:52:43 +100015
16_GLOBAL(memset)
17 neg r0,r3
18 rlwimi r4,r4,8,16,23
19 andi. r0,r0,7 /* # bytes to be 8-byte aligned */
20 rlwimi r4,r4,16,0,15
21 cmplw cr1,r5,r0 /* do we get that far? */
22 rldimi r4,r4,32,0
Anton Blanchard694caf02012-04-18 02:21:52 +000023 PPC_MTOCRF(1,r0)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100024 mr r6,r3
25 blt cr1,8f
26 beq+ 3f /* if already 8-byte aligned */
27 subf r5,r0,r5
28 bf 31,1f
29 stb r4,0(r6)
30 addi r6,r6,1
311: bf 30,2f
32 sth r4,0(r6)
33 addi r6,r6,2
342: bf 29,3f
35 stw r4,0(r6)
36 addi r6,r6,4
373: srdi. r0,r5,6
38 clrldi r5,r5,58
39 mtctr r0
40 beq 5f
Anton Blanchard12ab11a2016-08-04 16:53:22 +100041 .balign 16
Paul Mackerras70d64ce2005-10-10 21:52:43 +1000424: std r4,0(r6)
43 std r4,8(r6)
44 std r4,16(r6)
45 std r4,24(r6)
46 std r4,32(r6)
47 std r4,40(r6)
48 std r4,48(r6)
49 std r4,56(r6)
50 addi r6,r6,64
51 bdnz 4b
525: srwi. r0,r5,3
53 clrlwi r5,r5,29
Anton Blanchard694caf02012-04-18 02:21:52 +000054 PPC_MTOCRF(1,r0)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100055 beq 8f
56 bf 29,6f
57 std r4,0(r6)
58 std r4,8(r6)
59 std r4,16(r6)
60 std r4,24(r6)
61 addi r6,r6,32
626: bf 30,7f
63 std r4,0(r6)
64 std r4,8(r6)
65 addi r6,r6,16
667: bf 31,8f
67 std r4,0(r6)
68 addi r6,r6,8
698: cmpwi r5,0
Anton Blanchard694caf02012-04-18 02:21:52 +000070 PPC_MTOCRF(1,r5)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100071 beqlr+
72 bf 29,9f
73 stw r4,0(r6)
74 addi r6,r6,4
759: bf 30,10f
76 sth r4,0(r6)
77 addi r6,r6,2
7810: bflr 31
79 stb r4,0(r6)
80 blr
Al Viro9445aa12016-01-13 23:33:46 -050081EXPORT_SYMBOL(memset)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100082
Li Zhong6f5405b2014-07-21 17:55:13 +080083_GLOBAL_TOC(memmove)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100084 cmplw 0,r3,r4
Anton Blanchardb1576fe2014-02-04 16:04:35 +110085 bgt backwards_memcpy
86 b memcpy
Paul Mackerras70d64ce2005-10-10 21:52:43 +100087
88_GLOBAL(backwards_memcpy)
89 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
90 add r6,r3,r5
91 add r4,r4,r5
92 beq 2f
93 andi. r0,r6,3
94 mtctr r7
95 bne 5f
Anton Blanchard12ab11a2016-08-04 16:53:22 +100096 .balign 16
Paul Mackerras70d64ce2005-10-10 21:52:43 +1000971: lwz r7,-4(r4)
98 lwzu r8,-8(r4)
99 stw r7,-4(r6)
100 stwu r8,-8(r6)
101 bdnz 1b
102 andi. r5,r5,7
1032: cmplwi 0,r5,4
104 blt 3f
105 lwzu r0,-4(r4)
106 subi r5,r5,4
107 stwu r0,-4(r6)
1083: cmpwi 0,r5,0
109 beqlr
110 mtctr r5
1114: lbzu r0,-1(r4)
112 stbu r0,-1(r6)
113 bdnz 4b
114 blr
1155: mtctr r0
1166: lbzu r7,-1(r4)
117 stbu r7,-1(r6)
118 bdnz 6b
119 subf r5,r0,r5
120 rlwinm. r7,r5,32-3,3,31
121 beq 2b
122 mtctr r7
123 b 1b
Al Viro9445aa12016-01-13 23:33:46 -0500124EXPORT_SYMBOL(memmove)