blob: eda7a96161ab6f494e6403cc6fa5cc2da89cd4c9 [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>
14
15_GLOBAL(memset)
16 neg r0,r3
17 rlwimi r4,r4,8,16,23
18 andi. r0,r0,7 /* # bytes to be 8-byte aligned */
19 rlwimi r4,r4,16,0,15
20 cmplw cr1,r5,r0 /* do we get that far? */
21 rldimi r4,r4,32,0
Anton Blanchard694caf02012-04-18 02:21:52 +000022 PPC_MTOCRF(1,r0)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100023 mr r6,r3
24 blt cr1,8f
25 beq+ 3f /* if already 8-byte aligned */
26 subf r5,r0,r5
27 bf 31,1f
28 stb r4,0(r6)
29 addi r6,r6,1
301: bf 30,2f
31 sth r4,0(r6)
32 addi r6,r6,2
332: bf 29,3f
34 stw r4,0(r6)
35 addi r6,r6,4
363: srdi. r0,r5,6
37 clrldi r5,r5,58
38 mtctr r0
39 beq 5f
Anton Blanchard12ab11a2016-08-04 16:53:22 +100040 .balign 16
Paul Mackerras70d64ce2005-10-10 21:52:43 +1000414: std r4,0(r6)
42 std r4,8(r6)
43 std r4,16(r6)
44 std r4,24(r6)
45 std r4,32(r6)
46 std r4,40(r6)
47 std r4,48(r6)
48 std r4,56(r6)
49 addi r6,r6,64
50 bdnz 4b
515: srwi. r0,r5,3
52 clrlwi r5,r5,29
Anton Blanchard694caf02012-04-18 02:21:52 +000053 PPC_MTOCRF(1,r0)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100054 beq 8f
55 bf 29,6f
56 std r4,0(r6)
57 std r4,8(r6)
58 std r4,16(r6)
59 std r4,24(r6)
60 addi r6,r6,32
616: bf 30,7f
62 std r4,0(r6)
63 std r4,8(r6)
64 addi r6,r6,16
657: bf 31,8f
66 std r4,0(r6)
67 addi r6,r6,8
688: cmpwi r5,0
Anton Blanchard694caf02012-04-18 02:21:52 +000069 PPC_MTOCRF(1,r5)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100070 beqlr+
71 bf 29,9f
72 stw r4,0(r6)
73 addi r6,r6,4
749: bf 30,10f
75 sth r4,0(r6)
76 addi r6,r6,2
7710: bflr 31
78 stb r4,0(r6)
79 blr
80
Li Zhong6f5405b2014-07-21 17:55:13 +080081_GLOBAL_TOC(memmove)
Paul Mackerras70d64ce2005-10-10 21:52:43 +100082 cmplw 0,r3,r4
Anton Blanchardb1576fe2014-02-04 16:04:35 +110083 bgt backwards_memcpy
84 b memcpy
Paul Mackerras70d64ce2005-10-10 21:52:43 +100085
86_GLOBAL(backwards_memcpy)
87 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
88 add r6,r3,r5
89 add r4,r4,r5
90 beq 2f
91 andi. r0,r6,3
92 mtctr r7
93 bne 5f
Anton Blanchard12ab11a2016-08-04 16:53:22 +100094 .balign 16
Paul Mackerras70d64ce2005-10-10 21:52:43 +1000951: lwz r7,-4(r4)
96 lwzu r8,-8(r4)
97 stw r7,-4(r6)
98 stwu r8,-8(r6)
99 bdnz 1b
100 andi. r5,r5,7
1012: cmplwi 0,r5,4
102 blt 3f
103 lwzu r0,-4(r4)
104 subi r5,r5,4
105 stwu r0,-4(r6)
1063: cmpwi 0,r5,0
107 beqlr
108 mtctr r5
1094: lbzu r0,-1(r4)
110 stbu r0,-1(r6)
111 bdnz 4b
112 blr
1135: mtctr r0
1146: lbzu r7,-1(r4)
115 stbu r7,-1(r6)
116 bdnz 6b
117 subf r5,r0,r5
118 rlwinm. r7,r5,32-3,3,31
119 beq 2b
120 mtctr r7
121 b 1b