treewide: Replace GPLv2 boilerplate/reference with SPDX - rule 151
[linux-2.6-block.git] / arch / powerpc / lib / mem_64.S
CommitLineData
70d64cea
PM
1/*
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>
9445aa1a 14#include <asm/export.h>
26deb043 15#include <asm/kasan.h>
70d64cea 16
26deb043 17#ifndef CONFIG_KASAN
694fc88c
NR
18_GLOBAL(__memset16)
19 rlwimi r4,r4,16,0,15
20 /* fall through */
21
22_GLOBAL(__memset32)
23 rldimi r4,r4,32,0
24 /* fall through */
25
26_GLOBAL(__memset64)
27 neg r0,r3
28 andi. r0,r0,7
29 cmplw cr1,r5,r0
30 b .Lms
31EXPORT_SYMBOL(__memset16)
32EXPORT_SYMBOL(__memset32)
33EXPORT_SYMBOL(__memset64)
26deb043 34#endif
694fc88c 35
26deb043 36_GLOBAL_KASAN(memset)
70d64cea
PM
37 neg r0,r3
38 rlwimi r4,r4,8,16,23
39 andi. r0,r0,7 /* # bytes to be 8-byte aligned */
40 rlwimi r4,r4,16,0,15
41 cmplw cr1,r5,r0 /* do we get that far? */
42 rldimi r4,r4,32,0
694fc88c 43.Lms: PPC_MTOCRF(1,r0)
70d64cea
PM
44 mr r6,r3
45 blt cr1,8f
be54c121 46 beq 3f /* if already 8-byte aligned */
70d64cea
PM
47 subf r5,r0,r5
48 bf 31,1f
49 stb r4,0(r6)
50 addi r6,r6,1
511: bf 30,2f
52 sth r4,0(r6)
53 addi r6,r6,2
542: bf 29,3f
55 stw r4,0(r6)
56 addi r6,r6,4
573: srdi. r0,r5,6
58 clrldi r5,r5,58
59 mtctr r0
60 beq 5f
12ab11a2 61 .balign 16
70d64cea
PM
624: std r4,0(r6)
63 std r4,8(r6)
64 std r4,16(r6)
65 std r4,24(r6)
66 std r4,32(r6)
67 std r4,40(r6)
68 std r4,48(r6)
69 std r4,56(r6)
70 addi r6,r6,64
71 bdnz 4b
725: srwi. r0,r5,3
73 clrlwi r5,r5,29
694caf02 74 PPC_MTOCRF(1,r0)
70d64cea
PM
75 beq 8f
76 bf 29,6f
77 std r4,0(r6)
78 std r4,8(r6)
79 std r4,16(r6)
80 std r4,24(r6)
81 addi r6,r6,32
826: bf 30,7f
83 std r4,0(r6)
84 std r4,8(r6)
85 addi r6,r6,16
867: bf 31,8f
87 std r4,0(r6)
88 addi r6,r6,8
898: cmpwi r5,0
694caf02 90 PPC_MTOCRF(1,r5)
be54c121 91 beqlr
70d64cea
PM
92 bf 29,9f
93 stw r4,0(r6)
94 addi r6,r6,4
959: bf 30,10f
96 sth r4,0(r6)
97 addi r6,r6,2
9810: bflr 31
99 stb r4,0(r6)
100 blr
9445aa1a 101EXPORT_SYMBOL(memset)
26deb043 102EXPORT_SYMBOL_KASAN(memset)
70d64cea 103
26deb043 104_GLOBAL_TOC_KASAN(memmove)
70d64cea 105 cmplw 0,r3,r4
b1576fec
AB
106 bgt backwards_memcpy
107 b memcpy
70d64cea
PM
108
109_GLOBAL(backwards_memcpy)
110 rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */
111 add r6,r3,r5
112 add r4,r4,r5
113 beq 2f
114 andi. r0,r6,3
115 mtctr r7
116 bne 5f
12ab11a2 117 .balign 16
70d64cea
PM
1181: lwz r7,-4(r4)
119 lwzu r8,-8(r4)
120 stw r7,-4(r6)
121 stwu r8,-8(r6)
122 bdnz 1b
123 andi. r5,r5,7
1242: cmplwi 0,r5,4
125 blt 3f
126 lwzu r0,-4(r4)
127 subi r5,r5,4
128 stwu r0,-4(r6)
1293: cmpwi 0,r5,0
130 beqlr
131 mtctr r5
1324: lbzu r0,-1(r4)
133 stbu r0,-1(r6)
134 bdnz 4b
135 blr
1365: mtctr r0
1376: lbzu r7,-1(r4)
138 stbu r7,-1(r6)
139 bdnz 6b
140 subf r5,r0,r5
141 rlwinm. r7,r5,32-3,3,31
142 beq 2b
143 mtctr r7
144 b 1b
9445aa1a 145EXPORT_SYMBOL(memmove)
26deb043 146EXPORT_SYMBOL_KASAN(memmove)