treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 152
[linux-2.6-block.git] / arch / powerpc / lib / mem_64.S
CommitLineData
2874c5fd 1/* SPDX-License-Identifier: GPL-2.0-or-later */
70d64cea
PM
2/*
3 * String handling functions for PowerPC.
4 *
5 * Copyright (C) 1996 Paul Mackerras.
70d64cea
PM
6 */
7#include <asm/processor.h>
8#include <asm/errno.h>
9#include <asm/ppc_asm.h>
9445aa1a 10#include <asm/export.h>
26deb043 11#include <asm/kasan.h>
70d64cea 12
26deb043 13#ifndef CONFIG_KASAN
694fc88c
NR
14_GLOBAL(__memset16)
15 rlwimi r4,r4,16,0,15
16 /* fall through */
17
18_GLOBAL(__memset32)
19 rldimi r4,r4,32,0
20 /* fall through */
21
22_GLOBAL(__memset64)
23 neg r0,r3
24 andi. r0,r0,7
25 cmplw cr1,r5,r0
26 b .Lms
27EXPORT_SYMBOL(__memset16)
28EXPORT_SYMBOL(__memset32)
29EXPORT_SYMBOL(__memset64)
26deb043 30#endif
694fc88c 31
26deb043 32_GLOBAL_KASAN(memset)
70d64cea
PM
33 neg r0,r3
34 rlwimi r4,r4,8,16,23
35 andi. r0,r0,7 /* # bytes to be 8-byte aligned */
36 rlwimi r4,r4,16,0,15
37 cmplw cr1,r5,r0 /* do we get that far? */
38 rldimi r4,r4,32,0
694fc88c 39.Lms: PPC_MTOCRF(1,r0)
70d64cea
PM
40 mr r6,r3
41 blt cr1,8f
be54c121 42 beq 3f /* if already 8-byte aligned */
70d64cea
PM
43 subf r5,r0,r5
44 bf 31,1f
45 stb r4,0(r6)
46 addi r6,r6,1
471: bf 30,2f
48 sth r4,0(r6)
49 addi r6,r6,2
502: bf 29,3f
51 stw r4,0(r6)
52 addi r6,r6,4
533: srdi. r0,r5,6
54 clrldi r5,r5,58
55 mtctr r0
56 beq 5f
12ab11a2 57 .balign 16
70d64cea
PM
584: std r4,0(r6)
59 std r4,8(r6)
60 std r4,16(r6)
61 std r4,24(r6)
62 std r4,32(r6)
63 std r4,40(r6)
64 std r4,48(r6)
65 std r4,56(r6)
66 addi r6,r6,64
67 bdnz 4b
685: srwi. r0,r5,3
69 clrlwi r5,r5,29
694caf02 70 PPC_MTOCRF(1,r0)
70d64cea
PM
71 beq 8f
72 bf 29,6f
73 std r4,0(r6)
74 std r4,8(r6)
75 std r4,16(r6)
76 std r4,24(r6)
77 addi r6,r6,32
786: bf 30,7f
79 std r4,0(r6)
80 std r4,8(r6)
81 addi r6,r6,16
827: bf 31,8f
83 std r4,0(r6)
84 addi r6,r6,8
858: cmpwi r5,0
694caf02 86 PPC_MTOCRF(1,r5)
be54c121 87 beqlr
70d64cea
PM
88 bf 29,9f
89 stw r4,0(r6)
90 addi r6,r6,4
919: bf 30,10f
92 sth r4,0(r6)
93 addi r6,r6,2
9410: bflr 31
95 stb r4,0(r6)
96 blr
9445aa1a 97EXPORT_SYMBOL(memset)
26deb043 98EXPORT_SYMBOL_KASAN(memset)
70d64cea 99
26deb043 100_GLOBAL_TOC_KASAN(memmove)
70d64cea 101 cmplw 0,r3,r4
b1576fec
AB
102 bgt backwards_memcpy
103 b memcpy
70d64cea
PM
104
105_GLOBAL(backwards_memcpy)
106 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
107 add r6,r3,r5
108 add r4,r4,r5
109 beq 2f
110 andi. r0,r6,3
111 mtctr r7
112 bne 5f
12ab11a2 113 .balign 16
70d64cea
PM
1141: lwz r7,-4(r4)
115 lwzu r8,-8(r4)
116 stw r7,-4(r6)
117 stwu r8,-8(r6)
118 bdnz 1b
119 andi. r5,r5,7
1202: cmplwi 0,r5,4
121 blt 3f
122 lwzu r0,-4(r4)
123 subi r5,r5,4
124 stwu r0,-4(r6)
1253: cmpwi 0,r5,0
126 beqlr
127 mtctr r5
1284: lbzu r0,-1(r4)
129 stbu r0,-1(r6)
130 bdnz 4b
131 blr
1325: mtctr r0
1336: lbzu r7,-1(r4)
134 stbu r7,-1(r6)
135 bdnz 6b
136 subf r5,r0,r5
137 rlwinm. r7,r5,32-3,3,31
138 beq 2b
139 mtctr r7
140 b 1b
9445aa1a 141EXPORT_SYMBOL(memmove)
26deb043 142EXPORT_SYMBOL_KASAN(memmove)