xref: /linux/arch/sparc/lib/GENmemcpy.S (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2478b8fecSSam Ravnborg/* GENmemcpy.S: Generic sparc64 memcpy.
3478b8fecSSam Ravnborg *
4478b8fecSSam Ravnborg * Copyright (C) 2007 David S. Miller (davem@davemloft.net)
5478b8fecSSam Ravnborg */
6478b8fecSSam Ravnborg
7478b8fecSSam Ravnborg#ifdef __KERNEL__
8d0796b55SDavid S. Miller#include <linux/linkage.h>
9478b8fecSSam Ravnborg#define GLOBAL_SPARE	%g7
10478b8fecSSam Ravnborg#else
11478b8fecSSam Ravnborg#define GLOBAL_SPARE	%g5
12478b8fecSSam Ravnborg#endif
13478b8fecSSam Ravnborg
14478b8fecSSam Ravnborg#ifndef EX_LD
15d0796b55SDavid S. Miller#define EX_LD(x,y)	x
16478b8fecSSam Ravnborg#endif
17478b8fecSSam Ravnborg
18478b8fecSSam Ravnborg#ifndef EX_ST
19d0796b55SDavid S. Miller#define EX_ST(x,y)	x
20478b8fecSSam Ravnborg#endif
21478b8fecSSam Ravnborg
22478b8fecSSam Ravnborg#ifndef LOAD
23478b8fecSSam Ravnborg#define LOAD(type,addr,dest)	type [addr], dest
24478b8fecSSam Ravnborg#endif
25478b8fecSSam Ravnborg
26478b8fecSSam Ravnborg#ifndef STORE
27478b8fecSSam Ravnborg#define STORE(type,src,addr)	type src, [addr]
28478b8fecSSam Ravnborg#endif
29478b8fecSSam Ravnborg
30478b8fecSSam Ravnborg#ifndef FUNC_NAME
31478b8fecSSam Ravnborg#define FUNC_NAME	GENmemcpy
32478b8fecSSam Ravnborg#endif
33478b8fecSSam Ravnborg
34478b8fecSSam Ravnborg#ifndef PREAMBLE
35478b8fecSSam Ravnborg#define PREAMBLE
36478b8fecSSam Ravnborg#endif
37478b8fecSSam Ravnborg
38478b8fecSSam Ravnborg#ifndef XCC
39478b8fecSSam Ravnborg#define XCC xcc
40478b8fecSSam Ravnborg#endif
41478b8fecSSam Ravnborg
42478b8fecSSam Ravnborg	.register	%g2,#scratch
43478b8fecSSam Ravnborg	.register	%g3,#scratch
44478b8fecSSam Ravnborg
45478b8fecSSam Ravnborg	.text
46d0796b55SDavid S. Miller
47d0796b55SDavid S. Miller#ifndef EX_RETVAL
48d0796b55SDavid S. Miller#define EX_RETVAL(x)	x
49d0796b55SDavid S. MillerENTRY(GEN_retl_o4_1)
50d0796b55SDavid S. Miller	add	%o4, %o2, %o4
51d0796b55SDavid S. Miller	retl
52d0796b55SDavid S. Miller	 add	%o4, 1, %o0
53d0796b55SDavid S. MillerENDPROC(GEN_retl_o4_1)
54d0796b55SDavid S. MillerENTRY(GEN_retl_g1_8)
55d0796b55SDavid S. Miller	add	%g1, %o2, %g1
56d0796b55SDavid S. Miller	retl
57d0796b55SDavid S. Miller	 add	%g1, 8, %o0
58d0796b55SDavid S. MillerENDPROC(GEN_retl_g1_8)
59d0796b55SDavid S. MillerENTRY(GEN_retl_o2_4)
60d0796b55SDavid S. Miller	retl
61d0796b55SDavid S. Miller	 add	%o2, 4, %o0
62d0796b55SDavid S. MillerENDPROC(GEN_retl_o2_4)
63d0796b55SDavid S. MillerENTRY(GEN_retl_o2_1)
64d0796b55SDavid S. Miller	retl
65d0796b55SDavid S. Miller	 add	%o2, 1, %o0
66d0796b55SDavid S. MillerENDPROC(GEN_retl_o2_1)
67d0796b55SDavid S. Miller#endif
68d0796b55SDavid S. Miller
69478b8fecSSam Ravnborg	.align		64
70478b8fecSSam Ravnborg
71478b8fecSSam Ravnborg	.globl	FUNC_NAME
72478b8fecSSam Ravnborg	.type	FUNC_NAME,#function
73478b8fecSSam RavnborgFUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */
74478b8fecSSam Ravnborg	srlx		%o2, 31, %g2
75478b8fecSSam Ravnborg	cmp		%g2, 0
76478b8fecSSam Ravnborg	tne		%XCC, 5
77478b8fecSSam Ravnborg	PREAMBLE
78478b8fecSSam Ravnborg	mov		%o0, GLOBAL_SPARE
79478b8fecSSam Ravnborg
80478b8fecSSam Ravnborg	cmp		%o2, 0
81478b8fecSSam Ravnborg	be,pn		%XCC, 85f
82478b8fecSSam Ravnborg	 or		%o0, %o1, %o3
83478b8fecSSam Ravnborg	cmp		%o2, 16
84478b8fecSSam Ravnborg	blu,a,pn	%XCC, 80f
85478b8fecSSam Ravnborg	 or		%o3, %o2, %o3
86478b8fecSSam Ravnborg
87478b8fecSSam Ravnborg	xor		%o0, %o1, %o4
88478b8fecSSam Ravnborg	andcc		%o4, 0x7, %g0
89478b8fecSSam Ravnborg	bne,a,pn	%XCC, 90f
90478b8fecSSam Ravnborg	 sub		%o0, %o1, %o3
91478b8fecSSam Ravnborg
92478b8fecSSam Ravnborg	and		%o0, 0x7, %o4
93478b8fecSSam Ravnborg	sub		%o4, 0x8, %o4
94478b8fecSSam Ravnborg	sub		%g0, %o4, %o4
95478b8fecSSam Ravnborg	sub		%o2, %o4, %o2
96478b8fecSSam Ravnborg1:	subcc		%o4, 1, %o4
97d0796b55SDavid S. Miller	EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1)
98d0796b55SDavid S. Miller	EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1)
99478b8fecSSam Ravnborg	add		%o1, 1, %o1
100478b8fecSSam Ravnborg	bne,pt		%XCC, 1b
101478b8fecSSam Ravnborg	add		%o0, 1, %o0
102478b8fecSSam Ravnborg
103478b8fecSSam Ravnborg	andn		%o2, 0x7, %g1
104478b8fecSSam Ravnborg	sub		%o2, %g1, %o2
105478b8fecSSam Ravnborg1:	subcc		%g1, 0x8, %g1
106d0796b55SDavid S. Miller	EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8)
107d0796b55SDavid S. Miller	EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8)
108478b8fecSSam Ravnborg	add		%o1, 0x8, %o1
109478b8fecSSam Ravnborg	bne,pt		%XCC, 1b
110478b8fecSSam Ravnborg	 add		%o0, 0x8, %o0
111478b8fecSSam Ravnborg
112478b8fecSSam Ravnborg	brz,pt		%o2, 85f
113478b8fecSSam Ravnborg	 sub		%o0, %o1, %o3
114478b8fecSSam Ravnborg	ba,a,pt		%XCC, 90f
115478b8fecSSam Ravnborg
116478b8fecSSam Ravnborg	.align		64
117478b8fecSSam Ravnborg80: /* 0 < len <= 16 */
118478b8fecSSam Ravnborg	andcc		%o3, 0x3, %g0
119478b8fecSSam Ravnborg	bne,pn		%XCC, 90f
120478b8fecSSam Ravnborg	 sub		%o0, %o1, %o3
121478b8fecSSam Ravnborg
122478b8fecSSam Ravnborg1:
123478b8fecSSam Ravnborg	subcc		%o2, 4, %o2
124d0796b55SDavid S. Miller	EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4)
125d0796b55SDavid S. Miller	EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4)
126478b8fecSSam Ravnborg	bgu,pt		%XCC, 1b
127478b8fecSSam Ravnborg	 add		%o1, 4, %o1
128478b8fecSSam Ravnborg
129478b8fecSSam Ravnborg85:	retl
130478b8fecSSam Ravnborg	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
131478b8fecSSam Ravnborg
132478b8fecSSam Ravnborg	.align		32
133478b8fecSSam Ravnborg90:
134478b8fecSSam Ravnborg	subcc		%o2, 1, %o2
135d0796b55SDavid S. Miller	EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1)
136d0796b55SDavid S. Miller	EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1)
137478b8fecSSam Ravnborg	bgu,pt		%XCC, 90b
138478b8fecSSam Ravnborg	 add		%o1, 1, %o1
139478b8fecSSam Ravnborg	retl
140478b8fecSSam Ravnborg	 mov		EX_RETVAL(GLOBAL_SPARE), %o0
141478b8fecSSam Ravnborg
142478b8fecSSam Ravnborg	.size		FUNC_NAME, .-FUNC_NAME
143